From 6df80c3396869b7a006c6e2cb1a66096a5c14780 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 7 Nov 2023 17:43:22 +0000 Subject: [PATCH 01/66] extended the geometry transport to cover curved edge and faces case --- .../geometry_transport/packed_geom_2d.hpp | 78 ++++++++++++++----- .../particle_mesh_interface.hpp | 5 -- test/CMakeLists.txt | 1 + 3 files changed, 61 insertions(+), 23 deletions(-) diff --git a/include/nektar_interface/geometry_transport/packed_geom_2d.hpp b/include/nektar_interface/geometry_transport/packed_geom_2d.hpp index 8a299026..8a6d09fe 100644 --- a/include/nektar_interface/geometry_transport/packed_geom_2d.hpp +++ b/include/nektar_interface/geometry_transport/packed_geom_2d.hpp @@ -89,6 +89,31 @@ class PackedGeom2D { push(&id); push(&num_edges); + auto lambda_pack_curve = [&](const auto curve) { + GeomPackSpec gs; + if (curve == nullptr) { + gs.a = 0; + gs.b = 0; + gs.n_points = -1; + } else { + gs.a = curve->m_curveID; + gs.b = static_cast(curve->m_ptype); + gs.n_points = curve->m_points.size(); + } + push(&gs); + if (curve != nullptr) { + const int n_points = curve->m_points.size(); + for (int pointx = 0; pointx < n_points; pointx++) { + auto point = curve->m_points.at(pointx); + PointStruct ps; + ps.coordim = point->GetCoordim(); + ps.vid = point->GetVid(); + point->GetCoords(ps.x, ps.y, ps.z); + push(&ps); + } + } + }; + GeomPackSpec gs; PointStruct ps; @@ -112,22 +137,13 @@ class PackedGeom2D { // curve of the edge auto curve = seg_geom->GetCurve(); - ASSERTL0(curve == nullptr, "Not implemented for curved edges"); // A curve with n_points = -1 will be a taken as non-existant. - gs.a = 0; - gs.b = 0; - gs.n_points = -1; - push(&gs); + lambda_pack_curve(curve); } // curve of geom auto curve = geom.GetCurve(); - ASSERTL0(curve == nullptr, "Not implemented for curved edges"); - // A curve with n_points = -1 will be a taken as non-existant. - gs.a = 0; - gs.b = 0; - gs.n_points = -1; - push(&gs); + lambda_pack_curve(curve); }; // Unpack the data common to both Quads and Triangles. @@ -145,8 +161,33 @@ class PackedGeom2D { ASSERTL0((num_edges == 4) || (num_edges == 3), "Bad number of edges expected 4 or 3"); - GeomPackSpec gs; + // helper lambda to unpack a curve + auto lambda_unpack_curve = + [&](const auto gs) -> SpatialDomains::CurveSharedPtr { + if (gs.n_points < 0) { + return SpatialDomains::CurveSharedPtr(); + } + const int m_curveID = gs.a; + const int m_ptype_int = gs.b; + const LibUtilities::PointsType m_ptype = + static_cast(m_ptype_int); + + const int n_points = gs.n_points; + std::vector m_points; + m_points.reserve(n_points); + for (int pointx = 0; pointx < n_points; pointx++) { + PointStruct ps; + pop(&ps); + m_points.push_back(std::make_shared( + ps.coordim, ps.vid, ps.x, ps.y, ps.z)); + } + auto curve = std::make_shared(m_curveID, m_ptype); + curve->m_points = m_points; + return curve; + }; + PointStruct ps; + GeomPackSpec gs; edges.reserve(num_edges); vertices.reserve(num_edges * 2); @@ -167,20 +208,19 @@ class PackedGeom2D { ps.coordim, ps.vid, ps.x, ps.y, ps.z)); } - // In future the edge might have a corresponding curve pop(&gs); - ASSERTL0(gs.n_points == -1, "unpacking routine did not expect a curve"); + auto curve = lambda_unpack_curve(gs); // actually construct the edge auto edge_tmp = std::make_shared( - edge_id, edge_coordim, vertices.data() + points_offset); + edge_id, edge_coordim, vertices.data() + points_offset, curve); // edge_tmp->Setup(); edges.push_back(edge_tmp); } - // In future the geom might have a curve + // Unpack the curve for the geom if it exists. pop(&gs); - ASSERTL0(gs.n_points == -1, "unpacking routine did not expect a curve"); + this->curve = lambda_unpack_curve(gs); } /* @@ -202,6 +242,7 @@ class PackedGeom2D { std::vector edges; std::vector vertices; + SpatialDomains::CurveSharedPtr curve; public: std::vector buf; @@ -237,7 +278,8 @@ class PackedGeom2D { */ template std::shared_ptr> unpack() { unpack_general(); - std::shared_ptr geom = std::make_shared(this->id, this->edges.data()); + std::shared_ptr geom = + std::make_shared(this->id, this->edges.data(), this->curve); geom->GetGeomFactors(); geom->Setup(); auto remote_geom = std::make_shared>(rank, local_id, geom); diff --git a/include/nektar_interface/particle_mesh_interface.hpp b/include/nektar_interface/particle_mesh_interface.hpp index 00a02772..f9a1d602 100644 --- a/include/nektar_interface/particle_mesh_interface.hpp +++ b/include/nektar_interface/particle_mesh_interface.hpp @@ -858,11 +858,6 @@ class ParticleMeshInterface : public HMesh { MPICHK(MPI_Comm_rank(this->comm, &this->comm_rank)); MPICHK(MPI_Comm_size(this->comm, &this->comm_size)); - NESOASSERT(graph->GetCurvedEdges().size() == 0, - "Curved edge found in graph."); - NESOASSERT(graph->GetCurvedFaces().size() == 0, - "Curved face found in graph."); - auto triangles = graph->GetAllTriGeoms(); auto quads = graph->GetAllQuadGeoms(); std::map> geoms_2d; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cb4b2b70..c0214a64 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -46,6 +46,7 @@ set(UNIT_SRC_FILES ${UNIT_SRC}/nektar_interface/test_particle_function_projection_3d.cpp ${UNIT_SRC}/nektar_interface/test_particle_geometry_interface.cpp ${UNIT_SRC}/nektar_interface/test_particle_geometry_interface_3d.cpp + ${UNIT_SRC}/nektar_interface/test_particle_geometry_interface_3d_curved.cpp ${UNIT_SRC}/nektar_interface/test_basis_evaluation.cpp ${UNIT_SRC}/nektar_interface/test_kernel_basis_evaluation.cpp ${UNIT_SRC}/nektar_interface/test_particle_mapping.cpp From 6ad1a54d5c0c4efb58ffaaadb82190c5f03bd86e Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 20 Nov 2023 16:03:29 +0000 Subject: [PATCH 02/66] reimplementation of Bary interpolation in 2D and 3D plus 2D and 3D tests --- CMakeLists.txt | 1 + NESO-Spack | 2 +- .../bary_interpolation/bary_evaluation.hpp | 216 ++++++++++++++++++ .../function_bary_evaluation.hpp | 183 +-------------- .../test_particle_function_evaluation.cpp | 118 ++++++++++ .../test_particle_function_evaluation_3d.cpp | 158 +++++++++++++ ..._particle_geometry_interface_3d_curved.cpp | 166 ++++++++++++++ 7 files changed, 664 insertions(+), 180 deletions(-) create mode 100644 include/nektar_interface/bary_interpolation/bary_evaluation.hpp create mode 100644 test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 08590c64..c8f794be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -133,6 +133,7 @@ set(HEADER_FILES ${INC_DIR}/mesh.hpp ${INC_DIR}/nektar_interface/basis_evaluation.hpp ${INC_DIR}/nektar_interface/basis_reference.hpp + ${INC_DIR}/nektar_interface/bary_interpolation/bary_evaluation.hpp ${INC_DIR}/nektar_interface/bounding_box_intersection.hpp ${INC_DIR}/nektar_interface/cell_id_translation.hpp ${INC_DIR}/nektar_interface/coordinate_mapping.hpp diff --git a/NESO-Spack b/NESO-Spack index aacfb840..eb2fab80 160000 --- a/NESO-Spack +++ b/NESO-Spack @@ -1 +1 @@ -Subproject commit aacfb840ac310815a123d4ea385f9e672b26f601 +Subproject commit eb2fab80b23fbf1b55d84169a1f3a528203406f2 diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp new file mode 100644 index 00000000..69ecb643 --- /dev/null +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -0,0 +1,216 @@ +#ifndef __BARY_EVALUATION_H__ +#define __BARY_EVALUATION_H__ + +#include +using namespace NESO::Particles; + +namespace NESO::Bary { + +/** + * For quadrature point r_i with weight bw_i compute bw_i / (r - r_i). + * + * @param num_phys The number of quadrature points for the element and + * dimension for which this computation is performed. + * @param[in] coord The evauation point in the dimension of interest. + * @param[in] z_values A length num_phys array containing the quadrature + * points. + * @param[in] z_values A length num_phys array containing the quadrature + * weights. + * @param[in, out] div_values Array of length num_phys which will be + * populated with the bw_i/(r - r_i) values. + */ +inline void preprocess_weights(const int num_phys, const REAL coord, + const REAL *const z_values, + const REAL *const bw_values, REAL *div_values) { + for (int ix = 0; ix < num_phys; ix++) { + div_values[ix] = 0.0; + } + for (int ix = 0; ix < num_phys; ix++) { + const auto xdiff = z_values[ix] - coord; + if (xdiff == 0.0) { + div_values[ix] = 1.0; + return; + } + } + REAL denom = 0.0; + for (int ix = 0; ix < num_phys; ix++) { + const auto xdiff = z_values[ix] - coord; + const auto bw_over_diff = bw_values[ix] / xdiff; + div_values[ix] = bw_over_diff; + denom += bw_over_diff; + } + const REAL factor = 1.0 / denom; + for (int ix = 0; ix < num_phys; ix++) { + div_values[ix] *= factor; + } +} + +/** + * Perform Bary interpolation in the first dimension. This function is + * intended to be called from a function that performs Bary interpolation + * over the second dimension and first dimension. + * + * @param num_phys Number of quadrature points. + * @param physvals Vector of length num_phys plus padding to multiple of the + * vector length which contains the quadrature point values. + * @returns Contribution to Bary interpolation from a dimension 0 evaluation. + */ +inline REAL compute_dir_0(const int num_phys, const REAL *const physvals, + const REAL *const div_space) { + REAL numer = 0.0; + for (int ix = 0; ix < num_phys; ix++) { + const REAL pval = physvals[ix]; + const REAL tmp = div_space[ix]; + numer += tmp * pval; + } + const REAL eval0 = numer; + return eval0; + //} +} + +/** + * Computes Bary interpolation over two dimensions. The inner dimension is + * computed with calls to compute_dir_0. + * + * @param num_phys0 Number of quadrature points in dimension 0. + * @param num_phys1 Number of quadrature points in dimension 1. + * @param physvals Array of function values at quadrature points. + * @param div_space0 The output of preprocess_weights applied to dimension 0. + * @param div_space1 The output of preprocess_weights applied to dimension 1. + * @returns Bary evaluation of a function at a coordinate. + */ +inline REAL compute_dir_10(const int num_phys0, const int num_phys1, + const REAL *const physvals, + const REAL *const div_space0, + const REAL *const div_space1) { + + REAL numer = 0.0; + for (int i1 = 0; i1 < num_phys1; i1++) { + REAL pval = 0.0; + for (int i0 = 0; i0 < num_phys0; i0++) { + pval += physvals[i1 * num_phys0 + i0] * div_space0[i0]; + } + const REAL tmp = div_space1[i1]; + numer += tmp * pval; + } + return numer; +} + +/** + * Computes Bary interpolation over three dimensions. The inner dimensions are + * computed with calls to compute_dir_10. + * + * @param num_phys0 Number of quadrature points in dimension 0. + * @param num_phys1 Number of quadrature points in dimension 1. + * @param num_phys2 Number of quadrature points in dimension 2. + * @param physvals Array of function values at quadrature points. + * @param div_space0 The output of preprocess_weights applied to dimension 0. + * @param div_space1 The output of preprocess_weights applied to dimension 1. + * @param div_space2 The output of preprocess_weights applied to dimension 2. + * @returns Bary evaluation of a function at a coordinate. + */ +inline REAL compute_dir_210(const int num_phys0, const int num_phys1, + const int num_phys2, const REAL *const physvals, + const REAL *const div_space0, + const REAL *const div_space1, + const REAL *const div_space2) { + + const int stride = num_phys0 * num_phys1; + REAL pval2 = 0.0; + for (int i2 = 0; i2 < num_phys2; i2++) { + REAL pval1 = 0.0; + for (int i1 = 0; i1 < num_phys1; i1++) { + REAL pval0 = 0.0; + for (int i0 = 0; i0 < num_phys0; i0++) { + pval0 += physvals[i2 * stride + i1 * num_phys0 + i0] * div_space0[i0]; + } + pval1 += div_space1[i1] * pval0; + } + pval2 += div_space2[i2] * pval1; + } + return pval2; +} + +/** + * Compute a function evaluation at a point using the passed quadrature point + * values, quadrature points and weights. + * + * @param coord0 Evaluation coordinate, x component. + * @param coord1 Evaluation coordinate, y component. + * @param num_phys0 Number of quadrature points in the x direction. + * @param num_phys1 Number of quadrature points in the y direction. + * @param physvals Function evaluations at quadrature points, x runs fastest + * and y slowest. + * @param div_space Space of size num_phys0 + num_phys1 + num_phys2 to use as + * temporary space. + * @param z0 Quadrature points in x direction. + * @param z1 Quadrature points in y direction. + * @param bw0 Weights for each quadrature point in x direction. + * @param bw1 Weights for each quadrature point in y direction. + * @returns Evaluation at passed point using Bary interpolation. + * */ +inline REAL evaluate_2d(const REAL coord0, const REAL coord1, + const int num_phys0, const int num_phys1, + const REAL *const physvals, REAL *div_space, + const REAL *const z0, const REAL *const z1, + const REAL *const bw0, const REAL *const bw1) { + + REAL *div_space0 = div_space; + REAL *div_space1 = div_space0 + num_phys0; + + preprocess_weights(num_phys0, coord0, z0, bw0, div_space0); + preprocess_weights(num_phys1, coord1, z1, bw1, div_space1); + + REAL eval = + compute_dir_10(num_phys0, num_phys1, physvals, div_space0, div_space1); + + return eval; +} + +/** + * Compute a function evaluation at a point using the passed quadrature point + * values, quadrature points and weights. + * + * @param coord0 Evaluation coordinate, x component. + * @param coord1 Evaluation coordinate, y component. + * @param coord2 Evaluation coordinate, z component. + * @param num_phys0 Number of quadrature points in the x direction. + * @param num_phys1 Number of quadrature points in the y direction. + * @param num_phys2 Number of quadrature points in the z direction. + * @param physvals Function evaluations at quadrature points, x runs fastest + * and z slowest. + * @param div_space Space of size num_phys0 + num_phys1 + num_phys2 to use as + * temporary space. + * @param z0 Quadrature points in x direction. + * @param z1 Quadrature points in y direction. + * @param z2 Quadrature points in z direction. + * @param bw0 Weights for each quadrature point in x direction. + * @param bw1 Weights for each quadrature point in y direction. + * @param bw2 Weights for each quadrature point in z direction. + * @returns Evaluation at passed point using Bary interpolation. + */ +inline REAL evaluate_3d(const REAL coord0, const REAL coord1, const REAL coord2, + const int num_phys0, const int num_phys1, + const int num_phys2, const REAL *const physvals, + REAL *div_space, const REAL *const z0, + const REAL *const z1, const REAL *const z2, + const REAL *const bw0, const REAL *const bw1, + const REAL *const bw2) { + + REAL *div_space0 = div_space; + REAL *div_space1 = div_space0 + num_phys0; + REAL *div_space2 = div_space1 + num_phys1; + + preprocess_weights(num_phys0, coord0, z0, bw0, div_space0); + preprocess_weights(num_phys1, coord1, z1, bw1, div_space1); + preprocess_weights(num_phys2, coord2, z2, bw2, div_space2); + + const REAL eval = compute_dir_210(num_phys0, num_phys1, num_phys2, physvals, + div_space0, div_space1, div_space2); + + return eval; +} + +} // namespace NESO::Bary + +#endif diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 97737fc0..b426c090 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -10,6 +10,7 @@ #include #include +#include "bary_interpolation/bary_evaluation.hpp" #include "expansion_looping/geom_to_expansion_builder.hpp" #include "geometry_transport/shape_mapping.hpp" #include "utility_sycl.hpp" @@ -20,172 +21,6 @@ using namespace Nektar::StdRegions; namespace NESO { -namespace Bary { - -/** - * The purpose of these methods is to precompute as much of the Bary - * interpolation algorithm for each coordinate dimension as possible (where - * the cost is O(p)) to minimise the computational work in the O(p^2) double - * loop. - */ -struct Evaluate { - - /** - * For quadrature point r_i with weight bw_i compute bw_i / (r - r_i). - * - * @param[in] stride_base Length of output vector used for temporary storage, - * i.e. the maximum number of quadrature points across all elements plus any - * padding. - * @param num_phys The number of quadrature points for the element and - * dimension for which this computation is performed. - * @param[in] coord The evauation point in the dimension of interest. - * @param[in] z_values A length num_phys array containing the quadrature - * points. - * @param[in] z_values A length num_phys array containing the quadrature - * weights. - * @param[in, out] exact_index If the input coordinate lie exactly on a - * quadrature point then this pointer will be set to the index of that - * quadrature point. Otherwise this memory is untouched. - * @param[in, out] div_values Array of length stride_base which will be - * populated with the bw_i/(r - r_i) values. Entries in the range num_phys to - * stride_base-1 will be zeroed. - */ - static inline void preprocess_weights(const int stride_base, - const int num_phys, const REAL coord, - const REAL *const z_values, - const REAL *const bw_values, - int *exact_index, REAL *div_values) { - const sycl::vec coord_vec{coord}; - - sycl::global_ptr z_ptr{z_values}; - sycl::global_ptr bw_ptr{bw_values}; - sycl::local_ptr div_ptr{div_values}; - - for (int ix = 0; ix * NESO_VECTOR_LENGTH < num_phys; ix++) { - sycl::vec z_vec{}; - z_vec.load(ix, z_ptr); - sycl::vec bw_vec{}; - bw_vec.load(ix, bw_ptr); - const auto xdiff_vec = z_vec - coord_vec; - const auto bw_over_diff = bw_vec / xdiff_vec; - bw_over_diff.store(ix, div_ptr); - - const int max_index = (((ix + 1) * NESO_VECTOR_LENGTH) <= num_phys) - ? ((ix + 1) * NESO_VECTOR_LENGTH) - : num_phys; - - for (int jx = ix * NESO_VECTOR_LENGTH; jx < max_index; jx++) { - if (xdiff_vec[jx % NESO_VECTOR_LENGTH] == 0.0) { - *exact_index = jx; - } - } - } - - // zero the extra padding values so they do not contribute later - // If they contributed a NaN all results would be NaN. - for (int cx = num_phys; cx < stride_base; cx++) { - div_values[cx] = 0.0; - } - }; - - /** - * In each dimension of the Bary interpolation the sum of the weights over - * distances can be precomputed. - * - * @param num_phys Number of quadrature points. - * @param div_space Values to sum. - * @returns Sum of the first num_phys values of div_space. - */ - static inline REAL preprocess_denominator(const int num_phys, - const REAL *const div_space) { - REAL denom = 0.0; - for (int ix = 0; ix < num_phys; ix++) { - const REAL tmp = div_space[ix]; - denom += tmp; - } - return denom; - }; - - /** - * Perform Bary interpolation in the first dimension. This function is - * intended to be called from a function that performs Bary interpolation - * over the second dimension and first dimension. - * - * @param num_phys Number of quadrature points. - * @param physvals Vector of length num_phys plus padding to multiple of the - * vector length which contains the quadrature point values. Padding should - * contain finite values. - * @param exact_i If exact_i is non-negative then exact_i then it is assumed - * that the evaluation point is exactly the quadrature point exact_i. - * @param denom Sum over Bary weights divided by differences, see - * preprocess_denominator. - * @returns Contribution to Bary interpolation from a dimension 0 evaluation. - */ - static inline REAL compute_dir_0(const int num_phys, - const REAL *const physvals, - const REAL *const div_space, - const int exact_i, const REAL denom) { - if ((exact_i > -1) && (exact_i < num_phys)) { - const REAL exact_quadrature_val = physvals[exact_i]; - return exact_quadrature_val; - } else { - REAL numer = 0.0; - - for (int ix = 0; ix < num_phys; ix++) { - const REAL pval = physvals[ix]; - const REAL tmp = div_space[ix]; - numer += tmp * pval; - } - - const REAL eval0 = numer / denom; - return eval0; - } - }; - - /** - * Computes Bary interpolation over two dimensions. The inner dimension is - * computed with calls to compute_dir_0. - * - * @param num_phys0 Number of quadrature points in dimension 0. - * @param num_phys1 Number of quadrature points in dimension 1. - * @param physvals Array of function values at quadrature points. - * @param div_space0 The output of preprocess_weights applied to dimension 0. - * @param div_space1 The output of preprocess_weights applied to dimension 1. - * @param exact_i0 Non-negative value indicates that the coordinate lies on - * quadrature point exact_i0 in dimension 0. - * @param exact_i1 Non-negative value indicates that the coordinate lies on - * quadrature point exact_i1 in dimension 1. - * @returns Bary evaluation of a function at a coordinate. - */ - static inline REAL compute_dir_10(const int num_phys0, const int num_phys1, - const REAL *const physvals, - const REAL *const div_space0, - const REAL *const div_space1, - const int exact_i0, const int exact_i1) { - const REAL denom0 = - Bary::Evaluate::preprocess_denominator(num_phys0, div_space0); - if ((exact_i1 > -1) && (exact_i1 < num_phys1)) { - const REAL bary_eval_0 = Bary::Evaluate::compute_dir_0( - num_phys0, &physvals[exact_i1 * num_phys0], div_space0, exact_i0, - denom0); - return bary_eval_0; - } else { - REAL numer = 0.0; - REAL denom = 0.0; - for (int ix = 0; ix < num_phys1; ix++) { - const REAL pval = Bary::Evaluate::compute_dir_0( - num_phys0, &physvals[ix * num_phys0], div_space0, exact_i0, denom0); - const REAL tmp = div_space1[ix]; - numer += tmp * pval; - denom += tmp; - } - const REAL eval1 = numer / denom; - return eval1; - } - }; -}; -} // namespace Bary - /** * Evaluate 2D expansions at particle locations using Bary Interpolation. * Reimplements the algorithm in Nektar++. @@ -463,19 +298,9 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { // this cell const auto physvals = &k_global_physvals[k_phys_offsets[cellx]]; - int exact_i0 = -1; - int exact_i1 = -1; - - Bary::Evaluate::preprocess_weights(k_stride_base, num_phys0, - coord0, z0, bw0, &exact_i0, - div_space0); - Bary::Evaluate::preprocess_weights(k_stride_base, num_phys1, - coord1, z1, bw1, &exact_i1, - div_space1); - - const REAL evaluation = Bary::Evaluate::compute_dir_10( - num_phys0, num_phys1, physvals, div_space0, div_space1, - exact_i0, exact_i1); + const REAL evaluation = + Bary::evaluate_2d(coord0, coord1, num_phys0, num_phys1, + physvals, div_space0, z0, z1, bw0, bw1); k_output[cellx][k_component][layerx] = evaluation; } diff --git a/test/unit/nektar_interface/test_particle_function_evaluation.cpp b/test/unit/nektar_interface/test_particle_function_evaluation.cpp index 5eb834e3..7b3f5fd4 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation.cpp @@ -604,3 +604,121 @@ TEST(ParticleFunctionEvaluation, ContFieldDerivative) { delete[] argv[1]; delete[] argv[2]; } + +TEST(BaryInterpolation, Evaluation2D) { + + int argc = 3; + char *argv[3]; + + std::filesystem::path source_file = __FILE__; + std::filesystem::path source_dir = source_file.parent_path(); + std::filesystem::path test_resources_dir = + source_dir / "../../test_resources"; + std::filesystem::path mesh_file = + test_resources_dir / "square_triangles_quads_nummodes_6.xml"; + std::filesystem::path conditions_file = + test_resources_dir / "conditions_cg.xml"; + + copy_to_cstring(std::string("test_particle_function_evaluation"), &argv[0]); + copy_to_cstring(std::string(mesh_file), &argv[1]); + copy_to_cstring(std::string(conditions_file), &argv[2]); + + LibUtilities::SessionReaderSharedPtr session; + SpatialDomains::MeshGraphSharedPtr graph; + // Create session reader. + session = LibUtilities::SessionReader::CreateInstance(argc, argv); + graph = SpatialDomains::MeshGraph::Read(session); + + auto cont_field = std::make_shared(session, graph, "u"); + + auto lambda_f = [&](const NekDouble x, const NekDouble y) { + return 2.0 * (x + 0.5) * (x - 0.5) * (y + 0.8) * (y - 0.8); + }; + interpolate_onto_nektar_field_2d(lambda_f, cont_field); + + const auto global_physvals = cont_field->GetPhys(); + + int rank; + MPICHK(MPI_Comm_rank(MPI_COMM_WORLD, &rank)); + std::mt19937 rng(22123234 + rank); + std::uniform_real_distribution uniform_rng(-0.1, 0.1); + + const int num_elts = cont_field->GetNumElmts(); + Array Lcoord(2); + Array coord(2); + for (int ex = 0; ex < num_elts; ex++) { + auto exp = cont_field->GetExp(ex); + auto geom = exp->GetGeom(); + auto base = exp->GetBase(); + const auto &z0 = base[0]->GetZ(); + const auto &bw0 = base[0]->GetBaryWeights(); + const auto &z1 = base[1]->GetZ(); + const auto &bw1 = base[1]->GetBaryWeights(); + const int num_phys0 = z0.size(); + const int num_phys1 = z1.size(); + const int num_phys = std::max(num_phys0, num_phys1); + std::vector div_space(2 * num_phys); + std::vector z0v(num_phys); + std::vector z1v(num_phys); + std::vector bw0v(num_phys); + std::vector bw1v(num_phys); + for (int ix = 0; ix < num_phys0; ix++) { + z0v[ix] = z0[ix]; + bw0v[ix] = bw0[ix]; + } + for (int ix = 0; ix < num_phys1; ix++) { + z1v[ix] = z1[ix]; + bw1v[ix] = bw1[ix]; + } + const auto physvals = global_physvals + cont_field->GetPhys_Offset(ex); + std::vector physvalsv(num_phys0 * num_phys1); + for (int ix = 0; ix < (num_phys0 * num_phys1); ix++) { + physvalsv[ix] = physvals[ix]; + } + + // check bary eval at all the quad points + for (int p0 = 0; p0 < num_phys0; p0++) { + for (int p1 = 0; p1 < num_phys1; p1++) { + const REAL x0 = z0[p0]; + const REAL x1 = z1[p1]; + coord[0] = x0; + coord[1] = x1; + exp->LocCollapsedToLocCoord(coord, Lcoord); + const REAL correct = exp->StdPhysEvaluate(Lcoord, physvals); + const REAL to_test = Bary::evaluate_2d( + x0, x1, num_phys0, num_phys1, physvalsv.data(), div_space.data(), + z0v.data(), z1v.data(), bw0v.data(), bw1v.data()); + + const REAL err_abs = std::abs(correct - to_test); + const REAL abs_correct = std::abs(correct); + const REAL err_rel = + abs_correct > 0 ? err_abs / abs_correct : abs_correct; + EXPECT_TRUE(err_rel < 1.0e-12 || err_abs < 1.0e-12); + } + } + // check bary eval at away from the quad points + for (int p0 = 0; p0 < num_phys0; p0++) { + for (int p1 = 0; p1 < num_phys1; p1++) { + const REAL x0 = z0[p0] + uniform_rng(rng); + const REAL x1 = z1[p1] + uniform_rng(rng); + coord[0] = x0; + coord[1] = x1; + exp->LocCollapsedToLocCoord(coord, Lcoord); + const REAL correct = exp->StdPhysEvaluate(Lcoord, physvals); + const REAL to_test = Bary::evaluate_2d( + x0, x1, num_phys0, num_phys1, physvalsv.data(), div_space.data(), + z0v.data(), z1v.data(), bw0v.data(), bw1v.data()); + + const REAL err_abs = std::abs(correct - to_test); + const REAL abs_correct = std::abs(correct); + const REAL err_rel = + abs_correct > 0 ? err_abs / abs_correct : abs_correct; + EXPECT_TRUE(err_rel < 1.0e-12 || err_abs < 1.0e-12); + } + } + } + + delete[] argv[0]; + delete[] argv[1]; + delete[] argv[2]; +} diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index 31969b6c..7a28f768 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -178,3 +178,161 @@ TEST(ParticleFunctionEvaluation3D, DisContFieldPrismTet) { "reference_prism_tet_cube/conditions.xml", "reference_prism_tet_cube/prism_tet_cube_0.5_perturbed.xml", 1.0e-7); } + +template +static inline void bary_wrapper_3d(std::string condtions_file_s, + std::string mesh_file_s, const double tol) { + + std::filesystem::path source_file = __FILE__; + std::filesystem::path source_dir = source_file.parent_path(); + std::filesystem::path test_resources_dir = + source_dir / "../../test_resources"; + + std::filesystem::path condtions_file_basename{condtions_file_s}; + std::filesystem::path mesh_file_basename{mesh_file_s}; + std::filesystem::path conditions_file = + test_resources_dir / condtions_file_basename; + std::filesystem::path mesh_file = test_resources_dir / mesh_file_basename; + + int argc = 3; + char *argv[3]; + copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); + copy_to_cstring(std::string(conditions_file), &argv[1]); + copy_to_cstring(std::string(mesh_file), &argv[2]); + + LibUtilities::SessionReaderSharedPtr session; + SpatialDomains::MeshGraphSharedPtr graph; + // Create session reader. + session = LibUtilities::SessionReader::CreateInstance(argc, argv); + graph = SpatialDomains::MeshGraph::Read(session); + + auto field = std::make_shared(session, graph, "u"); + + auto lambda_f = [&](const NekDouble x, const NekDouble y, const NekDouble z) { + return 2.0 * (x + 0.5) * (x - 0.5) * (y + 0.8) * (y - 0.8) * (z + 0.2) * + (z - 0.3); + }; + interpolate_onto_nektar_field_3d(lambda_f, field); + + const auto global_physvals = field->GetPhys(); + + int rank; + MPICHK(MPI_Comm_rank(MPI_COMM_WORLD, &rank)); + std::mt19937 rng(22123234 + rank); + std::uniform_real_distribution uniform_rng(-0.1, 0.1); + + const int num_elts = field->GetNumElmts(); + Array Lcoord(3); + Array coord(3); + for (int ex = 0; ex < num_elts; ex++) { + auto exp = field->GetExp(ex); + auto geom = exp->GetGeom(); + auto base = exp->GetBase(); + const auto &z0 = base[0]->GetZ(); + const auto &bw0 = base[0]->GetBaryWeights(); + const auto &z1 = base[1]->GetZ(); + const auto &bw1 = base[1]->GetBaryWeights(); + const auto &z2 = base[2]->GetZ(); + const auto &bw2 = base[2]->GetBaryWeights(); + const int num_phys0 = z0.size(); + const int num_phys1 = z1.size(); + const int num_phys2 = z2.size(); + const int num_phys = std::max(num_phys0, std::max(num_phys1, num_phys2)); + std::vector div_space(3 * num_phys); + std::vector z0v(num_phys); + std::vector z1v(num_phys); + std::vector z2v(num_phys); + std::vector bw0v(num_phys); + std::vector bw1v(num_phys); + std::vector bw2v(num_phys); + for (int ix = 0; ix < num_phys0; ix++) { + z0v[ix] = z0[ix]; + bw0v[ix] = bw0[ix]; + } + for (int ix = 0; ix < num_phys1; ix++) { + z1v[ix] = z1[ix]; + bw1v[ix] = bw1[ix]; + } + for (int ix = 0; ix < num_phys2; ix++) { + z2v[ix] = z2[ix]; + bw2v[ix] = bw2[ix]; + } + const auto physvals = global_physvals + field->GetPhys_Offset(ex); + std::vector physvalsv(num_phys0 * num_phys1 * num_phys2); + for (int ix = 0; ix < (num_phys0 * num_phys1 * num_phys2); ix++) { + physvalsv[ix] = physvals[ix]; + } + + // check bary eval at all the quad points + for (int p0 = 0; p0 < num_phys0; p0++) { + for (int p1 = 0; p1 < num_phys1; p1++) { + for (int p2 = 0; p2 < num_phys2; p2++) { + const REAL x0 = z0[p0]; + const REAL x1 = z1[p1]; + const REAL x2 = z2[p2]; + coord[0] = x0; + coord[1] = x1; + coord[2] = x2; + exp->LocCollapsedToLocCoord(coord, Lcoord); + const REAL correct = exp->StdPhysEvaluate(Lcoord, physvals); + const REAL to_test = Bary::evaluate_3d( + x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), + div_space.data(), z0v.data(), z1v.data(), z2v.data(), bw0v.data(), + bw1v.data(), bw2v.data()); + + const REAL err_abs = std::abs(correct - to_test); + const REAL abs_correct = std::abs(correct); + const REAL err_rel = + abs_correct > 0 ? err_abs / abs_correct : abs_correct; + EXPECT_TRUE(err_rel < 1.0e-12 || err_abs < 1.0e-12); + } + } + } + + // check bary eval at away from the quad points + for (int p0 = 0; p0 < num_phys0; p0++) { + for (int p1 = 0; p1 < num_phys1; p1++) { + for (int p2 = 0; p2 < num_phys2; p2++) { + const REAL x0 = z0[p0] + uniform_rng(rng); + const REAL x1 = z1[p1] + uniform_rng(rng); + const REAL x2 = z2[p2] + uniform_rng(rng); + coord[0] = x0; + coord[1] = x1; + coord[2] = x2; + exp->LocCollapsedToLocCoord(coord, Lcoord); + const REAL correct = exp->StdPhysEvaluate(Lcoord, physvals); + const REAL to_test = Bary::evaluate_3d( + x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), + div_space.data(), z0v.data(), z1v.data(), z2v.data(), bw0v.data(), + bw1v.data(), bw2v.data()); + + const REAL err_abs = std::abs(correct - to_test); + const REAL abs_correct = std::abs(correct); + const REAL err_rel = + abs_correct > 0 ? err_abs / abs_correct : abs_correct; + EXPECT_TRUE(err_rel < 1.0e-12 || err_abs < 1.0e-12); + } + } + } + } + + delete[] argv[0]; + delete[] argv[1]; + delete[] argv[2]; +} + +TEST(BaryInterpolation, Evaluation3DContField) { + evaluation_wrapper_3d( + "reference_all_types_cube/conditions_cg.xml", + "reference_all_types_cube/mixed_ref_cube_0.5_perturbed.xml", 1.0e-7); +} +TEST(BaryInterpolation, Evaluation3DDisContFieldHex) { + evaluation_wrapper_3d( + "reference_hex_cube/conditions.xml", + "reference_hex_cube/hex_cube_0.3_perturbed.xml", 1.0e-7); +} +TEST(BaryInterpolation, Evaluation3DDisContFieldPrismTet) { + evaluation_wrapper_3d( + "reference_prism_tet_cube/conditions.xml", + "reference_prism_tet_cube/prism_tet_cube_0.5_perturbed.xml", 1.0e-7); +} diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp new file mode 100644 index 00000000..183b21c2 --- /dev/null +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -0,0 +1,166 @@ +#include "nektar_interface/coordinate_mapping.hpp" +#include "nektar_interface/geometry_transport/halo_extension.hpp" +#include "nektar_interface/particle_interface.hpp" +#include "nektar_interface/utility_mesh_plotting.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace Nektar; +using namespace Nektar::SolverUtils; +using namespace Nektar::LibUtilities; +using namespace Nektar::SpatialDomains; +using namespace NESO::Particles; + +static inline void copy_to_cstring(std::string input, char **output) { + *output = new char[input.length() + 1]; + std::strcpy(*output, input.c_str()); +} + +TEST(ParticleGeometryInterfaceCurved, Init) { + + int size, rank; + MPI_Comm_size(MPI_COMM_WORLD, &size); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + LibUtilities::SessionReaderSharedPtr session; + SpatialDomains::MeshGraphSharedPtr graph; + + int argc = 3; + char *argv[3]; + copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); + + std::filesystem::path source_file = __FILE__; + std::filesystem::path source_dir = source_file.parent_path(); + std::filesystem::path test_resources_dir = + source_dir / "../../test_resources"; + std::filesystem::path conditions_file = + test_resources_dir / "reference_all_types_cube/conditions.xml"; + copy_to_cstring(std::string(conditions_file), &argv[1]); + // std::filesystem::path mesh_file = + // test_resources_dir / "reference_all_types_cube/mixed_ref_cube_0.2.xml"; + + std::filesystem::path mesh_file = + "/home/js0259/git-ukaea/NESO-workspace/reference_all_types_cube/" + "mixed_ref_cube_0.5_perturbed_order_2.xml"; + copy_to_cstring(std::string(mesh_file), &argv[2]); + + // Create session reader. + session = LibUtilities::SessionReader::CreateInstance(argc, argv); + + // Create MeshGraph. + graph = SpatialDomains::MeshGraph::Read(session); + + // build map from owned mesh hierarchy cells to geoms that touch that cell + auto particle_mesh_interface = std::make_shared(graph); + + std::map> geoms; + get_all_elements_3d(graph, geoms); + + auto lambda_stype = [](auto s) -> std::string { + switch (s) { + case eTetrahedron: + return "Tet"; + case ePyramid: + return "Pyr"; + case ePrism: + return "Prism"; + case eHexahedron: + return "Hex"; + default: + return "shape unknown"; + } + }; + + auto lambda_btype = [](auto s) -> std::string { + switch (s) { + case eModified_A: + return "eA"; + case eModified_B: + return "eB"; + case eModified_C: + return "eC"; + case eModifiedPyr_C: + return "ePyrC"; + default: + return "basis unknown"; + } + }; + + for (auto gx : geoms) { + auto geom = gx.second; + auto xmap = geom->GetXmap(); + nprint(geom->GetShapeType(), lambda_stype(geom->GetShapeType())); + nprint("Num bases:", xmap->GetNumBases()); + for (int dx = 0; dx < 3; dx++) { + nprint("dx:", dx, "type:", lambda_btype(xmap->GetBasisType(dx)), + xmap->GetBasisNumModes(dx)); + } + + Array Lcoord(3); + Array Lcoord2(3); + Array Gcoord(3); + Array Gcoord2(3); + Lcoord[0] = -0.05; + Lcoord[1] = -0.05; + Lcoord[2] = -0.05; + + for (int dx = 0; dx < 3; dx++) { + // calls phys evaluate which takes a loc coord not a loc collapsed coord + Gcoord[dx] = geom->GetCoord(dx, Lcoord); + } + + geom->GetLocCoords(Gcoord, Lcoord2); + + for (int dx = 0; dx < 3; dx++) { + // calls phys evaluate which takes a loc coord not a loc collapsed coord + Gcoord2[dx] = geom->GetCoord(dx, Lcoord2); + } + nprint(Lcoord[0], Lcoord[1], Lcoord[2], "\n", Lcoord2[0], Lcoord2[1], + Lcoord2[2], "\n", Gcoord[0], Gcoord[1], Gcoord[2], "\n", Gcoord2[0], + Gcoord2[1], Gcoord2[2], "\n------"); + + auto I0 = xmap->GetBasis(0)->GetI(Lcoord); + auto I1 = xmap->GetBasis(1)->GetI(Lcoord); + auto I2 = xmap->GetBasis(2)->GetI(Lcoord); + + for (auto ix = I0->begin(); ix != I0->end(); ix++) { + nprint(*ix); + } + nprint("-----"); + const int npts = xmap->GetTotPoints(); + Array ptsx(npts), ptsy(npts), ptsz(npts); + xmap->BwdTrans(geom->GetCoeffs(0), ptsx); + xmap->BwdTrans(geom->GetCoeffs(1), ptsy); + xmap->BwdTrans(geom->GetCoeffs(2), ptsz); + + Array eta(3); + xmap->LocCoordToLocCollapsed(Lcoord, eta); + Array I(3); + I[0] = xmap->GetBasis(0)->GetI(eta); + I[1] = xmap->GetBasis(1)->GetI(eta + 1); + I[2] = xmap->GetBasis(2)->GetI(eta + 2); + const auto x = xmap->PhysEvaluate(I, ptsx); + const auto y = xmap->PhysEvaluate(I, ptsy); + const auto z = xmap->PhysEvaluate(I, ptsz); + nprint(x, y, z); + } + + particle_mesh_interface->free(); + delete[] argv[0]; + delete[] argv[1]; + delete[] argv[2]; +} From 6cd1f3d68637d7f79d3d75e096c40065ebcf481c Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 20 Nov 2023 18:40:02 +0000 Subject: [PATCH 03/66] simplified Bary interpolation evaluation loops to allow the compiler to reorder how it sees fit --- .../bary_interpolation/bary_evaluation.hpp | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp index 69ecb643..cc4c5ae7 100644 --- a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -83,17 +83,14 @@ inline REAL compute_dir_10(const int num_phys0, const int num_phys1, const REAL *const physvals, const REAL *const div_space0, const REAL *const div_space1) { - - REAL numer = 0.0; + REAL pval1 = 0.0; for (int i1 = 0; i1 < num_phys1; i1++) { - REAL pval = 0.0; + const REAL c1 = div_space1[i1]; for (int i0 = 0; i0 < num_phys0; i0++) { - pval += physvals[i1 * num_phys0 + i0] * div_space0[i0]; + pval1 += physvals[i1 * num_phys0 + i0] * div_space0[i0] * c1; } - const REAL tmp = div_space1[i1]; - numer += tmp * pval; } - return numer; + return pval1; } /** @@ -114,19 +111,17 @@ inline REAL compute_dir_210(const int num_phys0, const int num_phys1, const REAL *const div_space0, const REAL *const div_space1, const REAL *const div_space2) { - const int stride = num_phys0 * num_phys1; REAL pval2 = 0.0; for (int i2 = 0; i2 < num_phys2; i2++) { - REAL pval1 = 0.0; + const REAL c2 = div_space2[i2]; for (int i1 = 0; i1 < num_phys1; i1++) { - REAL pval0 = 0.0; + const REAL c1 = c2 * div_space1[i1]; for (int i0 = 0; i0 < num_phys0; i0++) { - pval0 += physvals[i2 * stride + i1 * num_phys0 + i0] * div_space0[i0]; + pval2 += + physvals[i2 * stride + i1 * num_phys0 + i0] * div_space0[i0] * c1; } - pval1 += div_space1[i1] * pval0; } - pval2 += div_space2[i2] * pval1; } return pval2; } From 378c6dab7757b2cf88ea43e0fcf7fc41b8d594d1 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 20 Nov 2023 18:41:18 +0000 Subject: [PATCH 04/66] stray comment --- include/nektar_interface/bary_interpolation/bary_evaluation.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp index cc4c5ae7..a0a98963 100644 --- a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -65,7 +65,6 @@ inline REAL compute_dir_0(const int num_phys, const REAL *const physvals, } const REAL eval0 = numer; return eval0; - //} } /** From b09df365aa52f6225aec92536b16ce6979b6ca7b Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 21 Nov 2023 15:32:49 +0000 Subject: [PATCH 05/66] Bary interpolation of forward X maps passing initial tests --- CMakeLists.txt | 1 + .../map_particles_newton.hpp | 15 +- .../mapping_newton_iteration_base.hpp | 52 +++- .../newton_generic_3d.hpp | 264 ++++++++++++++++++ .../newton_geom_interfaces.hpp | 1 + .../particle_cell_mapping/newton_hex.hpp | 3 +- .../particle_cell_mapping/newton_prism.hpp | 3 +- .../particle_cell_mapping/newton_pyr.hpp | 3 +- .../particle_cell_mapping/newton_quad.hpp | 3 +- .../particle_cell_mapping/newton_tet.hpp | 3 +- .../particle_cell_mapping/x_map_newton.hpp | 64 +++-- ..._particle_geometry_interface_3d_curved.cpp | 150 +++++++++- 12 files changed, 521 insertions(+), 41 deletions(-) create mode 100644 include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c8f794be..02792b78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -185,6 +185,7 @@ set(HEADER_FILES ${INC_DIR}/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/nektar_graph_local_mapper.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp + ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_hex.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_prism.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_pyr.hpp diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp index abb95334..9793e2a0 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -78,7 +78,8 @@ class MapParticlesNewton : public CoarseMappersBase { ? this->h_data.data() + index * this->num_bytes_per_map_host : nullptr; - this->newton_type.write_data(geom, h_data_ptr, d_data_ptr); + this->newton_type.write_data(this->sycl_target, geom, h_data_ptr, + d_data_ptr); } public: @@ -342,24 +343,30 @@ class MapParticlesNewton : public CoarseMappersBase { REAL xin0, xin1, xin2; REAL f0, f1, f2; + // TODO REAL residual = k_newton_type.newton_residual( - map_data, xi0, xi1, xi2, p0, p1, p2, &f0, &f1, &f2); + map_data, xi0, xi1, xi2, p0, p1, p2, &f0, &f1, &f2, + nullptr); bool diverged = false; for (int stepx = 0; ((stepx < k_max_iterations) && (residual > k_tol) && (!diverged)); stepx++) { + + // TODO k_newton_type.newton_step(map_data, xi0, xi1, xi2, p0, p1, p2, f0, f1, f2, &xin0, - &xin1, &xin2); + &xin1, &xin2, nullptr); xi0 = xin0; xi1 = xin1; xi2 = xin2; + // TODO residual = k_newton_type.newton_residual( - map_data, xi0, xi1, xi2, p0, p1, p2, &f0, &f1, &f2); + map_data, xi0, xi1, xi2, p0, p1, p2, &f0, &f1, &f2, + nullptr); diverged = (ABS(xi0) > 15.0) || (ABS(xi1) > 15.0) || (ABS(xi2) > 15.0); diff --git a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp index aa599519..e524b5a4 100644 --- a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp +++ b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp @@ -9,6 +9,10 @@ using namespace Nektar::SpatialDomains; namespace NESO::Newton { +template struct local_memory_required { + static bool const required = false; +}; + /** * Abstract base class for Newton iteration methods for binning particles into * Nektar++ cells. Subclasses must be device copyable. @@ -20,6 +24,8 @@ template struct MappingNewtonIterationBase { * data which will be required to perform a Newton iteration on the SYCL * device. * + * @param sycl_target A SYCLTarget instance which the mapper may use to + * allocate futher device memory. * @param geom A geometry object which particles may be binned into. * @param data_host A host pointer to a buffer which will be kept on the * host. @@ -27,10 +33,11 @@ template struct MappingNewtonIterationBase { * compute device. * */ - inline void write_data(GeometrySharedPtr geom, void *data_host, + inline void write_data(SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, void *data_device) { auto &underlying = static_cast(*this); - underlying.write_data_v(geom, data_host, data_device); + underlying.write_data_v(sycl_target, geom, data_host, data_device); } /** @@ -68,6 +75,22 @@ template struct MappingNewtonIterationBase { return underlying.data_size_device_v(); } + /** + * The number of bytes of kernel local memory required to evaluate the + * mapping or residual. + * + * @param data_host Host data region for mapper. + * @returns Number of bytes required. + */ + inline std::size_t data_size_local(void *data_host) { + if constexpr (local_memory_required::required) { + auto &underlying = static_cast(*this); + return underlying.data_size_local_v(data_host); + } else { + return 0; + } + } + /** * Perform a Newton iteration such that * @@ -97,14 +120,21 @@ template struct MappingNewtonIterationBase { * component. * @param[in, out] xin2 Output new iteration for local coordinate xi, z * component. + * @param[in, out] local_memory Local memory space to use for computation. */ inline void newton_step(const void *d_data, const REAL xi0, const REAL xi1, const REAL xi2, const REAL phys0, const REAL phys1, const REAL phys2, const REAL f0, const REAL f1, - const REAL f2, REAL *xin0, REAL *xin1, REAL *xin2) { + const REAL f2, REAL *xin0, REAL *xin1, REAL *xin2, + void *local_memory) { auto &underlying = static_cast(*this); - underlying.newton_step_v(d_data, xi0, xi1, xi2, phys0, phys1, phys2, f0, f1, - f2, xin0, xin1, xin2); + if constexpr (local_memory_required::required) { + underlying.newton_step_v(d_data, xi0, xi1, xi2, phys0, phys1, phys2, f0, + f1, f2, xin0, xin1, xin2, local_memory); + } else { + underlying.newton_step_v(d_data, xi0, xi1, xi2, phys0, phys1, phys2, f0, + f1, f2, xin0, xin1, xin2); + } } /** @@ -133,15 +163,21 @@ template struct MappingNewtonIterationBase { * @param[in, out] f0 F(xi), x component. * @param[in, out] f1 F(xi), y component. * @param[in, out] f2 F(xi), z component. + * @param[in, out] local_memory Local memory space to use for computation. * @returns Residual. */ inline REAL newton_residual(const void *d_data, const REAL xi0, const REAL xi1, const REAL xi2, const REAL phys0, const REAL phys1, const REAL phys2, REAL *f0, - REAL *f1, REAL *f2) { + REAL *f1, REAL *f2, void *local_memory) { auto &underlying = static_cast(*this); - return underlying.newton_residual_v(d_data, xi0, xi1, xi2, phys0, phys1, - phys2, f0, f1, f2); + if constexpr (local_memory_required::required) { + return underlying.newton_residual_v(d_data, xi0, xi1, xi2, phys0, phys1, + phys2, f0, f1, f2, local_memory); + } else { + return underlying.newton_residual_v(d_data, xi0, xi1, xi2, phys0, phys1, + phys2, f0, f1, f2); + } } /** diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp new file mode 100644 index 00000000..2e2afe2b --- /dev/null +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -0,0 +1,264 @@ +#ifndef ___NESO_PARTICLE_MAPPING_NEWTON_GENERIC_3D_H__ +#define ___NESO_PARTICLE_MAPPING_NEWTON_GENERIC_3D_H__ + +#include "../bary_interpolation/bary_evaluation.hpp" +#include "generated_linear/linear_newton_implementation.hpp" +#include "particle_cell_mapping_newton.hpp" +#include + +using namespace NESO; +using namespace NESO::Particles; + +namespace NESO { +namespace Newton { + +namespace Generic3D { +struct DataDevice { + int shape_type_int; + REAL tol_scaling; + int num_phys0; + int num_phys1; + int num_phys2; + REAL *z0; + REAL *z1; + REAL *z2; + REAL *bw0; + REAL *bw1; + REAL *bw2; + REAL *physvals0; + REAL *physvals1; + REAL *physvals2; +}; +struct DataHost { + std::size_t data_size_local; + std::unique_ptr> d_zbw; + inline void free() { this->d_zbw.reset(); } +}; +} // namespace Generic3D + +struct MappingGeneric3D : MappingNewtonIterationBase { + + inline void write_data_v(SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, + void *data_device) { + Generic3D::DataHost *h_data = static_cast(data_host); + Generic3D::DataDevice *d_data = + static_cast(data_device); + + auto lambda_as_vector = [](const auto &a) -> std::vector { + const std::size_t size = a.size(); + std::vector v(size); + for (int ix = 0; ix < size; ix++) { + v.at(ix) = a[ix]; + } + return v; + }; + + auto exp = geom->GetXmap(); + auto base = exp->GetBase(); + NESOASSERT(base.size() == 3, "Expected base of size 3."); + const auto &z0 = lambda_as_vector(base[0]->GetZ()); + const auto &bw0 = lambda_as_vector(base[0]->GetBaryWeights()); + const auto &z1 = lambda_as_vector(base[1]->GetZ()); + const auto &bw1 = lambda_as_vector(base[1]->GetBaryWeights()); + const auto &z2 = lambda_as_vector(base[2]->GetZ()); + const auto &bw2 = lambda_as_vector(base[2]->GetBaryWeights()); + + const int num_phys0 = z0.size(); + const int num_phys1 = z1.size(); + const int num_phys2 = z2.size(); + const int num_phys_total = num_phys0 + num_phys1 + num_phys2; + const int num_physvals = num_phys0 * num_phys1 * num_phys2; + d_data->num_phys0 = num_phys0; + d_data->num_phys1 = num_phys1; + d_data->num_phys2 = num_phys2; + + // push the quadrature points and weights into a device buffer + std::vector s_zbw; + const int num_elements = 2 * num_phys_total + 3 * num_physvals; + s_zbw.reserve(num_elements); + s_zbw.insert(s_zbw.end(), z0.begin(), z0.end()); + s_zbw.insert(s_zbw.end(), z1.begin(), z1.end()); + s_zbw.insert(s_zbw.end(), z2.begin(), z2.end()); + s_zbw.insert(s_zbw.end(), bw0.begin(), bw0.end()); + s_zbw.insert(s_zbw.end(), bw1.begin(), bw1.end()); + s_zbw.insert(s_zbw.end(), bw2.begin(), bw2.end()); + + NESOASSERT(exp->GetTotPoints() == num_physvals, + "Expected these two evaluations of the number of quadrature " + "points to match."); + + // push the physvals onto the vector + Array tmp(num_physvals); + exp->BwdTrans(geom->GetCoeffs(0), tmp); + const auto physvals0 = lambda_as_vector(tmp); + exp->BwdTrans(geom->GetCoeffs(1), tmp); + const auto physvals1 = lambda_as_vector(tmp); + exp->BwdTrans(geom->GetCoeffs(2), tmp); + const auto physvals2 = lambda_as_vector(tmp); + s_zbw.insert(s_zbw.end(), physvals0.begin(), physvals0.end()); + s_zbw.insert(s_zbw.end(), physvals1.begin(), physvals1.end()); + s_zbw.insert(s_zbw.end(), physvals2.begin(), physvals2.end()); + + // Create a device buffer with the z,bw,physvals + h_data->d_zbw = std::make_unique>(sycl_target, s_zbw); + + // store the pointers into the buffer we just made in the device struct so + // that pointer arithmetric does not have to happen in the kernel but the + // data is all in one contiguous block + d_data->z0 = h_data->d_zbw->ptr; + d_data->z1 = d_data->z0 + num_phys0; + d_data->z2 = d_data->z1 + num_phys1; + d_data->bw0 = d_data->z2 + num_phys2; + d_data->bw1 = d_data->bw0 + num_phys0; + d_data->bw2 = d_data->bw1 + num_phys1; + d_data->physvals0 = d_data->bw2 + num_phys2; + d_data->physvals1 = d_data->physvals0 + num_physvals; + d_data->physvals2 = d_data->physvals1 + num_physvals; + NESOASSERT(d_data->physvals2 + num_physvals == + h_data->d_zbw->ptr + num_elements, + "Error in pointer arithmetic."); + + // Exit tolerance scaling applied by Nektar++ + auto m_xmap = geom->GetXmap(); + auto m_geomFactors = geom->GetGeomFactors(); + Array Jac = + m_geomFactors->GetJac(m_xmap->GetPointsKeys()); + NekDouble tol_scaling = + Vmath::Vsum(Jac.size(), Jac, 1) / ((NekDouble)Jac.size()); + d_data->tol_scaling = ABS(1.0 / tol_scaling); + d_data->shape_type_int = static_cast(geom->GetShapeType()); + } + + inline void free_data_v(void *data_host) { + Generic3D::DataHost *h_data = static_cast(data_host); + h_data->free(); + } + + inline std::size_t data_size_host_v() { return sizeof(Generic3D::DataHost); } + + inline std::size_t data_size_local_v(void *data_host) { + return static_cast(data_host)->data_size_local; + } + + inline std::size_t data_size_device_v() { + return sizeof(Generic3D::DataDevice); + } + + inline void newton_step_v(const void *d_data, const REAL xi0, const REAL xi1, + const REAL xi2, const REAL phys0, const REAL phys1, + const REAL phys2, const REAL f0, const REAL f1, + const REAL f2, REAL *xin0, REAL *xin1, REAL *xin2, + void *local_memory) { + const Generic3D::DataDevice *data = + static_cast(d_data); + } + + inline REAL newton_residual_v(const void *d_data, const REAL xi0, + const REAL xi1, const REAL xi2, + const REAL phys0, const REAL phys1, + const REAL phys2, REAL *f0, REAL *f1, REAL *f2, + void *local_memory) { + + const Generic3D::DataDevice *d = + static_cast(d_data); + const REAL *data_device_real = static_cast(d_data); + + REAL eta0, eta1, eta2; + this->loc_coord_to_loc_collapsed(d_data, xi0, xi1, xi2, &eta0, &eta1, + &eta2); + + // compute X at xi by evaluating the Bary interpolation at eta + REAL *div_space0 = static_cast(local_memory); + REAL *div_space1 = div_space0 + d->num_phys0; + REAL *div_space2 = div_space1 + d->num_phys1; + Bary::preprocess_weights(d->num_phys0, eta0, d->z0, d->bw0, div_space0); + Bary::preprocess_weights(d->num_phys1, eta1, d->z1, d->bw1, div_space1); + Bary::preprocess_weights(d->num_phys2, eta2, d->z2, d->bw2, div_space2); + + const REAL X0 = + Bary::compute_dir_210(d->num_phys0, d->num_phys1, d->num_phys2, + d->physvals0, div_space0, div_space1, div_space2); + const REAL X1 = + Bary::compute_dir_210(d->num_phys0, d->num_phys1, d->num_phys2, + d->physvals1, div_space0, div_space1, div_space2); + const REAL X2 = + Bary::compute_dir_210(d->num_phys0, d->num_phys1, d->num_phys2, + d->physvals2, div_space0, div_space1, div_space2); + + // Residual is defined as F = X(xi) - P + *f0 = X0 - phys0; + *f1 = X1 - phys1; + *f2 = X2 - phys2; + + const REAL norm2 = MAX(MAX(ABS(*f0), ABS(*f1)), ABS(*f2)); + const REAL tol_scaling = d->tol_scaling; + const REAL scaled_norm2 = norm2 * tol_scaling; + return scaled_norm2; + } + + inline int get_ndim_v() { return 3; } + + inline void set_initial_iteration_v(const void *d_data, const REAL phys0, + const REAL phys1, const REAL phys2, + REAL *xi0, REAL *xi1, REAL *xi2) { + *xi0 = 0.0; + *xi1 = 0.0; + *xi2 = 0.0; + } + + inline void loc_coord_to_loc_collapsed_v(const void *d_data, const REAL xi0, + const REAL xi1, const REAL xi2, + REAL *eta0, REAL *eta1, REAL *eta2) { + + const Generic3D::DataDevice *data = + static_cast(d_data); + const int shape_type = data->shape_type_int; + + constexpr int shape_type_tet = + shape_type_to_int(LibUtilities::eTetrahedron); + constexpr int shape_type_pyr = shape_type_to_int(LibUtilities::ePyramid); + constexpr int shape_type_hex = shape_type_to_int(LibUtilities::eHexahedron); + + NekDouble d2 = 1.0 - xi2; + if (fabs(d2) < NekConstants::kNekZeroTol) { + if (d2 >= 0.) { + d2 = NekConstants::kNekZeroTol; + } else { + d2 = -NekConstants::kNekZeroTol; + } + } + NekDouble d12 = -xi1 - xi2; + if (fabs(d12) < NekConstants::kNekZeroTol) { + if (d12 >= 0.) { + d12 = NekConstants::kNekZeroTol; + } else { + d12 = -NekConstants::kNekZeroTol; + } + } + + const REAL id2x2 = 2.0 / d2; + const REAL a = 1.0 + xi0; + const REAL b = (1.0 + xi1) * id2x2 - 1.0; + const REAL c = a * id2x2 - 1.0; + const REAL d = 2.0 * a / d12 - 1.0; + + *eta0 = (shape_type == shape_type_tet) ? d + : (shape_type == shape_type_hex) ? xi0 + : c; + + *eta1 = ((shape_type == shape_type_tet) || (shape_type == shape_type_pyr)) + ? b + : xi1; + *eta2 = xi2; + } +}; + +template <> struct local_memory_required { + static bool const required = true; +}; + +} // namespace Newton +} // namespace NESO + +#endif diff --git a/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp b/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp index ff75ad2c..4425b525 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp @@ -1,6 +1,7 @@ #ifndef __NEWTON_GEOM_INTERFACES_H_ #define __NEWTON_GEOM_INTERFACES_H_ +#include "newton_generic_3d.hpp" #include "newton_hex.hpp" #include "newton_prism.hpp" #include "newton_pyr.hpp" diff --git a/include/nektar_interface/particle_cell_mapping/newton_hex.hpp b/include/nektar_interface/particle_cell_mapping/newton_hex.hpp index b98d364b..d6619af6 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_hex.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_hex.hpp @@ -13,7 +13,8 @@ namespace Newton { struct MappingHexLinear3D : MappingNewtonIterationBase { - inline void write_data_v(GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/newton_prism.hpp b/include/nektar_interface/particle_cell_mapping/newton_prism.hpp index bc425567..335306bf 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_prism.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_prism.hpp @@ -13,7 +13,8 @@ namespace Newton { struct MappingPrismLinear3D : MappingNewtonIterationBase { - inline void write_data_v(GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp b/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp index d526d74f..245f8a47 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp @@ -13,7 +13,8 @@ namespace Newton { struct MappingPyrLinear3D : MappingNewtonIterationBase { - inline void write_data_v(GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/newton_quad.hpp b/include/nektar_interface/particle_cell_mapping/newton_quad.hpp index 87c13a66..ee890eea 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_quad.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_quad.hpp @@ -13,7 +13,8 @@ namespace Newton { struct MappingQuadLinear2D : MappingNewtonIterationBase { - inline void write_data_v(GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/newton_tet.hpp b/include/nektar_interface/particle_cell_mapping/newton_tet.hpp index 3142d331..44851b50 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_tet.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_tet.hpp @@ -13,7 +13,8 @@ namespace Newton { struct MappingTetLinear3D : MappingNewtonIterationBase { - inline void write_data_v(GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 9b3a2f8c..46abb95a 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -33,6 +33,7 @@ template class XMapNewton { std::unique_ptr> dh_fdata; /// The data required to perform newton iterations for each geom on the host. std::vector h_data; + std::size_t num_bytes_local; template inline void write_data(U &geom) { if (this->num_bytes_per_map_host) { @@ -48,8 +49,12 @@ template class XMapNewton { auto h_data_ptr = (this->num_bytes_per_map_host) ? this->h_data.data() : nullptr; - this->newton_type.write_data(geom, h_data_ptr, d_data_ptr); + this->newton_type.write_data(this->sycl_target, geom, h_data_ptr, + d_data_ptr); this->dh_data->host_to_device(); + this->num_bytes_local = + std::max(static_cast(1), + this->newton_type.data_size_local(h_data_ptr)); } public: @@ -93,25 +98,33 @@ template class XMapNewton { auto k_map_data = this->dh_data->d_buffer.ptr; auto k_fdata = this->dh_fdata->d_buffer.ptr; + const std::size_t num_bytes_local = this->num_bytes_local; + this->sycl_target->queue .submit([&](sycl::handler &cgh) { - cgh.single_task<>([=]() { - MappingNewtonIterationBase k_newton_type{}; - - REAL f0 = 0.0; - REAL f1 = 0.0; - REAL f2 = 0.0; - const REAL p0 = 0.0; - const REAL p1 = 0.0; - const REAL p2 = 0.0; - - k_newton_type.newton_residual(k_map_data, xi0, xi1, xi2, p0, p1, p2, - &f0, &f1, &f2); - - k_fdata[0] = f0; - k_fdata[1] = f1; - k_fdata[2] = f2; - }); + sycl::accessor + local_mem(sycl::range<1>(num_bytes_local), cgh); + + cgh.parallel_for<>( + sycl::nd_range<1>(sycl::range<1>(1), sycl::range<1>(1)), + [=](auto idx) { + MappingNewtonIterationBase k_newton_type{}; + + REAL f0 = 0.0; + REAL f1 = 0.0; + REAL f2 = 0.0; + const REAL p0 = 0.0; + const REAL p1 = 0.0; + const REAL p2 = 0.0; + + k_newton_type.newton_residual(k_map_data, xi0, xi1, xi2, p0, p1, + p2, &f0, &f1, &f2, &local_mem[0]); + + k_fdata[0] = f0; + k_fdata[1] = f1; + k_fdata[2] = f2; + }); }) .wait_and_throw(); @@ -162,23 +175,30 @@ template class XMapNewton { REAL xin0, xin1, xin2; REAL f0, f1, f2; + // TODO REAL residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, &f2); + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, &f2, + nullptr); bool diverged = false; for (int stepx = 0; ((stepx < k_max_iterations) && (residual > k_tol) && (!diverged)); stepx++) { + + // TODO k_newton_type.newton_step(k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, - p2, f0, f1, f2, &xin0, &xin1, &xin2); + p2, f0, f1, f2, &xin0, &xin1, &xin2, + nullptr); k_xi0 = xin0; k_xi1 = xin1; k_xi2 = xin2; - residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, &f2); + // TODO + residual = k_newton_type.newton_residual(k_map_data, k_xi0, k_xi1, + k_xi2, p0, p1, p2, &f0, + &f1, &f2, nullptr); diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || (ABS(k_xi2) > 15.0); diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 183b21c2..b5657545 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -65,7 +65,7 @@ TEST(ParticleGeometryInterfaceCurved, Init) { graph = SpatialDomains::MeshGraph::Read(session); // build map from owned mesh hierarchy cells to geoms that touch that cell - auto particle_mesh_interface = std::make_shared(graph); + auto mesh = std::make_shared(graph); std::map> geoms; get_all_elements_3d(graph, geoms); @@ -159,7 +159,153 @@ TEST(ParticleGeometryInterfaceCurved, Init) { nprint(x, y, z); } - particle_mesh_interface->free(); + mesh->free(); + delete[] argv[0]; + delete[] argv[1]; + delete[] argv[2]; +} + +TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { + + int size, rank; + MPI_Comm_size(MPI_COMM_WORLD, &size); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + LibUtilities::SessionReaderSharedPtr session; + SpatialDomains::MeshGraphSharedPtr graph; + + int argc = 3; + char *argv[3]; + copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); + + std::filesystem::path source_file = __FILE__; + std::filesystem::path source_dir = source_file.parent_path(); + std::filesystem::path test_resources_dir = + source_dir / "../../test_resources"; + std::filesystem::path conditions_file = + test_resources_dir / "reference_all_types_cube/conditions.xml"; + copy_to_cstring(std::string(conditions_file), &argv[1]); + // std::filesystem::path mesh_file = + // test_resources_dir / "reference_all_types_cube/mixed_ref_cube_0.2.xml"; + + std::filesystem::path mesh_file = + "/home/js0259/git-ukaea/NESO-workspace/reference_all_types_cube/" + "mixed_ref_cube_0.5_perturbed_order_2.xml"; + copy_to_cstring(std::string(mesh_file), &argv[2]); + + // Create session reader. + session = LibUtilities::SessionReader::CreateInstance(argc, argv); + + // Create MeshGraph. + graph = SpatialDomains::MeshGraph::Read(session); + + // build map from owned mesh hierarchy cells to geoms that touch that cell + auto mesh = std::make_shared(graph); + auto sycl_target = std::make_shared(0, mesh->get_comm()); + + std::map> geoms; + get_all_elements_3d(graph, geoms); + + auto lambda_stype = [](auto s) -> std::string { + switch (s) { + case eTetrahedron: + return "Tet"; + case ePyramid: + return "Pyr"; + case ePrism: + return "Prism"; + case eHexahedron: + return "Hex"; + default: + return "shape unknown"; + } + }; + + auto lambda_btype = [](auto s) -> std::string { + switch (s) { + case eModified_A: + return "eA"; + case eModified_B: + return "eB"; + case eModified_C: + return "eC"; + case eModifiedPyr_C: + return "ePyrC"; + default: + return "basis unknown"; + } + }; + + for (auto gx : geoms) { + auto geom = gx.second; + auto xmap = geom->GetXmap(); + nprint(geom->GetShapeType(), lambda_stype(geom->GetShapeType())); + nprint("Num bases:", xmap->GetNumBases()); + for (int dx = 0; dx < 3; dx++) { + nprint("dx:", dx, "type:", lambda_btype(xmap->GetBasisType(dx)), + xmap->GetBasisNumModes(dx)); + } + + Array Lcoord(3); + Array Lcoord2(3); + Array Gcoord(3); + Array Gcoord2(3); + Lcoord[0] = -0.05; + Lcoord[1] = -0.05; + Lcoord[2] = -0.05; + + for (int dx = 0; dx < 3; dx++) { + // calls phys evaluate which takes a loc coord not a loc collapsed coord + Gcoord[dx] = geom->GetCoord(dx, Lcoord); + } + + geom->GetLocCoords(Gcoord, Lcoord2); + + for (int dx = 0; dx < 3; dx++) { + // calls phys evaluate which takes a loc coord not a loc collapsed coord + Gcoord2[dx] = geom->GetCoord(dx, Lcoord2); + } + nprint(Lcoord[0], Lcoord[1], Lcoord[2], "\n", Lcoord2[0], Lcoord2[1], + Lcoord2[2], "\n", Gcoord[0], Gcoord[1], Gcoord[2], "\n", Gcoord2[0], + Gcoord2[1], Gcoord2[2], "\n------"); + + auto I0 = xmap->GetBasis(0)->GetI(Lcoord); + auto I1 = xmap->GetBasis(1)->GetI(Lcoord); + auto I2 = xmap->GetBasis(2)->GetI(Lcoord); + + for (auto ix = I0->begin(); ix != I0->end(); ix++) { + nprint(*ix); + } + nprint("-----"); + const int npts = xmap->GetTotPoints(); + Array ptsx(npts), ptsy(npts), ptsz(npts); + xmap->BwdTrans(geom->GetCoeffs(0), ptsx); + xmap->BwdTrans(geom->GetCoeffs(1), ptsy); + xmap->BwdTrans(geom->GetCoeffs(2), ptsz); + + Array eta(3); + xmap->LocCoordToLocCollapsed(Lcoord, eta); + Array I(3); + I[0] = xmap->GetBasis(0)->GetI(eta); + I[1] = xmap->GetBasis(1)->GetI(eta + 1); + I[2] = xmap->GetBasis(2)->GetI(eta + 2); + const auto x = xmap->PhysEvaluate(I, ptsx); + const auto y = xmap->PhysEvaluate(I, ptsy); + const auto z = xmap->PhysEvaluate(I, ptsz); + nprint(x, y, z); + + Newton::XMapNewton mapper(sycl_target, geom); + + REAL phys0, phys1, phys2; + mapper.x(Lcoord[0], Lcoord[1], Lcoord[2], &phys0, &phys1, &phys2); + nprint(phys0, phys1, phys2); + + EXPECT_NEAR(phys0, x, 1.0e-10); + EXPECT_NEAR(phys1, y, 1.0e-10); + EXPECT_NEAR(phys2, z, 1.0e-10); + } + + mesh->free(); delete[] argv[0]; delete[] argv[1]; delete[] argv[2]; From 89bf4d401da606f538f00af4ee5f866e9b709d05 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 21 Nov 2023 16:44:53 +0000 Subject: [PATCH 06/66] interlaced bary evaluation for simultanious evaluation of multiple functions --- .../bary_interpolation/bary_evaluation.hpp | 49 ++++++++++++++++++- .../newton_generic_3d.hpp | 42 ++++++++-------- ..._particle_geometry_interface_3d_curved.cpp | 4 +- 3 files changed, 69 insertions(+), 26 deletions(-) diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp index a0a98963..99b10334 100644 --- a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -93,8 +93,7 @@ inline REAL compute_dir_10(const int num_phys0, const int num_phys1, } /** - * Computes Bary interpolation over three dimensions. The inner dimensions are - * computed with calls to compute_dir_10. + * Computes Bary interpolation over three dimensions. * * @param num_phys0 Number of quadrature points in dimension 0. * @param num_phys1 Number of quadrature points in dimension 1. @@ -125,6 +124,52 @@ inline REAL compute_dir_210(const int num_phys0, const int num_phys1, return pval2; } +/** + * Computes Bary interpolation over three dimensions. Evaluates N functions + * with interlaced quadrature point values. + * + * @param[in] num_phys0 Number of quadrature points in dimension 0. + * @param[in] num_phys1 Number of quadrature points in dimension 1. + * @param[in] num_phys2 Number of quadrature points in dimension 2. + * @param[in] physvals Array of function values at quadrature points interlaced + * values for each function to evaluate. + * @param[in] div_space0 The output of preprocess_weights applied to dimension + * 0. + * @param[in] div_space1 The output of preprocess_weights applied to + * dimension 1. + * @param[in] div_space2 The output of preprocess_weights applied to + * dimension 2. + * @param[in, out] output Output function evaluations. + */ +template +inline void compute_dir_210_interlaced( + const int num_phys0, const int num_phys1, const int num_phys2, + const REAL *const physvals, const REAL *const div_space0, + const REAL *const div_space1, const REAL *const div_space2, REAL *output) { + // writes via this tmporary until restrict keyword added TODO. + REAL tmp[N]; + for (int ix = 0; ix < N; ix++) { + tmp[ix] = 0.0; + } + const int stride = num_phys0 * num_phys1; + for (int i2 = 0; i2 < num_phys2; i2++) { + const REAL c2 = div_space2[i2]; + for (int i1 = 0; i1 < num_phys1; i1++) { + const REAL c1 = c2 * div_space1[i1]; + for (int i0 = 0; i0 < num_phys0; i0++) { + const int inner_stride = (i2 * stride + i1 * num_phys0 + i0) * N; + const REAL inner_c = div_space0[i0] * c1; + for (int ix = 0; ix < N; ix++) { + tmp[ix] += physvals[inner_stride + ix] * inner_c; + } + } + } + } + for (int ix = 0; ix < N; ix++) { + output[ix] = tmp[ix]; + } +} + /** * Compute a function evaluation at a point using the passed quadrature point * values, quadrature points and weights. diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index 2e2afe2b..cbdc7321 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -25,9 +25,7 @@ struct DataDevice { REAL *bw0; REAL *bw1; REAL *bw2; - REAL *physvals0; - REAL *physvals1; - REAL *physvals2; + REAL *physvals; }; struct DataHost { std::size_t data_size_local; @@ -96,9 +94,15 @@ struct MappingGeneric3D : MappingNewtonIterationBase { const auto physvals1 = lambda_as_vector(tmp); exp->BwdTrans(geom->GetCoeffs(2), tmp); const auto physvals2 = lambda_as_vector(tmp); - s_zbw.insert(s_zbw.end(), physvals0.begin(), physvals0.end()); - s_zbw.insert(s_zbw.end(), physvals1.begin(), physvals1.end()); - s_zbw.insert(s_zbw.end(), physvals2.begin(), physvals2.end()); + + std::vector interlaced_tmp(3 * num_physvals); + for (int ix = 0; ix < num_physvals; ix++) { + interlaced_tmp.at(3 * ix + 0) = physvals0.at(ix); + interlaced_tmp.at(3 * ix + 1) = physvals1.at(ix); + interlaced_tmp.at(3 * ix + 2) = physvals2.at(ix); + } + + s_zbw.insert(s_zbw.end(), interlaced_tmp.begin(), interlaced_tmp.end()); // Create a device buffer with the z,bw,physvals h_data->d_zbw = std::make_unique>(sycl_target, s_zbw); @@ -112,10 +116,8 @@ struct MappingGeneric3D : MappingNewtonIterationBase { d_data->bw0 = d_data->z2 + num_phys2; d_data->bw1 = d_data->bw0 + num_phys0; d_data->bw2 = d_data->bw1 + num_phys1; - d_data->physvals0 = d_data->bw2 + num_phys2; - d_data->physvals1 = d_data->physvals0 + num_physvals; - d_data->physvals2 = d_data->physvals1 + num_physvals; - NESOASSERT(d_data->physvals2 + num_physvals == + d_data->physvals = d_data->bw2 + num_phys2; + NESOASSERT(d_data->physvals + 3 * num_physvals == h_data->d_zbw->ptr + num_elements, "Error in pointer arithmetic."); @@ -176,20 +178,16 @@ struct MappingGeneric3D : MappingNewtonIterationBase { Bary::preprocess_weights(d->num_phys1, eta1, d->z1, d->bw1, div_space1); Bary::preprocess_weights(d->num_phys2, eta2, d->z2, d->bw2, div_space2); - const REAL X0 = - Bary::compute_dir_210(d->num_phys0, d->num_phys1, d->num_phys2, - d->physvals0, div_space0, div_space1, div_space2); - const REAL X1 = - Bary::compute_dir_210(d->num_phys0, d->num_phys1, d->num_phys2, - d->physvals1, div_space0, div_space1, div_space2); - const REAL X2 = - Bary::compute_dir_210(d->num_phys0, d->num_phys1, d->num_phys2, - d->physvals2, div_space0, div_space1, div_space2); + REAL X[3]; + + Bary::compute_dir_210_interlaced<3>(d->num_phys0, d->num_phys1, + d->num_phys2, d->physvals, div_space0, + div_space1, div_space2, X); // Residual is defined as F = X(xi) - P - *f0 = X0 - phys0; - *f1 = X1 - phys1; - *f2 = X2 - phys2; + *f0 = X[0] - phys0; + *f1 = X[1] - phys1; + *f2 = X[2] - phys2; const REAL norm2 = MAX(MAX(ABS(*f0), ABS(*f1)), ABS(*f2)); const REAL tol_scaling = d->tol_scaling; diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index b5657545..4aabb573 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -292,13 +292,13 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { const auto x = xmap->PhysEvaluate(I, ptsx); const auto y = xmap->PhysEvaluate(I, ptsy); const auto z = xmap->PhysEvaluate(I, ptsz); - nprint(x, y, z); + nprint("P", x, y, z); Newton::XMapNewton mapper(sycl_target, geom); REAL phys0, phys1, phys2; mapper.x(Lcoord[0], Lcoord[1], Lcoord[2], &phys0, &phys1, &phys2); - nprint(phys0, phys1, phys2); + nprint("N", phys0, phys1, phys2); EXPECT_NEAR(phys0, x, 1.0e-10); EXPECT_NEAR(phys1, y, 1.0e-10); From 9bfcf45be77972601e8a93b34a7e065b0ea7c25c Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 21 Nov 2023 17:58:26 +0000 Subject: [PATCH 07/66] bary interpolation X inverse giving sensible values for initial implementation - needs testing --- .../newton_generic_3d.hpp | 96 +++++++++++++--- .../particle_cell_mapping/x_map_newton.hpp | 106 +++++++++--------- ..._particle_geometry_interface_3d_curved.cpp | 4 + 3 files changed, 138 insertions(+), 68 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index cbdc7321..9bc7422a 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -26,6 +26,7 @@ struct DataDevice { REAL *bw1; REAL *bw2; REAL *physvals; + REAL *physvals_deriv; }; struct DataHost { std::size_t data_size_local; @@ -73,7 +74,7 @@ struct MappingGeneric3D : MappingNewtonIterationBase { // push the quadrature points and weights into a device buffer std::vector s_zbw; - const int num_elements = 2 * num_phys_total + 3 * num_physvals; + const int num_elements = 2 * num_phys_total + 12 * num_physvals; s_zbw.reserve(num_elements); s_zbw.insert(s_zbw.end(), z0.begin(), z0.end()); s_zbw.insert(s_zbw.end(), z1.begin(), z1.end()); @@ -86,22 +87,49 @@ struct MappingGeneric3D : MappingNewtonIterationBase { "Expected these two evaluations of the number of quadrature " "points to match."); - // push the physvals onto the vector - Array tmp(num_physvals); - exp->BwdTrans(geom->GetCoeffs(0), tmp); - const auto physvals0 = lambda_as_vector(tmp); - exp->BwdTrans(geom->GetCoeffs(1), tmp); - const auto physvals1 = lambda_as_vector(tmp); - exp->BwdTrans(geom->GetCoeffs(2), tmp); - const auto physvals2 = lambda_as_vector(tmp); - std::vector interlaced_tmp(3 * num_physvals); + // push the function physvals onto the vector + Array physvals0(num_physvals); + Array physvals1(num_physvals); + Array physvals2(num_physvals); + exp->BwdTrans(geom->GetCoeffs(0), physvals0); + exp->BwdTrans(geom->GetCoeffs(1), physvals1); + exp->BwdTrans(geom->GetCoeffs(2), physvals2); for (int ix = 0; ix < num_physvals; ix++) { - interlaced_tmp.at(3 * ix + 0) = physvals0.at(ix); - interlaced_tmp.at(3 * ix + 1) = physvals1.at(ix); - interlaced_tmp.at(3 * ix + 2) = physvals2.at(ix); + interlaced_tmp.at(3 * ix + 0) = physvals0[ix]; + interlaced_tmp.at(3 * ix + 1) = physvals1[ix]; + interlaced_tmp.at(3 * ix + 2) = physvals2[ix]; } + s_zbw.insert(s_zbw.end(), interlaced_tmp.begin(), interlaced_tmp.end()); + // push the function deriv phsvals onto the vector + interlaced_tmp.resize(9 * num_physvals); + + Array D0D0(num_physvals); + Array D0D1(num_physvals); + Array D0D2(num_physvals); + Array D1D0(num_physvals); + Array D1D1(num_physvals); + Array D1D2(num_physvals); + Array D2D0(num_physvals); + Array D2D1(num_physvals); + Array D2D2(num_physvals); + + // get the physvals for the derivatives + exp->PhysDeriv(physvals0, D0D0, D0D1, D0D2); + exp->PhysDeriv(physvals1, D1D0, D1D1, D1D2); + exp->PhysDeriv(physvals2, D2D0, D2D1, D2D2); + for (int ix = 0; ix < num_physvals; ix++) { + interlaced_tmp.at(9 * ix + 0) = D0D0[ix]; + interlaced_tmp.at(9 * ix + 1) = D0D1[ix]; + interlaced_tmp.at(9 * ix + 2) = D0D2[ix]; + interlaced_tmp.at(9 * ix + 3) = D1D0[ix]; + interlaced_tmp.at(9 * ix + 4) = D1D1[ix]; + interlaced_tmp.at(9 * ix + 5) = D1D2[ix]; + interlaced_tmp.at(9 * ix + 6) = D2D0[ix]; + interlaced_tmp.at(9 * ix + 7) = D2D1[ix]; + interlaced_tmp.at(9 * ix + 8) = D2D2[ix]; + } s_zbw.insert(s_zbw.end(), interlaced_tmp.begin(), interlaced_tmp.end()); // Create a device buffer with the z,bw,physvals @@ -117,7 +145,8 @@ struct MappingGeneric3D : MappingNewtonIterationBase { d_data->bw1 = d_data->bw0 + num_phys0; d_data->bw2 = d_data->bw1 + num_phys1; d_data->physvals = d_data->bw2 + num_phys2; - NESOASSERT(d_data->physvals + 3 * num_physvals == + d_data->physvals_deriv = d_data->physvals + 3 * num_physvals; + NESOASSERT(d_data->physvals_deriv + 9 * num_physvals == h_data->d_zbw->ptr + num_elements, "Error in pointer arithmetic."); @@ -152,8 +181,44 @@ struct MappingGeneric3D : MappingNewtonIterationBase { const REAL phys2, const REAL f0, const REAL f1, const REAL f2, REAL *xin0, REAL *xin1, REAL *xin2, void *local_memory) { - const Generic3D::DataDevice *data = + const Generic3D::DataDevice *d = static_cast(d_data); + + REAL eta0, eta1, eta2; + this->loc_coord_to_loc_collapsed(d_data, xi0, xi1, xi2, &eta0, &eta1, + &eta2); + REAL *div_space0 = static_cast(local_memory); + REAL *div_space1 = div_space0 + d->num_phys0; + REAL *div_space2 = div_space1 + d->num_phys1; + Bary::preprocess_weights(d->num_phys0, eta0, d->z0, d->bw0, div_space0); + Bary::preprocess_weights(d->num_phys1, eta1, d->z1, d->bw1, div_space1); + Bary::preprocess_weights(d->num_phys2, eta2, d->z2, d->bw2, div_space2); + + REAL J[9]; + Bary::compute_dir_210_interlaced<9>(d->num_phys0, d->num_phys1, + d->num_phys2, d->physvals_deriv, + div_space0, div_space1, div_space2, J); + REAL *J0 = J; + REAL *J1 = J + 3; + REAL *J2 = J + 6; + const REAL inverse_J = 1.0 / (J0[0] * (J1[1] * J2[2] - J1[2] * J2[1]) - + J0[1] * (J1[0] * J2[2] - J1[2] * J2[0]) + + J0[2] * (J1[0] * J2[1] - J1[1] * J2[0])); + + *xin0 = xi0 + ((J1[1] * J2[2] - J1[2] * J2[1]) * (-f0) - + (J0[1] * J2[2] - J0[2] * J2[1]) * (-f1) + + (J0[1] * J1[2] - J0[2] * J1[1]) * (-f2)) * + inverse_J; + + *xin1 = xi1 - ((J1[0] * J2[2] - J1[2] * J2[0]) * (-f0) - + (J0[0] * J2[2] - J0[2] * J2[0]) * (-f1) + + (J0[0] * J1[2] - J0[2] * J1[0]) * (-f2)) * + inverse_J; + + *xin2 = xi2 + ((J1[0] * J2[1] - J1[1] * J2[0]) * (-f0) - + (J0[0] * J2[1] - J0[1] * J2[0]) * (-f1) + + (J0[0] * J1[1] - J0[1] * J1[0]) * (-f2)) * + inverse_J; } inline REAL newton_residual_v(const void *d_data, const REAL xi0, @@ -164,7 +229,6 @@ struct MappingGeneric3D : MappingNewtonIterationBase { const Generic3D::DataDevice *d = static_cast(d_data); - const REAL *data_device_real = static_cast(d_data); REAL eta0, eta1, eta2; this->loc_coord_to_loc_collapsed(d_data, xi0, xi1, xi2, &eta0, &eta1, diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 46abb95a..65165529 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -97,7 +97,6 @@ template class XMapNewton { auto k_map_data = this->dh_data->d_buffer.ptr; auto k_fdata = this->dh_fdata->d_buffer.ptr; - const std::size_t num_bytes_local = this->num_bytes_local; this->sycl_target->queue @@ -155,60 +154,63 @@ template class XMapNewton { auto k_map_data = this->dh_data->d_buffer.ptr; auto k_fdata = this->dh_fdata->d_buffer.ptr; const REAL k_tol = tol; + const std::size_t num_bytes_local = this->num_bytes_local; this->sycl_target->queue .submit([&](sycl::handler &cgh) { - cgh.single_task<>([=]() { - MappingNewtonIterationBase k_newton_type{}; - - const REAL p0 = phys0; - const REAL p1 = phys1; - const REAL p2 = phys2; - - REAL k_xi0; - REAL k_xi1; - REAL k_xi2; - k_newton_type.set_initial_iteration(k_map_data, p0, p1, p2, &k_xi0, - &k_xi1, &k_xi2); - - // Start of Newton iteration - REAL xin0, xin1, xin2; - REAL f0, f1, f2; - - // TODO - REAL residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, &f2, - nullptr); - - bool diverged = false; - - for (int stepx = 0; ((stepx < k_max_iterations) && - (residual > k_tol) && (!diverged)); - stepx++) { - - // TODO - k_newton_type.newton_step(k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, - p2, f0, f1, f2, &xin0, &xin1, &xin2, - nullptr); - - k_xi0 = xin0; - k_xi1 = xin1; - k_xi2 = xin2; - - // TODO - residual = k_newton_type.newton_residual(k_map_data, k_xi0, k_xi1, - k_xi2, p0, p1, p2, &f0, - &f1, &f2, nullptr); - - diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || - (ABS(k_xi2) > 15.0); - } - - k_fdata[0] = k_xi0; - k_fdata[1] = k_xi1; - k_fdata[2] = k_xi2; - k_fdata[3] = (residual <= tol) ? 1 : -1; - }); + sycl::accessor + local_mem(sycl::range<1>(num_bytes_local), cgh); + cgh.parallel_for<>( + sycl::nd_range<1>(sycl::range<1>(1), sycl::range<1>(1)), + [=](auto idx) { + MappingNewtonIterationBase k_newton_type{}; + + const REAL p0 = phys0; + const REAL p1 = phys1; + const REAL p2 = phys2; + + REAL k_xi0; + REAL k_xi1; + REAL k_xi2; + k_newton_type.set_initial_iteration(k_map_data, p0, p1, p2, + &k_xi0, &k_xi1, &k_xi2); + + // Start of Newton iteration + REAL xin0, xin1, xin2; + REAL f0, f1, f2; + + REAL residual = k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, &f2, + &local_mem[0]); + + bool diverged = false; + + for (int stepx = 0; ((stepx < k_max_iterations) && + (residual > k_tol) && (!diverged)); + stepx++) { + + k_newton_type.newton_step(k_map_data, k_xi0, k_xi1, k_xi2, p0, + p1, p2, f0, f1, f2, &xin0, &xin1, + &xin2, &local_mem[0]); + + k_xi0 = xin0; + k_xi1 = xin1; + k_xi2 = xin2; + + residual = k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, + &f2, &local_mem[0]); + + diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || + (ABS(k_xi2) > 15.0); + } + + k_fdata[0] = k_xi0; + k_fdata[1] = k_xi1; + k_fdata[2] = k_xi2; + k_fdata[3] = (residual <= tol) ? 1 : -1; + }); }) .wait_and_throw(); diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 4aabb573..5911fd7a 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -303,6 +303,10 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { EXPECT_NEAR(phys0, x, 1.0e-10); EXPECT_NEAR(phys1, y, 1.0e-10); EXPECT_NEAR(phys2, z, 1.0e-10); + + REAL xi0, xi1, xi2; + mapper.x_inverse(phys0, phys1, phys2, &xi0, &xi1, &xi2); + nprint("Q", xi0, xi1, xi2); } mesh->free(); From 3b2354a3ad3262489ad90161fb9625879e941c24 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 22 Nov 2023 17:48:44 +0000 Subject: [PATCH 08/66] coordinate mapping for nektar curved elements refactor --- .../nektar_interface/coordinate_mapping.hpp | 53 +++++++++++++ .../mapping_newton_iteration_base.hpp | 4 + .../newton_generic_3d.hpp | 75 ++++++++----------- .../particle_cell_mapping/x_map_newton.hpp | 4 +- ..._particle_geometry_interface_3d_curved.cpp | 58 +++++++++++++- 5 files changed, 146 insertions(+), 48 deletions(-) diff --git a/include/nektar_interface/coordinate_mapping.hpp b/include/nektar_interface/coordinate_mapping.hpp index d55d5110..3a6a18aa 100644 --- a/include/nektar_interface/coordinate_mapping.hpp +++ b/include/nektar_interface/coordinate_mapping.hpp @@ -594,6 +594,59 @@ inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T &xi, eta[2] = xi2; } +/** + * Map the local coordinate (xi) to the local collapsed coordinate (eta). + * + * @param[in] shape_type Integer denoting shape type found by cast of Nektar++ + * @param[in] xi0 Local coordinate to map to collapsed coordinate, x component. + * @param[in] xi1 Local coordinate to map to collapsed coordinate, y component. + * @param[in] xi2 Local coordinate to map to collapsed coordinate, z component. + * @param[in, out] eta0 Local collapsed coordinate, x component. + * @param[in, out] eta1 Local collapsed coordinate, y component. + * @param[in, out] eta2 Local collapsed coordinate, z component. + */ +template +inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T xi0, + const T xi1, const T xi2, T *eta0, + T *eta1, T *eta2) { + + constexpr int shape_type_tet = shape_type_to_int(LibUtilities::eTetrahedron); + constexpr int shape_type_pyr = shape_type_to_int(LibUtilities::ePyramid); + constexpr int shape_type_hex = shape_type_to_int(LibUtilities::eHexahedron); + + NekDouble d2 = 1.0 - xi2; + if (fabs(d2) < NekConstants::kNekZeroTol) { + if (d2 >= 0.) { + d2 = NekConstants::kNekZeroTol; + } else { + d2 = -NekConstants::kNekZeroTol; + } + } + NekDouble d12 = -xi1 - xi2; + if (fabs(d12) < NekConstants::kNekZeroTol) { + if (d12 >= 0.) { + d12 = NekConstants::kNekZeroTol; + } else { + d12 = -NekConstants::kNekZeroTol; + } + } + + const REAL id2x2 = 2.0 / d2; + const REAL a = 1.0 + xi0; + const REAL b = (1.0 + xi1) * id2x2 - 1.0; + const REAL c = a * id2x2 - 1.0; + const REAL d = 2.0 * a / d12 - 1.0; + + *eta0 = (shape_type == shape_type_tet) ? d + : (shape_type == shape_type_hex) ? xi0 + : c; + + *eta1 = ((shape_type == shape_type_tet) || (shape_type == shape_type_pyr)) + ? b + : xi1; + *eta2 = xi2; +} + /** * Map the local coordinate (xi) to the local collapsed coordinate (eta). * diff --git a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp index e524b5a4..2761fcf8 100644 --- a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp +++ b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp @@ -9,6 +9,10 @@ using namespace Nektar::SpatialDomains; namespace NESO::Newton { +/** + * Implementations which require local memory should define a specialisation + * that sets this to true. + */ template struct local_memory_required { static bool const required = false; }; diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index 9bc7422a..0a1e25e4 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -2,6 +2,7 @@ #define ___NESO_PARTICLE_MAPPING_NEWTON_GENERIC_3D_H__ #include "../bary_interpolation/bary_evaluation.hpp" +#include "../coordinate_mapping.hpp" #include "generated_linear/linear_newton_implementation.hpp" #include "particle_cell_mapping_newton.hpp" #include @@ -184,15 +185,11 @@ struct MappingGeneric3D : MappingNewtonIterationBase { const Generic3D::DataDevice *d = static_cast(d_data); - REAL eta0, eta1, eta2; - this->loc_coord_to_loc_collapsed(d_data, xi0, xi1, xi2, &eta0, &eta1, - &eta2); REAL *div_space0 = static_cast(local_memory); REAL *div_space1 = div_space0 + d->num_phys0; REAL *div_space2 = div_space1 + d->num_phys1; - Bary::preprocess_weights(d->num_phys0, eta0, d->z0, d->bw0, div_space0); - Bary::preprocess_weights(d->num_phys1, eta1, d->z1, d->bw1, div_space1); - Bary::preprocess_weights(d->num_phys2, eta2, d->z2, d->bw2, div_space2); + // The call to Newton step always follows a call to the residual + // calculation so we assume that the div_space is already initialised. REAL J[9]; Bary::compute_dir_210_interlaced<9>(d->num_phys0, d->num_phys1, @@ -219,6 +216,7 @@ struct MappingGeneric3D : MappingNewtonIterationBase { (J0[0] * J2[1] - J0[1] * J2[0]) * (-f1) + (J0[0] * J1[1] - J0[1] * J1[0]) * (-f2)) * inverse_J; + nprint("NEW:", *xin0, *xin1, *xin2); } inline REAL newton_residual_v(const void *d_data, const REAL xi0, @@ -234,6 +232,8 @@ struct MappingGeneric3D : MappingNewtonIterationBase { this->loc_coord_to_loc_collapsed(d_data, xi0, xi1, xi2, &eta0, &eta1, &eta2); + nprint("COORDS:", xi0, xi1, xi2, eta0, eta1, eta2); + // compute X at xi by evaluating the Bary interpolation at eta REAL *div_space0 = static_cast(local_memory); REAL *div_space1 = div_space0 + d->num_phys0; @@ -248,6 +248,22 @@ struct MappingGeneric3D : MappingNewtonIterationBase { d->num_phys2, d->physvals, div_space0, div_space1, div_space2, X); + const int n0 = d->num_phys0; + const int n1 = d->num_phys1; + const int n2 = d->num_phys2; + nprint("n:", n0, n1, n2); + for (int ix = 0; ix < n0; ix++) { + nprint(div_space0[ix]); + } + for (int ix = 0; ix < n1; ix++) { + nprint(div_space1[ix]); + } + for (int ix = 0; ix < n2; ix++) { + nprint(div_space2[ix]); + } + + nprint(X[0], X[1], X[2], phys0, phys1, phys2); + // Residual is defined as F = X(xi) - P *f0 = X[0] - phys0; *f1 = X[1] - phys1; @@ -264,9 +280,9 @@ struct MappingGeneric3D : MappingNewtonIterationBase { inline void set_initial_iteration_v(const void *d_data, const REAL phys0, const REAL phys1, const REAL phys2, REAL *xi0, REAL *xi1, REAL *xi2) { - *xi0 = 0.0; - *xi1 = 0.0; - *xi2 = 0.0; + *xi0 = -0.2; + *xi1 = -0.2; + *xi2 = -0.2; } inline void loc_coord_to_loc_collapsed_v(const void *d_data, const REAL xi0, @@ -277,45 +293,14 @@ struct MappingGeneric3D : MappingNewtonIterationBase { static_cast(d_data); const int shape_type = data->shape_type_int; - constexpr int shape_type_tet = - shape_type_to_int(LibUtilities::eTetrahedron); - constexpr int shape_type_pyr = shape_type_to_int(LibUtilities::ePyramid); - constexpr int shape_type_hex = shape_type_to_int(LibUtilities::eHexahedron); - - NekDouble d2 = 1.0 - xi2; - if (fabs(d2) < NekConstants::kNekZeroTol) { - if (d2 >= 0.) { - d2 = NekConstants::kNekZeroTol; - } else { - d2 = -NekConstants::kNekZeroTol; - } - } - NekDouble d12 = -xi1 - xi2; - if (fabs(d12) < NekConstants::kNekZeroTol) { - if (d12 >= 0.) { - d12 = NekConstants::kNekZeroTol; - } else { - d12 = -NekConstants::kNekZeroTol; - } - } - - const REAL id2x2 = 2.0 / d2; - const REAL a = 1.0 + xi0; - const REAL b = (1.0 + xi1) * id2x2 - 1.0; - const REAL c = a * id2x2 - 1.0; - const REAL d = 2.0 * a / d12 - 1.0; - - *eta0 = (shape_type == shape_type_tet) ? d - : (shape_type == shape_type_hex) ? xi0 - : c; - - *eta1 = ((shape_type == shape_type_tet) || (shape_type == shape_type_pyr)) - ? b - : xi1; - *eta2 = xi2; + GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type, xi0, xi1, xi2, + eta0, eta1, eta2); } }; +/** + * This implementation requires local memory. + */ template <> struct local_memory_required { static bool const required = true; }; diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 65165529..0f151452 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -164,6 +164,7 @@ template class XMapNewton { cgh.parallel_for<>( sycl::nd_range<1>(sycl::range<1>(1), sycl::range<1>(1)), [=](auto idx) { + printf("NEWTON:\n"); MappingNewtonIterationBase k_newton_type{}; const REAL p0 = phys0; @@ -185,10 +186,11 @@ template class XMapNewton { &local_mem[0]); bool diverged = false; - + printf("residual: %f\n", residual); for (int stepx = 0; ((stepx < k_max_iterations) && (residual > k_tol) && (!diverged)); stepx++) { + printf("STEPX: %d, RES: %f\n", stepx, residual); k_newton_type.newton_step(k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f0, f1, f2, &xin0, &xin1, diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 5911fd7a..cd25dd53 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -239,6 +239,7 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { for (auto gx : geoms) { auto geom = gx.second; auto xmap = geom->GetXmap(); + const int shape_type_int = static_cast(geom->GetShapeType()); nprint(geom->GetShapeType(), lambda_stype(geom->GetShapeType())); nprint("Num bases:", xmap->GetNumBases()); for (int dx = 0; dx < 3; dx++) { @@ -254,6 +255,7 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { Lcoord[1] = -0.05; Lcoord[2] = -0.05; + for (int dx = 0; dx < 3; dx++) { // calls phys evaluate which takes a loc coord not a loc collapsed coord Gcoord[dx] = geom->GetCoord(dx, Lcoord); @@ -303,10 +305,62 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { EXPECT_NEAR(phys0, x, 1.0e-10); EXPECT_NEAR(phys1, y, 1.0e-10); EXPECT_NEAR(phys2, z, 1.0e-10); + + + const REAL xi00 = Lcoord[0]; + const REAL xi01 = Lcoord[1]; + const REAL xi02 = Lcoord[2]; + REAL eta0, eta1, eta2; + + GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi00, + xi01, xi02, &eta0, + &eta1, &eta2); + EXPECT_NEAR(eta0, eta[0], 1.0e-12); + EXPECT_NEAR(eta1, eta[1], 1.0e-12); + EXPECT_NEAR(eta2, eta[2], 1.0e-12); + nprint("coords:", xi00, xi01, xi02, eta0, eta1, eta2); REAL xi0, xi1, xi2; - mapper.x_inverse(phys0, phys1, phys2, &xi0, &xi1, &xi2); - nprint("Q", xi0, xi1, xi2); + const bool converged = + mapper.x_inverse(phys0, phys1, phys2, &xi0, &xi1, &xi2, 1.0e-10); + nprint("Q", xi0, xi1, xi2, converged); + // these might be quite far depending on the map - the residual is on the X + // map output + EXPECT_NEAR(xi0, Lcoord[0], 1.0e-2); + EXPECT_NEAR(xi1, Lcoord[1], 1.0e-2); + EXPECT_NEAR(xi2, Lcoord[2], 1.0e-2); + + Array Lcoordt(3); + Lcoordt[0] = xi0; + Lcoordt[1] = xi1; + Lcoordt[2] = xi2; + const REAL g0 = geom->GetCoord(0, Lcoordt); + const REAL g1 = geom->GetCoord(1, Lcoordt); + const REAL g2 = geom->GetCoord(2, Lcoordt); + EXPECT_NEAR(g0, Gcoord[0], 1.0e-5); + EXPECT_NEAR(g1, Gcoord[1], 1.0e-5); + EXPECT_NEAR(g2, Gcoord[2], 1.0e-5); + + + + if (static_cast(geom->GetShapeType()) == 5) { + auto z0 = xmap->GetBase()[0]->GetZ(); + auto bw0 = xmap->GetBase()[0]->GetBaryWeights(); + const int N0 = 4; + std::vector div_space0(N0); + Bary::preprocess_weights(N0, eta[0], &z0[0], &bw0[0], div_space0.data()); + for (int ix = 0; ix < N0; ix++) { + nprint("host0:", ix, div_space0[ix]); + } + auto z1 = xmap->GetBase()[1]->GetZ(); + auto bw1 = xmap->GetBase()[1]->GetBaryWeights(); + const int N1 = 3; + std::vector div_space1(N1); + Bary::preprocess_weights(N1, eta[1], &z1[0], &bw1[0], div_space1.data()); + for (int ix = 0; ix < N1; ix++) { + nprint("host1:", ix, div_space1[ix]); + } + } } mesh->free(); From a8542d28b14aff7f53aaf9316c6db15932676fc2 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 8 Jan 2024 17:10:20 +0000 Subject: [PATCH 09/66] higher order x map test refactoring --- .../newton_generic_3d.hpp | 2 + neso-particles | 2 +- ..._particle_geometry_interface_3d_curved.cpp | 231 ++++++++++-------- 3 files changed, 128 insertions(+), 107 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index 0a1e25e4..0101f3a6 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -232,6 +232,7 @@ struct MappingGeneric3D : MappingNewtonIterationBase { this->loc_coord_to_loc_collapsed(d_data, xi0, xi1, xi2, &eta0, &eta1, &eta2); + nprint("PHYS:", phys0, phys1, phys2); nprint("COORDS:", xi0, xi1, xi2, eta0, eta1, eta2); // compute X at xi by evaluating the Bary interpolation at eta @@ -271,6 +272,7 @@ struct MappingGeneric3D : MappingNewtonIterationBase { const REAL norm2 = MAX(MAX(ABS(*f0), ABS(*f1)), ABS(*f2)); const REAL tol_scaling = d->tol_scaling; + nprint("TOL SCALING:", tol_scaling); const REAL scaled_norm2 = norm2 * tol_scaling; return scaled_norm2; } diff --git a/neso-particles b/neso-particles index 9c6b4626..196069f9 160000 --- a/neso-particles +++ b/neso-particles @@ -1 +1 @@ -Subproject commit 9c6b4626645f6aaaca478e4798f2fdee5dd2675b +Subproject commit 196069f90b5d52a09f9260c6f5c17a54d1a46c28 diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index cd25dd53..98e7c5b2 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -236,57 +236,19 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { } }; - for (auto gx : geoms) { - auto geom = gx.second; + auto lambda_forward_map = [&](auto geom, const auto &xi, auto &phys) { + // Evaluate the forward map from xi to physical space using the expansion. auto xmap = geom->GetXmap(); - const int shape_type_int = static_cast(geom->GetShapeType()); - nprint(geom->GetShapeType(), lambda_stype(geom->GetShapeType())); - nprint("Num bases:", xmap->GetNumBases()); - for (int dx = 0; dx < 3; dx++) { - nprint("dx:", dx, "type:", lambda_btype(xmap->GetBasisType(dx)), - xmap->GetBasisNumModes(dx)); - } - - Array Lcoord(3); - Array Lcoord2(3); - Array Gcoord(3); - Array Gcoord2(3); - Lcoord[0] = -0.05; - Lcoord[1] = -0.05; - Lcoord[2] = -0.05; - - - for (int dx = 0; dx < 3; dx++) { - // calls phys evaluate which takes a loc coord not a loc collapsed coord - Gcoord[dx] = geom->GetCoord(dx, Lcoord); - } - - geom->GetLocCoords(Gcoord, Lcoord2); - - for (int dx = 0; dx < 3; dx++) { - // calls phys evaluate which takes a loc coord not a loc collapsed coord - Gcoord2[dx] = geom->GetCoord(dx, Lcoord2); - } - nprint(Lcoord[0], Lcoord[1], Lcoord[2], "\n", Lcoord2[0], Lcoord2[1], - Lcoord2[2], "\n", Gcoord[0], Gcoord[1], Gcoord[2], "\n", Gcoord2[0], - Gcoord2[1], Gcoord2[2], "\n------"); - - auto I0 = xmap->GetBasis(0)->GetI(Lcoord); - auto I1 = xmap->GetBasis(1)->GetI(Lcoord); - auto I2 = xmap->GetBasis(2)->GetI(Lcoord); - - for (auto ix = I0->begin(); ix != I0->end(); ix++) { - nprint(*ix); - } - nprint("-----"); + auto I0 = xmap->GetBasis(0)->GetI(xi); + auto I1 = xmap->GetBasis(1)->GetI(xi); + auto I2 = xmap->GetBasis(2)->GetI(xi); const int npts = xmap->GetTotPoints(); Array ptsx(npts), ptsy(npts), ptsz(npts); xmap->BwdTrans(geom->GetCoeffs(0), ptsx); xmap->BwdTrans(geom->GetCoeffs(1), ptsy); xmap->BwdTrans(geom->GetCoeffs(2), ptsz); - Array eta(3); - xmap->LocCoordToLocCollapsed(Lcoord, eta); + xmap->LocCoordToLocCollapsed(xi, eta); Array I(3); I[0] = xmap->GetBasis(0)->GetI(eta); I[1] = xmap->GetBasis(1)->GetI(eta + 1); @@ -294,73 +256,130 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { const auto x = xmap->PhysEvaluate(I, ptsx); const auto y = xmap->PhysEvaluate(I, ptsy); const auto z = xmap->PhysEvaluate(I, ptsz); - nprint("P", x, y, z); + phys[0] = x; + phys[1] = y; + phys[2] = z; + }; - Newton::XMapNewton mapper(sycl_target, geom); + auto lambda_test_contained_dir = [](const REAL eta) -> REAL { + if ((eta >= -1.0) && (eta <= 1.0)) { + return 0.0; + } else { + if (eta < -1.0) { + return -1.0 - eta; + } else { + return eta - 1.0; + } + } + }; - REAL phys0, phys1, phys2; - mapper.x(Lcoord[0], Lcoord[1], Lcoord[2], &phys0, &phys1, &phys2); - nprint("N", phys0, phys1, phys2); - - EXPECT_NEAR(phys0, x, 1.0e-10); - EXPECT_NEAR(phys1, y, 1.0e-10); - EXPECT_NEAR(phys2, z, 1.0e-10); - - - const REAL xi00 = Lcoord[0]; - const REAL xi01 = Lcoord[1]; - const REAL xi02 = Lcoord[2]; - REAL eta0, eta1, eta2; + auto lambda_test_contained = [&](const auto eta0, const auto eta1, + const auto eta2) -> REAL { + return std::max(lambda_test_contained_dir(eta0), + std::max(lambda_test_contained_dir(eta1), + lambda_test_contained_dir(eta2))); + }; - GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi00, - xi01, xi02, &eta0, - &eta1, &eta2); - EXPECT_NEAR(eta0, eta[0], 1.0e-12); - EXPECT_NEAR(eta1, eta[1], 1.0e-12); - EXPECT_NEAR(eta2, eta[2], 1.0e-12); - nprint("coords:", xi00, xi01, xi02, eta0, eta1, eta2); - - REAL xi0, xi1, xi2; - const bool converged = - mapper.x_inverse(phys0, phys1, phys2, &xi0, &xi1, &xi2, 1.0e-10); - nprint("Q", xi0, xi1, xi2, converged); - // these might be quite far depending on the map - the residual is on the X - // map output - EXPECT_NEAR(xi0, Lcoord[0], 1.0e-2); - EXPECT_NEAR(xi1, Lcoord[1], 1.0e-2); - EXPECT_NEAR(xi2, Lcoord[2], 1.0e-2); - - Array Lcoordt(3); - Lcoordt[0] = xi0; - Lcoordt[1] = xi1; - Lcoordt[2] = xi2; - const REAL g0 = geom->GetCoord(0, Lcoordt); - const REAL g1 = geom->GetCoord(1, Lcoordt); - const REAL g2 = geom->GetCoord(2, Lcoordt); - EXPECT_NEAR(g0, Gcoord[0], 1.0e-5); - EXPECT_NEAR(g1, Gcoord[1], 1.0e-5); - EXPECT_NEAR(g2, Gcoord[2], 1.0e-5); - - - - if (static_cast(geom->GetShapeType()) == 5) { - auto z0 = xmap->GetBase()[0]->GetZ(); - auto bw0 = xmap->GetBase()[0]->GetBaryWeights(); - const int N0 = 4; - std::vector div_space0(N0); - Bary::preprocess_weights(N0, eta[0], &z0[0], &bw0[0], div_space0.data()); - for (int ix = 0; ix < N0; ix++) { - nprint("host0:", ix, div_space0[ix]); - } - auto z1 = xmap->GetBase()[1]->GetZ(); - auto bw1 = xmap->GetBase()[1]->GetBaryWeights(); - const int N1 = 3; - std::vector div_space1(N1); - Bary::preprocess_weights(N1, eta[1], &z1[0], &bw1[0], div_space1.data()); - for (int ix = 0; ix < N1; ix++) { - nprint("host1:", ix, div_space1[ix]); + auto rng = std::mt19937(9457 + rank); + auto lambda_sample_internal_point = [&](auto geom, Array &xi, + Array &phys) { + auto contained = false; + auto bounding_box = geom->GetBoundingBox(); + std::uniform_real_distribution uniform0(bounding_box[0], + bounding_box[3]); + std::uniform_real_distribution uniform1(bounding_box[1], + bounding_box[4]); + std::uniform_real_distribution uniform2(bounding_box[2], + bounding_box[5]); + + INT c = 0; + while (!contained) { + phys[0] = uniform0(rng); + phys[1] = uniform1(rng); + phys[2] = uniform2(rng); + contained = geom->ContainsPoint(phys, xi, 1.0e-12); + if (1e4 < c++) { + nprint( + "Test point sampling is taking an excessive number of iterations."); } } + lambda_forward_map(geom, xi, phys); + }; + + auto lambda_check_x_map = [&](auto geom, Array &xi, + Array &phys) { + nprint("CHECK X MAP START", xi[0], xi[1], xi[2], phys[0], phys[1], phys[2]); + + REAL eta0, eta1, eta2; + const int shape_type_int = static_cast(geom->GetShapeType()); + // The point we sampled was considered contained by Nektar++ + // Check that this alternative reference point is also contained. + const REAL xi00 = xi[0]; + const REAL xi01 = xi[1]; + const REAL xi02 = xi[2]; + GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi00, xi01, + xi02, &eta0, &eta1, &eta2); + const auto dist = lambda_test_contained(eta0, eta1, eta2); + nprint("dist0", dist, eta0, eta1, eta2); + EXPECT_TRUE(dist < 1.0e-8); + + // test the forward x map from reference space to physical space + Newton::XMapNewton mapper(sycl_target, geom); + REAL test_phys0, test_phys1, test_phys2; + mapper.x(xi[0], xi[1], xi[2], &test_phys0, &test_phys1, &test_phys2); + EXPECT_NEAR(phys[0], test_phys0, 1.0e-10); + EXPECT_NEAR(phys[1], test_phys1, 1.0e-10); + EXPECT_NEAR(phys[2], test_phys2, 1.0e-10); + + REAL test_xi0, test_xi1, test_xi2; + const bool converged = mapper.x_inverse( + phys[0], phys[1], phys[2], &test_xi0, &test_xi1, &test_xi2, 1.0e-10); + EXPECT_TRUE(converged); + + const bool same_xi = (std::abs(test_xi0 - xi[0]) < 1.0e-8) && + (std::abs(test_xi1 - xi[1]) < 1.0e-8) && + (std::abs(test_xi2 - xi[2]) < 1.0e-8); + + // If the test_xi is xi then the inverse mapping was good + // Otherwise check test_xi is a reference coordinate that maps to phys + if (!same_xi) { + Array test_phys(3); + lambda_forward_map(geom, xi, test_phys); + const bool equiv_xi = (std::abs(test_phys[0] - phys[0]) < 1.0e-8) && + (std::abs(test_phys[1] - phys[1]) < 1.0e-8) && + (std::abs(test_phys[2] - phys[2]) < 1.0e-8); + + // The point we sampled was considered contained by Nektar++ + // Check that this alternative reference point is also contained. + const REAL xi00 = test_xi0; + const REAL xi01 = test_xi1; + const REAL xi02 = test_xi2; + GeometryInterface::loc_coord_to_loc_collapsed_3d( + shape_type_int, xi00, xi01, xi02, &eta0, &eta1, &eta2); + + const auto dist = lambda_test_contained(eta0, eta1, eta2); + nprint("dist1", dist, eta0, eta1, eta2); + EXPECT_TRUE(dist < 1.0e-8); + } + + nprint("CHECK X MAP END"); + }; + + for (auto gx : geoms) { + auto geom = gx.second; + auto xmap = geom->GetXmap(); + const int shape_type_int = static_cast(geom->GetShapeType()); + nprint(geom->GetShapeType(), lambda_stype(geom->GetShapeType())); + nprint("Num bases:", xmap->GetNumBases()); + for (int dx = 0; dx < 3; dx++) { + nprint("dx:", dx, "type:", lambda_btype(xmap->GetBasisType(dx)), + xmap->GetBasisNumModes(dx)); + } + + Array test_xi(3); + Array test_phys(3); + lambda_sample_internal_point(geom, test_xi, test_phys); + lambda_check_x_map(geom, test_xi, test_phys); } mesh->free(); From ca1410883eb48bd9f6b7674afba4308f8d35e5df Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 21 Oct 2024 12:51:07 +0100 Subject: [PATCH 10/66] updated some of the Newton interfaces which need updating for local memory --- .../particle_cell_mapping/newton_quad_embed_3d.hpp | 2 +- .../particle_cell_mapping/newton_triangle_embed_3d.hpp | 2 +- .../composite_interaction/composite_collections.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp index 71480933..4877c9b4 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp @@ -14,7 +14,7 @@ namespace Newton { struct MappingQuadLinear2DEmbed3D : MappingNewtonIterationBase { - inline void write_data_v(GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp index 6ec3741d..4bb16d0e 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp @@ -19,7 +19,7 @@ namespace Newton { struct MappingTriangleLinear2DEmbed3D : MappingNewtonIterationBase { - inline void write_data_v(GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/src/nektar_interface/composite_interaction/composite_collections.cpp b/src/nektar_interface/composite_interaction/composite_collections.cpp index b11fa2ee..4e2673b5 100644 --- a/src/nektar_interface/composite_interaction/composite_collections.cpp +++ b/src/nektar_interface/composite_interaction/composite_collections.cpp @@ -87,7 +87,7 @@ void CompositeCollections::collect_cell(const INT cell) { for (int gx = 0; gx < num_quads; gx++) { auto remote_geom = remote_quads[gx]; auto geom = remote_geom->geom; - mapper_quads.write_data(geom, nullptr, + mapper_quads.write_data(this->sycl_target, geom, nullptr, map_data_quads + gx * stride_quads); LinePlaneIntersection lpi(geom); buf_lpi.push_back(lpi); @@ -106,7 +106,7 @@ void CompositeCollections::collect_cell(const INT cell) { for (int gx = 0; gx < num_tris; gx++) { auto remote_geom = remote_tris[gx]; auto geom = remote_geom->geom; - mapper_tris.write_data(geom, nullptr, map_data_tris + gx * stride_tris); + mapper_tris.write_data(this->sycl_target, geom, nullptr, map_data_tris + gx * stride_tris); LinePlaneIntersection lpi(geom); buf_lpi.push_back(lpi); const auto composite_id = remote_geom->rank; From 5b1031a1d54a82961f74efd10ba7b2d6ffe43588 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 22 Oct 2024 17:11:50 +0100 Subject: [PATCH 11/66] progress updating curved mesh branch to work after mergin in main --- .../map_particles_newton.hpp | 210 ------------------ .../newton_quad_embed_3d.hpp | 3 +- .../newton_triangle_embed_3d.hpp | 3 +- .../x_map_newton_kernel.hpp | 18 +- .../composite_collections.cpp | 5 +- .../composite_intersection.cpp | 14 +- 6 files changed, 31 insertions(+), 222 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp index 48bdd1be..eb45a468 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -504,216 +504,6 @@ class MapParticlesNewton : public CoarseMappersBase { if (map_cell != -1) { this->map_final(particle_group, map_cell); } - - auto &clm = this->coarse_lookup_map; - // Get kernel pointers to the mesh data. - const auto &mesh = clm->cartesian_mesh; - const auto k_mesh_cell_count = mesh->get_cell_count(); - const auto k_mesh_origin = mesh->dh_origin->d_buffer.ptr; - const auto k_mesh_cell_counts = mesh->dh_cell_counts->d_buffer.ptr; - const auto k_mesh_inverse_cell_widths = - mesh->dh_inverse_cell_widths->d_buffer.ptr; - // Get kernel pointers to the map data. - const auto k_map_cell_ids = this->dh_cell_ids->d_buffer.ptr; - const auto k_map_mpi_ranks = this->dh_mpi_ranks->d_buffer.ptr; - const auto k_map_type = this->dh_type->d_buffer.ptr; - const auto k_map_data = this->dh_data->d_buffer.ptr; - const auto k_map = clm->dh_map->d_buffer.ptr; - const auto k_map_sizes = clm->dh_map_sizes->d_buffer.ptr; - const auto k_map_stride = clm->map_stride; - const double k_tol = this->newton_tol; - const int k_ndim = this->ndim; - const int k_num_bytes_per_map_device = this->num_bytes_per_map_device; - const int k_max_iterations = this->newton_max_iteration; - - // Get kernel pointers to the ParticleDats - const auto position_dat = particle_group.position_dat; - const auto k_part_positions = position_dat->cell_dat.device_ptr(); - auto k_part_cell_ids = particle_group.cell_id_dat->cell_dat.device_ptr(); - auto k_part_mpi_ranks = particle_group.mpi_rank_dat->cell_dat.device_ptr(); - auto k_part_ref_positions = - particle_group[Sym("NESO_REFERENCE_POSITIONS")] - ->cell_dat.device_ptr(); - - // Get iteration set for particles, two cases single cell case or all cells - const int max_cell_occupancy = (map_cell > -1) - ? position_dat->h_npart_cell[map_cell] - : position_dat->cell_dat.get_nrow_max(); - const int k_cell_offset = (map_cell > -1) ? map_cell : 0; - const std::size_t local_size = 256; - const auto div_mod = std::div(max_cell_occupancy, local_size); - const int outer_size = div_mod.quot + (div_mod.rem == 0 ? 0 : 1); - const std::size_t cell_count = - (map_cell > -1) - ? 1 - : static_cast(position_dat->cell_dat.ncells); - sycl::range<2> outer_iterset{local_size * outer_size, cell_count}; - sycl::range<2> local_iterset{local_size, 1}; - const auto k_npart_cell = position_dat->d_npart_cell; - - this->ep->reset(); - auto k_ep = this->ep->device_ptr(); - - this->sycl_target->queue - .submit([&](sycl::handler &cgh) { - cgh.parallel_for<>( - sycl::nd_range<2>(outer_iterset, local_iterset), - [=](sycl::nd_item<2> idx) { - const int cellx = idx.get_global_id(1) + k_cell_offset; - const int layerx = idx.get_global_id(0); - if (layerx < k_npart_cell[cellx]) { - if (k_part_mpi_ranks[cellx][1][layerx] < 0) { - - // read the position of the particle - const REAL p0 = k_part_positions[cellx][0][layerx]; - const REAL p1 = - (k_ndim > 1) ? k_part_positions[cellx][1][layerx] : 0.0; - const REAL p2 = - (k_ndim > 2) ? k_part_positions[cellx][2][layerx] : 0.0; - const REAL shifted_p0 = p0 - k_mesh_origin[0]; - const REAL shifted_p1 = - (k_ndim > 1) ? p1 - k_mesh_origin[1] : 0.0; - const REAL shifted_p2 = - (k_ndim > 2) ? p2 - k_mesh_origin[2] : 0.0; - - // determine the cartesian mesh cell for the position - int c0 = (k_mesh_inverse_cell_widths[0] * shifted_p0); - int c1 = (k_ndim > 1) - ? (k_mesh_inverse_cell_widths[1] * shifted_p1) - : 0; - int c2 = (k_ndim > 2) - ? (k_mesh_inverse_cell_widths[2] * shifted_p2) - : 0; - c0 = (c0 < 0) ? 0 : c0; - c1 = (c1 < 0) ? 0 : c1; - c2 = (c2 < 0) ? 0 : c2; - c0 = (c0 >= k_mesh_cell_counts[0]) - ? k_mesh_cell_counts[0] - 1 - : c0; - if (k_ndim > 1) { - c1 = (c1 >= k_mesh_cell_counts[1]) - ? k_mesh_cell_counts[1] - 1 - : c1; - } - if (k_ndim > 2) { - c2 = (c2 >= k_mesh_cell_counts[2]) - ? k_mesh_cell_counts[2] - 1 - : c2; - } - - const int mcc0 = k_mesh_cell_counts[0]; - const int mcc1 = (k_ndim > 1) ? k_mesh_cell_counts[1] : 0; - const int linear_mesh_cell = - c0 + c1 * mcc0 + c2 * mcc0 * mcc1; - - const bool valid_cell = - (linear_mesh_cell >= 0) && - (linear_mesh_cell < k_mesh_cell_count); - // loop over the candidate geometry objects - bool cell_found = false; - for (int candidate_cell = 0; - (candidate_cell < k_map_sizes[linear_mesh_cell]) && - (valid_cell); - candidate_cell++) { - const int geom_map_index = - k_map[linear_mesh_cell * k_map_stride + - candidate_cell]; - - const char *map_data = - (k_num_bytes_per_map_device) - ? &k_map_data[geom_map_index * - k_num_bytes_per_map_device] - : nullptr; - - REAL xi0; - REAL xi1; - REAL xi2; - MappingNewtonIterationBase k_newton_type{}; - k_newton_type.set_initial_iteration(map_data, p0, p1, p2, - &xi0, &xi1, &xi2); - - // Start of Newton iteration - REAL xin0, xin1, xin2; - REAL f0, f1, f2; - - // TODO - REAL residual = k_newton_type.newton_residual( - map_data, xi0, xi1, xi2, p0, p1, p2, &f0, &f1, &f2, - nullptr); - - bool diverged = false; - - for (int stepx = 0; ((stepx < k_max_iterations) && - (residual > k_tol) && (!diverged)); - stepx++) { - - // TODO - k_newton_type.newton_step(map_data, xi0, xi1, xi2, p0, - p1, p2, f0, f1, f2, &xin0, - &xin1, &xin2, nullptr); - - xi0 = xin0; - xi1 = xin1; - xi2 = xin2; - - // TODO - residual = k_newton_type.newton_residual( - map_data, xi0, xi1, xi2, p0, p1, p2, &f0, &f1, &f2, - nullptr); - - diverged = (ABS(xi0) > 15.0) || (ABS(xi1) > 15.0) || - (ABS(xi2) > 15.0); - } - - bool converged = (residual <= k_tol); - REAL eta0; - REAL eta1; - REAL eta2; - - k_newton_type.loc_coord_to_loc_collapsed( - map_data, xi0, xi1, xi2, &eta0, &eta1, &eta2); - - bool contained = - ((eta0 <= 1.0) && (eta0 >= -1.0) && (eta1 <= 1.0) && - (eta1 >= -1.0) && (eta2 <= 1.0) && (eta2 >= -1.0) && - converged); - - REAL dist = 0.0; - if ((!contained) && converged) { - dist = (eta0 < -1.0) ? (-1.0 - eta0) : 0.0; - dist = - std::max(dist, (eta0 > 1.0) ? (eta0 - 1.0) : 0.0); - dist = - std::max(dist, (eta1 < -1.0) ? (-1.0 - eta1) : 0.0); - dist = - std::max(dist, (eta1 > 1.0) ? (eta1 - 1.0) : 0.0); - dist = - std::max(dist, (eta2 < -1.0) ? (-1.0 - eta2) : 0.0); - dist = - std::max(dist, (eta2 > 1.0) ? (eta2 - 1.0) : 0.0); - } - - cell_found = (dist <= k_tol) && converged; - if (cell_found) { - const int geom_id = k_map_cell_ids[geom_map_index]; - const int mpi_rank = k_map_mpi_ranks[geom_map_index]; - k_part_cell_ids[cellx][0][layerx] = geom_id; - k_part_mpi_ranks[cellx][1][layerx] = mpi_rank; - k_part_ref_positions[cellx][0][layerx] = xi0; - if (k_ndim > 1) { - k_part_ref_positions[cellx][1][layerx] = xi1; - } - if (k_ndim > 2) { - k_part_ref_positions[cellx][2][layerx] = xi2; - } - break; - } - } - } - } - }); - }) - .wait_and_throw(); } }; diff --git a/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp index 71480933..143ea5cd 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp @@ -14,7 +14,8 @@ namespace Newton { struct MappingQuadLinear2DEmbed3D : MappingNewtonIterationBase { - inline void write_data_v(GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp index 6ec3741d..6390ded7 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp @@ -19,7 +19,8 @@ namespace Newton { struct MappingTriangleLinear2DEmbed3D : MappingNewtonIterationBase { - inline void write_data_v(GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp index 598e376d..0d959053 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp @@ -26,9 +26,11 @@ template struct XMapNewtonKernel { * @param[in, out] phys0 Global position X(xi), x component. * @param[in, out] phys1 Global position X(xi), y component. * @param[in, out] phys2 Global position X(xi), z component. + * @param[in, out] local_memory Local memory as required by the Newton + * implementation. May be modified by this function. */ inline void x(const void *map_data, const REAL xi0, const REAL xi1, - const REAL xi2, REAL *phys0, REAL *phys1, REAL *phys2) { + const REAL xi2, REAL *phys0, REAL *phys1, REAL *phys2, void * local_memory) { *phys0 = 0.0; *phys1 = 0.0; @@ -39,7 +41,7 @@ template struct XMapNewtonKernel { MappingNewtonIterationBase k_newton_type{}; k_newton_type.newton_residual(map_data, xi0, xi1, xi2, p0, p1, p2, phys0, - phys1, phys2); + phys1, phys2, local_memory); } /** @@ -53,6 +55,8 @@ template struct XMapNewtonKernel { * @param[in, out] xi0 Reference position, x component. * @param[in, out] xi1 Reference position, y component. * @param[in, out] xi2 Reference position, z component. + * @param[in, out] local_memory Local memory as required by the Newton + * implementation. May be modified by this function. * @param[in] max_iterations Maximum number of Newton iterations. * @param[in] tol Optional exit tolerance for Newton iterations * (default 1.0e-10). @@ -62,7 +66,9 @@ template struct XMapNewtonKernel { */ inline bool x_inverse(const void *map_data, const REAL phys0, const REAL phys1, const REAL phys2, REAL *xi0, - REAL *xi1, REAL *xi2, const INT max_iterations, + REAL *xi1, REAL *xi2, + void * local_memory, + const INT max_iterations, const REAL tol = 1.0e-10, const bool initial_override = false) { @@ -87,7 +93,7 @@ template struct XMapNewtonKernel { REAL f0, f1, f2; REAL residual = k_newton_type.newton_residual(map_data, k_xi0, k_xi1, k_xi2, - p0, p1, p2, &f0, &f1, &f2); + p0, p1, p2, &f0, &f1, &f2, local_memory); bool diverged = false; @@ -95,14 +101,14 @@ template struct XMapNewtonKernel { ((stepx < max_iterations) && (residual > tol) && (!diverged)); stepx++) { k_newton_type.newton_step(map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f0, - f1, f2, &xin0, &xin1, &xin2); + f1, f2, &xin0, &xin1, &xin2, local_memory); k_xi0 = xin0; k_xi1 = xin1; k_xi2 = xin2; residual = k_newton_type.newton_residual(map_data, k_xi0, k_xi1, k_xi2, - p0, p1, p2, &f0, &f1, &f2); + p0, p1, p2, &f0, &f1, &f2, local_memory); diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || (ABS(k_xi2) > 15.0); diff --git a/src/nektar_interface/composite_interaction/composite_collections.cpp b/src/nektar_interface/composite_interaction/composite_collections.cpp index b11fa2ee..3e320b2f 100644 --- a/src/nektar_interface/composite_interaction/composite_collections.cpp +++ b/src/nektar_interface/composite_interaction/composite_collections.cpp @@ -87,7 +87,7 @@ void CompositeCollections::collect_cell(const INT cell) { for (int gx = 0; gx < num_quads; gx++) { auto remote_geom = remote_quads[gx]; auto geom = remote_geom->geom; - mapper_quads.write_data(geom, nullptr, + mapper_quads.write_data(this->sycl_target, geom, nullptr, map_data_quads + gx * stride_quads); LinePlaneIntersection lpi(geom); buf_lpi.push_back(lpi); @@ -106,7 +106,8 @@ void CompositeCollections::collect_cell(const INT cell) { for (int gx = 0; gx < num_tris; gx++) { auto remote_geom = remote_tris[gx]; auto geom = remote_geom->geom; - mapper_tris.write_data(geom, nullptr, map_data_tris + gx * stride_tris); + mapper_tris.write_data(this->sycl_target, geom, nullptr, + map_data_tris + gx * stride_tris); LinePlaneIntersection lpi(geom); buf_lpi.push_back(lpi); const auto composite_id = remote_geom->rank; diff --git a/src/nektar_interface/composite_interaction/composite_intersection.cpp b/src/nektar_interface/composite_interaction/composite_intersection.cpp index e101cb22..70a64624 100644 --- a/src/nektar_interface/composite_interaction/composite_intersection.cpp +++ b/src/nektar_interface/composite_interaction/composite_intersection.cpp @@ -401,6 +401,11 @@ void CompositeIntersection::find_intersections_3d( const int k_grid_size_y = grid_size; const REAL k_grid_width = 2.0 / grid_size; + static_assert( + !Newton::local_memory_required::required, + "Did not expect local memory to be required for this Newton implemenation" + ); + particle_loop( "CompositeIntersection::find_intersections_3d_quads", iteration_set, [=](auto k_P, auto k_PP, auto k_OUT_P, auto k_OUT_C) { @@ -514,7 +519,7 @@ void CompositeIntersection::find_intersections_3d( const bool converged = k_newton_kernel.x_inverse( map_data, i0, i1, i2, &xi[0], &xi[1], &xi[2], - k_max_iterations, k_newton_tol, true); + nullptr, k_max_iterations, k_newton_tol, true); k_newton_type.loc_coord_to_loc_collapsed( map_data, xi[0], xi[1], xi[2], &eta0, &eta1, @@ -558,6 +563,11 @@ void CompositeIntersection::find_intersections_3d( Access::write(dat_positions->sym), Access::write(dat_composite->sym)) ->execute(); + static_assert( + !Newton::local_memory_required::required, + "Did not expect local memory to be required for this Newton implemenation" + ); + particle_loop( "CompositeIntersection::find_intersections_3d_triangles", iteration_set, [=](auto k_P, auto k_PP, auto k_OUT_P, auto k_OUT_C) { @@ -666,7 +676,7 @@ void CompositeIntersection::find_intersections_3d( k_newton_kernel; const bool converged = k_newton_kernel.x_inverse( map_data, i0, i1, i2, &xi0, &xi1, &xi2, - k_max_iterations, k_newton_tol); + nullptr, k_max_iterations, k_newton_tol); k_newton_type.loc_coord_to_loc_collapsed( map_data, xi0, xi1, xi2, &eta0, &eta1, &eta2); From 2e84e5935d401e65e211bbbf282aa7edc6f6f1dc Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 23 Oct 2024 12:16:40 +0100 Subject: [PATCH 12/66] branch compiles again after merging in main --- .../map_particles_newton.hpp | 34 ++++++++++++++----- .../newton_quad_embed_3d.hpp | 4 +-- .../newton_triangle_embed_3d.hpp | 2 +- .../x_map_newton_kernel.hpp | 18 +++++----- .../composite_collections.cpp | 2 +- .../composite_intersection.cpp | 20 +++++------ 6 files changed, 48 insertions(+), 32 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp index eb45a468..fbbc18a6 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -71,8 +71,10 @@ class MapParticlesNewton : public CoarseMappersBase { MappingNewtonIterationBase newton_type; const std::size_t num_bytes_per_map_device; const std::size_t num_bytes_per_map_host; + std::size_t num_bytes_local_memory; - template inline void write_data(U &geom, const int index) { + template + inline std::size_t write_data(U &geom, const int index) { auto d_data_ptr = (this->num_bytes_per_map_device) ? this->dh_data->h_buffer.ptr + @@ -85,6 +87,8 @@ class MapParticlesNewton : public CoarseMappersBase { this->newton_type.write_data(this->sycl_target, geom, h_data_ptr, d_data_ptr); + // Return the number of bytes of local memory this object requires. + return this->newton_type.data_size_local(h_data_ptr); } inline void map_inital(ParticleGroup &particle_group, const int map_cell) { @@ -120,12 +124,14 @@ class MapParticlesNewton : public CoarseMappersBase { auto mpi_ranks = particle_group.mpi_rank_dat; auto ref_positions = particle_group.get_dat(Sym("NESO_REFERENCE_POSITIONS")); + auto local_memory = LocalMemoryBlock(this->num_bytes_local_memory); auto loop = particle_loop( "MapParticlesNewton::map_inital", position_dat, [=](auto k_part_positions, auto k_part_cell_ids, auto k_part_mpi_ranks, - auto k_part_ref_positions) { + auto k_part_ref_positions, auto k_local_memory) { if (k_part_mpi_ranks.at(1) < 0) { + void *k_local_memory_ptr = k_local_memory.data(); // read the position of the particle const REAL p0 = k_part_positions.at(0); const REAL p1 = (k_ndim > 1) ? k_part_positions.at(1) : 0.0; @@ -182,7 +188,7 @@ class MapParticlesNewton : public CoarseMappersBase { const bool converged = k_newton_kernel.x_inverse( map_data, p0, p1, p2, &xi[0], &xi[1], &xi[2], - k_max_iterations, k_newton_tol); + k_local_memory_ptr, k_max_iterations, k_newton_tol); REAL eta0; REAL eta1; @@ -212,7 +218,8 @@ class MapParticlesNewton : public CoarseMappersBase { } }, Access::read(position_dat), Access::write(cell_ids), - Access::write(mpi_ranks), Access::write(ref_positions)); + Access::write(mpi_ranks), Access::write(ref_positions), + Access::write(local_memory)); if (map_cell > -1) { loop->execute(map_cell); @@ -258,12 +265,14 @@ class MapParticlesNewton : public CoarseMappersBase { auto mpi_ranks = particle_group.mpi_rank_dat; auto ref_positions = particle_group.get_dat(Sym("NESO_REFERENCE_POSITIONS")); + auto local_memory = LocalMemoryBlock(this->num_bytes_local_memory); particle_loop( "MapParticlesNewton::map_final", position_dat, [=](auto k_part_positions, auto k_part_cell_ids, auto k_part_mpi_ranks, - auto k_part_ref_positions) { + auto k_part_ref_positions, auto k_local_memory) { if (k_part_mpi_ranks.at(1) < 0) { + void *k_local_memory_ptr = k_local_memory.data(); // read the position of the particle const REAL p0 = k_part_positions.at(0); const REAL p1 = (k_ndim > 1) ? k_part_positions.at(1) : 0.0; @@ -327,7 +336,8 @@ class MapParticlesNewton : public CoarseMappersBase { const bool converged = k_newton_kernel.x_inverse( map_data, p0, p1, p2, &xi[0], &xi[1], &xi[2], - k_max_iterations, k_newton_tol, true); + k_local_memory_ptr, k_max_iterations, k_newton_tol, + true); REAL eta0; REAL eta1; @@ -361,7 +371,8 @@ class MapParticlesNewton : public CoarseMappersBase { } }, Access::read(position_dat), Access::write(cell_ids), - Access::write(mpi_ranks), Access::write(ref_positions)) + Access::write(mpi_ranks), Access::write(ref_positions), + Access::write(local_memory)) ->execute(map_cell); } @@ -449,6 +460,11 @@ class MapParticlesNewton : public CoarseMappersBase { const int rank = this->sycl_target->comm_pair.rank_parent; int num_modes = 0; + this->num_bytes_local_memory = 0; + auto lambda_update_local_memory = [&](const std::size_t s) { + this->num_bytes_local_memory = + std::max(this->num_bytes_local_memory, s); + }; for (auto &geom : geoms_local) { const int id = geom.second->GetGlobalID(); const int cell_index = this->coarse_lookup_map->gid_to_lookup_id.at(id); @@ -464,7 +480,7 @@ class MapParticlesNewton : public CoarseMappersBase { (geom_type == index_tri) || (geom_type == index_quad), "Unknown shape type."); this->dh_type->h_buffer.ptr[cell_index] = geom_type; - this->write_data(geom.second, cell_index); + lambda_update_local_memory(this->write_data(geom.second, cell_index)); num_modes = std::max(num_modes, geom.second->GetXmap()->EvalBasisNumModesMax()); } @@ -482,7 +498,7 @@ class MapParticlesNewton : public CoarseMappersBase { (geom_type == index_tri) || (geom_type == index_quad), "Unknown shape type."); this->dh_type->h_buffer.ptr[cell_index] = geom_type; - this->write_data(geom->geom, cell_index); + lambda_update_local_memory(this->write_data(geom->geom, cell_index)); num_modes = std::max(num_modes, geom->geom->GetXmap()->EvalBasisNumModesMax()); } diff --git a/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp index 143ea5cd..e2729790 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp @@ -14,8 +14,8 @@ namespace Newton { struct MappingQuadLinear2DEmbed3D : MappingNewtonIterationBase { - inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, - GeometrySharedPtr geom, void *data_host, + inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, + GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp index 6390ded7..89d1a2e7 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp @@ -20,7 +20,7 @@ struct MappingTriangleLinear2DEmbed3D : MappingNewtonIterationBase { inline void write_data_v([[maybe_unused]] SYCLTargetSharedPtr sycl_target, - GeometrySharedPtr geom, void *data_host, + GeometrySharedPtr geom, void *data_host, void *data_device) { REAL *data_device_real = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp index 0d959053..99da0ee7 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp @@ -30,7 +30,8 @@ template struct XMapNewtonKernel { * implementation. May be modified by this function. */ inline void x(const void *map_data, const REAL xi0, const REAL xi1, - const REAL xi2, REAL *phys0, REAL *phys1, REAL *phys2, void * local_memory) { + const REAL xi2, REAL *phys0, REAL *phys1, REAL *phys2, + void *local_memory) { *phys0 = 0.0; *phys1 = 0.0; @@ -66,10 +67,8 @@ template struct XMapNewtonKernel { */ inline bool x_inverse(const void *map_data, const REAL phys0, const REAL phys1, const REAL phys2, REAL *xi0, - REAL *xi1, REAL *xi2, - void * local_memory, - const INT max_iterations, - const REAL tol = 1.0e-10, + REAL *xi1, REAL *xi2, void *local_memory, + const INT max_iterations, const REAL tol = 1.0e-10, const bool initial_override = false) { MappingNewtonIterationBase k_newton_type{}; @@ -92,8 +91,8 @@ template struct XMapNewtonKernel { REAL xin0, xin1, xin2; REAL f0, f1, f2; - REAL residual = k_newton_type.newton_residual(map_data, k_xi0, k_xi1, k_xi2, - p0, p1, p2, &f0, &f1, &f2, local_memory); + REAL residual = k_newton_type.newton_residual( + map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, &f2, local_memory); bool diverged = false; @@ -107,8 +106,9 @@ template struct XMapNewtonKernel { k_xi1 = xin1; k_xi2 = xin2; - residual = k_newton_type.newton_residual(map_data, k_xi0, k_xi1, k_xi2, - p0, p1, p2, &f0, &f1, &f2, local_memory); + residual = + k_newton_type.newton_residual(map_data, k_xi0, k_xi1, k_xi2, p0, p1, + p2, &f0, &f1, &f2, local_memory); diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || (ABS(k_xi2) > 15.0); diff --git a/src/nektar_interface/composite_interaction/composite_collections.cpp b/src/nektar_interface/composite_interaction/composite_collections.cpp index 3e320b2f..c40db14c 100644 --- a/src/nektar_interface/composite_interaction/composite_collections.cpp +++ b/src/nektar_interface/composite_interaction/composite_collections.cpp @@ -106,7 +106,7 @@ void CompositeCollections::collect_cell(const INT cell) { for (int gx = 0; gx < num_tris; gx++) { auto remote_geom = remote_tris[gx]; auto geom = remote_geom->geom; - mapper_tris.write_data(this->sycl_target, geom, nullptr, + mapper_tris.write_data(this->sycl_target, geom, nullptr, map_data_tris + gx * stride_tris); LinePlaneIntersection lpi(geom); buf_lpi.push_back(lpi); diff --git a/src/nektar_interface/composite_interaction/composite_intersection.cpp b/src/nektar_interface/composite_interaction/composite_intersection.cpp index 70a64624..5364897a 100644 --- a/src/nektar_interface/composite_interaction/composite_intersection.cpp +++ b/src/nektar_interface/composite_interaction/composite_intersection.cpp @@ -401,10 +401,10 @@ void CompositeIntersection::find_intersections_3d( const int k_grid_size_y = grid_size; const REAL k_grid_width = 2.0 / grid_size; - static_assert( - !Newton::local_memory_required::required, - "Did not expect local memory to be required for this Newton implemenation" - ); + static_assert(!Newton::local_memory_required< + Newton::MappingQuadLinear2DEmbed3D>::required, + "Did not expect local memory to be required for this Newton " + "implemenation"); particle_loop( "CompositeIntersection::find_intersections_3d_quads", iteration_set, @@ -563,10 +563,10 @@ void CompositeIntersection::find_intersections_3d( Access::write(dat_positions->sym), Access::write(dat_composite->sym)) ->execute(); - static_assert( - !Newton::local_memory_required::required, - "Did not expect local memory to be required for this Newton implemenation" - ); + static_assert(!Newton::local_memory_required< + Newton::MappingTriangleLinear2DEmbed3D>::required, + "Did not expect local memory to be required for this Newton " + "implemenation"); particle_loop( "CompositeIntersection::find_intersections_3d_triangles", iteration_set, @@ -675,8 +675,8 @@ void CompositeIntersection::find_intersections_3d( Newton::MappingTriangleLinear2DEmbed3D> k_newton_kernel; const bool converged = k_newton_kernel.x_inverse( - map_data, i0, i1, i2, &xi0, &xi1, &xi2, - nullptr, k_max_iterations, k_newton_tol); + map_data, i0, i1, i2, &xi0, &xi1, &xi2, nullptr, + k_max_iterations, k_newton_tol); k_newton_type.loc_coord_to_loc_collapsed( map_data, xi0, xi1, xi2, &eta0, &eta1, &eta2); From 85548b62cc89f32482631b21efc9c134fa2b25cb Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 23 Oct 2024 15:06:26 +0100 Subject: [PATCH 13/66] updated NP submodule --- neso-particles | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neso-particles b/neso-particles index 196069f9..e32da6ce 160000 --- a/neso-particles +++ b/neso-particles @@ -1 +1 @@ -Subproject commit 196069f90b5d52a09f9260c6f5c17a54d1a46c28 +Subproject commit e32da6ceb0e454489ab9172d1c23aba142700ff8 From 0278678f4b78977125eee2bb5725e6cc33d3ac56 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 23 Oct 2024 16:19:07 +0100 Subject: [PATCH 14/66] added reference grid to the X map inverse host helper class --- .../particle_cell_mapping/x_map_newton.hpp | 131 +++++++++++++----- 1 file changed, 93 insertions(+), 38 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 2f474e91..b20fef4e 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -36,6 +36,11 @@ template class XMapNewton { std::vector h_data; std::size_t num_bytes_local; + // variables for higher order grids + int num_modes; + int num_modes_factor; + int ndim; + template inline void write_data(U &geom) { if (this->num_bytes_per_map_host) { this->h_data = std::vector(this->num_bytes_per_map_host); @@ -56,6 +61,9 @@ template class XMapNewton { this->num_bytes_local = std::max(static_cast(1), this->newton_type.data_size_local(h_data_ptr)); + this->num_modes = geom->GetXmap()->EvalBasisNumModesMax(); + MappingNewtonIterationBase newton_type; + this->ndim = newton_type.get_ndim(); } public: @@ -71,13 +79,18 @@ template class XMapNewton { * @param sycl_target SYCLTarget to use for computation. * @param geom Nektar++ geometry type that matches the Newton method * implementation. + * @param num_modes_factor Factor to multiply the number of modes by to + * create the grid in reference space. Default 1, i.e a (num_modes * + * num_modes_factor)^(ndim)). */ template - XMapNewton(SYCLTargetSharedPtr sycl_target, std::shared_ptr geom) + XMapNewton(SYCLTargetSharedPtr sycl_target, std::shared_ptr geom, + const int num_modes_factor = 1) : newton_type(MappingNewtonIterationBase()), sycl_target(sycl_target), num_bytes_per_map_host(newton_type.data_size_host()), - num_bytes_per_map_device(newton_type.data_size_device()) { + num_bytes_per_map_device(newton_type.data_size_device()), + num_modes_factor(num_modes_factor) { this->write_data(geom); this->dh_fdata = std::make_unique>(this->sycl_target, 4); @@ -136,7 +149,8 @@ template class XMapNewton { /** * For a position X(xi) compute the reference position xi via Newton - * iteration. + * iteration. This method will attempt to find a root inside the reference + * element. * * @param[in] phys0 Global position X(xi), x component. * @param[in] phys1 Global position X(xi), y component. @@ -145,18 +159,29 @@ template class XMapNewton { * @param[in, out] xi1 Reference position, y component. * @param[in, out] xi2 Reference position, z component. * @param[in] tol Optional exit tolerance for Newton iterations. + * @param[in] contained_tol Optional tolerance for determining if a point is + * within the reference cell. * @returns True if inverse is found otherwise false. */ inline bool x_inverse(const REAL phys0, const REAL phys1, const REAL phys2, REAL *xi0, REAL *xi1, REAL *xi2, - const REAL tol = 1.0e-10) { + const REAL tol = 1.0e-10, + const REAL contained_tol = 1.0e-10) { const int k_max_iterations = 51; auto k_map_data = this->dh_data->d_buffer.ptr; auto k_fdata = this->dh_fdata->d_buffer.ptr; const REAL k_tol = tol; + const double k_contained_tol = contained_tol; const std::size_t num_bytes_local = this->num_bytes_local; + const int k_ndim = this->ndim; + const int grid_size = this->num_modes_factor * this->num_modes; + const int k_grid_size_x = std::max(grid_size - 1, 1); + const int k_grid_size_y = k_ndim > 1 ? k_grid_size_x : 1; + const int k_grid_size_z = k_ndim > 2 ? k_grid_size_x : 1; + const REAL k_grid_width = 2.0 / (k_grid_size_x); + this->sycl_target->queue .submit([&](sycl::handler &cgh) { sycl::accessor class XMapNewton { const REAL p0 = phys0; const REAL p1 = phys1; const REAL p2 = phys2; - REAL k_xi0; REAL k_xi1; REAL k_xi2; - k_newton_type.set_initial_iteration(k_map_data, p0, p1, p2, - &k_xi0, &k_xi1, &k_xi2); - - // Start of Newton iteration - REAL xin0, xin1, xin2; - REAL f0, f1, f2; - - REAL residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, &f2, - &local_mem[0]); - - bool diverged = false; - printf("residual: %f\n", residual); - for (int stepx = 0; ((stepx < k_max_iterations) && - (residual > k_tol) && (!diverged)); - stepx++) { - printf("STEPX: %d, RES: %f\n", stepx, residual); - - k_newton_type.newton_step(k_map_data, k_xi0, k_xi1, k_xi2, p0, - p1, p2, f0, f1, f2, &xin0, &xin1, - &xin2, &local_mem[0]); - - k_xi0 = xin0; - k_xi1 = xin1; - k_xi2 = xin2; - - residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, - &f2, &local_mem[0]); - - diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || - (ABS(k_xi2) > 15.0); + REAL residual; + bool cell_found = false; + + for (int g2 = 0; (g2 <= k_grid_size_z) && (!cell_found); g2++) { + for (int g1 = 0; (g1 <= k_grid_size_y) && (!cell_found); + g1++) { + for (int g0 = 0; (g0 <= k_grid_size_x) && (!cell_found); + g0++) { + + k_xi0 = -1.0 + g0 * k_grid_width; + k_xi1 = -1.0 + g1 * k_grid_width; + k_xi2 = -1.0 + g2 * k_grid_width; + + // k_newton_type.set_initial_iteration(k_map_data, p0, p1, + // p2, + // &k_xi0, &k_xi1, + // &k_xi2); + + // Start of Newton iteration + REAL xin0, xin1, xin2; + REAL f0, f1, f2; + + residual = k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, + &f2, &local_mem[0]); + + bool diverged = false; + bool converged = false; + printf("residual: %f\n", residual); + for (int stepx = 0; ((stepx < k_max_iterations) && + (!converged) && (!diverged)); + stepx++) { + printf("STEPX: %d, RES: %f\n", stepx, residual); + + k_newton_type.newton_step( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f0, f1, + f2, &xin0, &xin1, &xin2, &local_mem[0]); + + k_xi0 = xin0; + k_xi1 = xin1; + k_xi2 = xin2; + + residual = k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, + &f1, &f2, &local_mem[0]); + + diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || + (ABS(k_xi2) > 15.0); + converged = (residual <= k_tol) && (!diverged); + } + + REAL eta0, eta1, eta2; + k_newton_type.loc_coord_to_loc_collapsed( + k_map_data, k_xi0, k_xi1, k_xi2, &eta0, &eta1, &eta2); + + bool contained = ((-1.0 - k_contained_tol) <= eta0) && + (eta0 <= (1.0 + k_contained_tol)) && + ((-1.0 - k_contained_tol) <= eta1) && + (eta1 <= (1.0 + k_contained_tol)) && + ((-1.0 - k_contained_tol) <= eta2) && + (eta2 <= (1.0 + k_contained_tol)); + cell_found = contained && converged; + } + } } - k_fdata[0] = k_xi0; k_fdata[1] = k_xi1; k_fdata[2] = k_xi2; From 04c28dcdd9c46bd199798dd9112fb38f9dd4a478 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 23 Oct 2024 16:54:50 +0100 Subject: [PATCH 15/66] updated curved X map inverse test to only pass if the inverse finds the original reference position --- .../newton_generic_3d.hpp | 3 ++- .../particle_cell_mapping/x_map_newton.hpp | 2 +- ..._particle_geometry_interface_3d_curved.cpp | 26 ++++--------------- 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index 0101f3a6..82720ee3 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -272,8 +272,9 @@ struct MappingGeneric3D : MappingNewtonIterationBase { const REAL norm2 = MAX(MAX(ABS(*f0), ABS(*f1)), ABS(*f2)); const REAL tol_scaling = d->tol_scaling; - nprint("TOL SCALING:", tol_scaling); const REAL scaled_norm2 = norm2 * tol_scaling; + + nprint("TOL SCALING:", scaled_norm2, tol_scaling); return scaled_norm2; } diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index b20fef4e..9982746c 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -231,7 +231,7 @@ template class XMapNewton { for (int stepx = 0; ((stepx < k_max_iterations) && (!converged) && (!diverged)); stepx++) { - printf("STEPX: %d, RES: %f\n", stepx, residual); + printf("STEPX: %d, RES: %16.8e\n", stepx, residual); k_newton_type.newton_step( k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f0, f1, diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 98e7c5b2..0f05f6b8 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -340,27 +340,11 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { (std::abs(test_xi1 - xi[1]) < 1.0e-8) && (std::abs(test_xi2 - xi[2]) < 1.0e-8); - // If the test_xi is xi then the inverse mapping was good - // Otherwise check test_xi is a reference coordinate that maps to phys - if (!same_xi) { - Array test_phys(3); - lambda_forward_map(geom, xi, test_phys); - const bool equiv_xi = (std::abs(test_phys[0] - phys[0]) < 1.0e-8) && - (std::abs(test_phys[1] - phys[1]) < 1.0e-8) && - (std::abs(test_phys[2] - phys[2]) < 1.0e-8); - - // The point we sampled was considered contained by Nektar++ - // Check that this alternative reference point is also contained. - const REAL xi00 = test_xi0; - const REAL xi01 = test_xi1; - const REAL xi02 = test_xi2; - GeometryInterface::loc_coord_to_loc_collapsed_3d( - shape_type_int, xi00, xi01, xi02, &eta0, &eta1, &eta2); - - const auto dist = lambda_test_contained(eta0, eta1, eta2); - nprint("dist1", dist, eta0, eta1, eta2); - EXPECT_TRUE(dist < 1.0e-8); - } + // If there were multiple points inside the reference element that map to + // the same physical point there there are major problems with the mesh. + // Hence the point inside the reference element that maps to the physical + // point hould be unique. + ASSERT_TRUE(same_xi); nprint("CHECK X MAP END"); }; From 7ccf426a55042cdbbfc741570eec89160b2996d0 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 29 Oct 2024 11:13:06 +0000 Subject: [PATCH 16/66] added more explicit test for 3D coordinate mapping functions --- .../nektar_interface/coordinate_mapping.hpp | 123 ++-- .../mapping_newton_iteration_base.hpp | 23 + .../newton_generic_3d.hpp | 58 +- .../particle_cell_mapping/newton_prism.hpp | 13 +- .../particle_cell_mapping/newton_pyr.hpp | 13 +- .../newton_triangle_embed_3d.hpp | 12 +- .../particle_cell_mapping/x_map_newton.hpp | 10 +- .../test_particle_geometry_interface_3d.cpp | 153 +++-- ..._particle_geometry_interface_3d_curved.cpp | 549 +++++++++++++++++- 9 files changed, 783 insertions(+), 171 deletions(-) diff --git a/include/nektar_interface/coordinate_mapping.hpp b/include/nektar_interface/coordinate_mapping.hpp index 3a6a18aa..109ed65a 100644 --- a/include/nektar_interface/coordinate_mapping.hpp +++ b/include/nektar_interface/coordinate_mapping.hpp @@ -173,14 +173,14 @@ struct Tetrahedron : BaseCoordinateMapping3D { T *eta2) { NekDouble d2 = 1.0 - xi2; NekDouble d12 = -xi1 - xi2; - if (fabs(d2) < NekConstants::kNekZeroTol) { + if (sycl::fabs(d2) < NekConstants::kNekZeroTol) { if (d2 >= 0.) { d2 = NekConstants::kNekZeroTol; } else { d2 = -NekConstants::kNekZeroTol; } } - if (fabs(d12) < NekConstants::kNekZeroTol) { + if (sycl::fabs(d12) < NekConstants::kNekZeroTol) { if (d12 >= 0.) { d12 = NekConstants::kNekZeroTol; } else { @@ -235,7 +235,7 @@ struct Pyramid : BaseCoordinateMapping3D { const T xi2, T *eta0, T *eta1, T *eta2) { NekDouble d2 = 1.0 - xi2; - if (fabs(d2) < NekConstants::kNekZeroTol) { + if (sycl::fabs(d2) < NekConstants::kNekZeroTol) { if (d2 >= 0.) { d2 = NekConstants::kNekZeroTol; } else { @@ -290,7 +290,7 @@ struct Prism : BaseCoordinateMapping3D { const T xi2, T *eta0, T *eta1, T *eta2) { NekDouble d2 = 1.0 - xi2; - if (fabs(d2) < NekConstants::kNekZeroTol) { + if (sycl::fabs(d2) < NekConstants::kNekZeroTol) { if (d2 >= 0.) { d2 = NekConstants::kNekZeroTol; } else { @@ -426,7 +426,7 @@ struct Triangle : BaseCoordinateMapping2D { T *eta1) { const NekDouble d1_original = 1.0 - xi1; const bool mask_small_cond = - (fabs(d1_original) < NekConstants::kNekZeroTol); + (sycl::fabs(d1_original) < NekConstants::kNekZeroTol); NekDouble d1 = d1_original; d1 = (mask_small_cond && (d1 >= 0.0)) ? NekConstants::kNekZeroTol @@ -454,19 +454,30 @@ struct Triangle : BaseCoordinateMapping2D { } }; + + /** * Map the local collapsed coordinate (eta) to the local coordinate (xi). * * @param[in] shape_type Integer denoting shape type found by cast of Nektar++ * shape type enum to int. - * @param[in] eta Local collapsed coordinate to map to local coordinate. Must - * be a subscriptable type for indices 0,1,2. - * @param[in, out] xi Local coordinate. Must be a - * subscriptable type for indices 0,1,2. + * @param[in] eta0 Local collapsed coordinate to map to local coordinate. + * @param[in] eta1 Local collapsed coordinate to map to local coordinate. + * @param[in] eta2 Local collapsed coordinate to map to local coordinate. + * @param[in, out] xi0 Local coordinate. + * @param[in, out] xi1 Local coordinate. + * @param[in, out] xi2 Local coordinate. */ template -inline void loc_collapsed_to_loc_coord(const int shape_type, const T &eta, - T &xi) { +inline void loc_collapsed_to_loc_coord( + const int shape_type, + const T eta0, + const T eta1, + const T eta2, + T * xi0, + T * xi1, + T * xi2 + ) { /* Tet @@ -520,79 +531,39 @@ inline void loc_collapsed_to_loc_coord(const int shape_type, const T &eta, constexpr int shape_type_pyr = shape_type_to_int(LibUtilities::ePyramid); constexpr int shape_type_hex = shape_type_to_int(LibUtilities::eHexahedron); - const REAL eta0 = eta[0]; - const REAL eta1 = eta[1]; - const REAL eta2 = eta[2]; - const REAL a = 1.0 + eta0; const REAL b = 1.0 - eta2; const REAL c = (a) * (b)*0.5 - 1.0; - const REAL xi1 = + *xi1 = (shape_type == shape_type_tet) ? c : ((shape_type == shape_type_pyr) ? (1.0 + eta1) * (b)*0.5 - 1.0 : eta1); - const REAL tet_x = (1.0 + eta0) * (-xi1 - eta2) * 0.5 - 1.0; - xi[0] = (shape_type == shape_type_tet) + const REAL tet_x = (1.0 + eta0) * (-(*xi1) - eta2) * 0.5 - 1.0; + *xi0 = (shape_type == shape_type_tet) ? tet_x : ((shape_type == shape_type_hex) ? eta0 : c); - xi[1] = xi1; - xi[2] = eta2; + *xi2 = eta2; } + /** - * Map the local coordinate (xi) to the local collapsed coordinate (eta). + * Map the local collapsed coordinate (eta) to the local coordinate (xi). * * @param[in] shape_type Integer denoting shape type found by cast of Nektar++ - * @param[in] xi Local coordinate to map to collapsed coordinate. Must be a + * shape type enum to int. + * @param[in] eta Local collapsed coordinate to map to local coordinate. Must + * be a subscriptable type for indices 0,1,2. + * @param[in, out] xi Local coordinate. Must be a * subscriptable type for indices 0,1,2. - * @param[in, out] eta Local collapsed coordinate. Must be a subscriptable - * type for indices 0,1,2. */ template -inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T &xi, - T &eta) { - - constexpr int shape_type_tet = shape_type_to_int(LibUtilities::eTetrahedron); - constexpr int shape_type_pyr = shape_type_to_int(LibUtilities::ePyramid); - constexpr int shape_type_hex = shape_type_to_int(LibUtilities::eHexahedron); - - const REAL xi0 = xi[0]; - const REAL xi1 = xi[1]; - const REAL xi2 = xi[2]; - - NekDouble d2 = 1.0 - xi2; - if (fabs(d2) < NekConstants::kNekZeroTol) { - if (d2 >= 0.) { - d2 = NekConstants::kNekZeroTol; - } else { - d2 = -NekConstants::kNekZeroTol; - } - } - NekDouble d12 = -xi1 - xi2; - if (fabs(d12) < NekConstants::kNekZeroTol) { - if (d12 >= 0.) { - d12 = NekConstants::kNekZeroTol; - } else { - d12 = -NekConstants::kNekZeroTol; - } - } +inline void loc_collapsed_to_loc_coord(const int shape_type, const T &eta, + T &xi) { + loc_collapsed_to_loc_coord(shape_type, eta[0], eta[1], eta[2], &xi[0], &xi[1], &xi[2]); +} - const REAL id2x2 = 2.0 / d2; - const REAL a = 1.0 + xi0; - const REAL b = (1.0 + xi1) * id2x2 - 1.0; - const REAL c = a * id2x2 - 1.0; - const REAL d = 2.0 * a / d12 - 1.0; - eta[0] = (shape_type == shape_type_tet) ? d - : (shape_type == shape_type_hex) ? xi0 - : c; - - eta[1] = ((shape_type == shape_type_tet) || (shape_type == shape_type_pyr)) - ? b - : xi1; - eta[2] = xi2; -} /** * Map the local coordinate (xi) to the local collapsed coordinate (eta). @@ -615,7 +586,7 @@ inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T xi0, constexpr int shape_type_hex = shape_type_to_int(LibUtilities::eHexahedron); NekDouble d2 = 1.0 - xi2; - if (fabs(d2) < NekConstants::kNekZeroTol) { + if (sycl::fabs(d2) < NekConstants::kNekZeroTol) { if (d2 >= 0.) { d2 = NekConstants::kNekZeroTol; } else { @@ -623,7 +594,7 @@ inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T xi0, } } NekDouble d12 = -xi1 - xi2; - if (fabs(d12) < NekConstants::kNekZeroTol) { + if (sycl::fabs(d12) < NekConstants::kNekZeroTol) { if (d12 >= 0.) { d12 = NekConstants::kNekZeroTol; } else { @@ -647,6 +618,22 @@ inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T xi0, *eta2 = xi2; } + +/** + * Map the local coordinate (xi) to the local collapsed coordinate (eta). + * + * @param[in] shape_type Integer denoting shape type found by cast of Nektar++ + * @param[in] xi Local coordinate to map to collapsed coordinate. Must be a + * subscriptable type for indices 0,1,2. + * @param[in, out] eta Local collapsed coordinate. Must be a subscriptable + * type for indices 0,1,2. + */ +template +inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T &xi, + T &eta) { + loc_coord_to_loc_collapsed_3d(shape_type, xi[0], xi[1], xi[2], &eta[0], &eta[1], &eta[2]); +} + /** * Map the local coordinate (xi) to the local collapsed coordinate (eta). * @@ -688,7 +675,7 @@ inline bool clamp_loc_coord(T *coord, const T tol = std::numeric_limits::epsilon()) { bool clamp = false; - if (!std::isfinite(*coord)) { + if (!sycl::isfinite(*coord)) { *coord = 0.0; clamp = true; } else if ((*coord) < -(1.0 + tol)) { diff --git a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp index 2761fcf8..ea717005 100644 --- a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp +++ b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp @@ -237,6 +237,29 @@ template struct MappingNewtonIterationBase { underlying.loc_coord_to_loc_collapsed_v(d_data, xi0, xi1, xi2, eta0, eta1, eta2); } + + /** + * Map from local collapsed coordinate (eta) to local coordinate (xi). + * + * @param[in] d_data Pointer to data required to perform the Newton iteration. + * @param[in] eta0 Local collapsed coordinate (eta), x component. + * @param[in] eta1 Local collapsed coordinate (eta), y component. + * @param[in] eta2 Local collapsed coordinate (eta), z component. + * @param[in, out] xi0 Local coordinate (xi) to be mapped to collapsed coordinate, + * x component. + * @param[in, out] xi1 Local coordinate (xi) to be mapped to collapsed coordinate, + * y component. + * @param[in, out] xi2 Local coordinate (xi) to be mapped to collapsed coordinate, + * z component. + */ + inline void loc_collapsed_to_loc_coord(const void *d_data, const REAL eta0, + const REAL eta1, const REAL eta2, + REAL *xi0, REAL *xi1, REAL *xi2) { + auto &underlying = static_cast(*this); + underlying.loc_collapsed_to_loc_coord_v(d_data, eta0, eta1, eta2, xi0, xi1, + xi2); + // TODO IMPLEMENT FOR NEWTON TYPES + } }; } // namespace NESO::Newton diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index 82720ee3..d9619582 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -232,8 +232,8 @@ struct MappingGeneric3D : MappingNewtonIterationBase { this->loc_coord_to_loc_collapsed(d_data, xi0, xi1, xi2, &eta0, &eta1, &eta2); - nprint("PHYS:", phys0, phys1, phys2); - nprint("COORDS:", xi0, xi1, xi2, eta0, eta1, eta2); + std::cout << std::setprecision(16); + nprint("COORDS: XI", xi0, xi1, xi2, "ETA:", eta0, eta1, eta2); // compute X at xi by evaluating the Bary interpolation at eta REAL *div_space0 = static_cast(local_memory); @@ -249,27 +249,29 @@ struct MappingGeneric3D : MappingNewtonIterationBase { d->num_phys2, d->physvals, div_space0, div_space1, div_space2, X); - const int n0 = d->num_phys0; - const int n1 = d->num_phys1; - const int n2 = d->num_phys2; - nprint("n:", n0, n1, n2); - for (int ix = 0; ix < n0; ix++) { - nprint(div_space0[ix]); - } - for (int ix = 0; ix < n1; ix++) { - nprint(div_space1[ix]); - } - for (int ix = 0; ix < n2; ix++) { - nprint(div_space2[ix]); - } - - nprint(X[0], X[1], X[2], phys0, phys1, phys2); + //const int n0 = d->num_phys0; + //const int n1 = d->num_phys1; + //const int n2 = d->num_phys2; + //nprint("n:", n0, n1, n2); + //for (int ix = 0; ix < n0; ix++) { + // nprint(div_space0[ix]); + //} + //for (int ix = 0; ix < n1; ix++) { + // nprint(div_space1[ix]); + //} + //for (int ix = 0; ix < n2; ix++) { + // nprint(div_space2[ix]); + //} + //nprint(X[0], X[1], X[2], phys0, phys1, phys2); // Residual is defined as F = X(xi) - P *f0 = X[0] - phys0; *f1 = X[1] - phys1; *f2 = X[2] - phys2; + nprint("PHYS:", phys0, phys1, phys2); + nprint(" X:", X[0], X[1], X[2]); + const REAL norm2 = MAX(MAX(ABS(*f0), ABS(*f1)), ABS(*f2)); const REAL tol_scaling = d->tol_scaling; const REAL scaled_norm2 = norm2 * tol_scaling; @@ -283,6 +285,15 @@ struct MappingGeneric3D : MappingNewtonIterationBase { inline void set_initial_iteration_v(const void *d_data, const REAL phys0, const REAL phys1, const REAL phys2, REAL *xi0, REAL *xi1, REAL *xi2) { + + /** + * Implementations that avoid singularities: + * newton_pyr + * + * + */ + + *xi0 = -0.2; *xi1 = -0.2; *xi2 = -0.2; @@ -299,6 +310,19 @@ struct MappingGeneric3D : MappingNewtonIterationBase { GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type, xi0, xi1, xi2, eta0, eta1, eta2); } + + inline void loc_collapsed_to_loc_coord_v(const void *d_data, const REAL eta0, + const REAL eta1, const REAL eta2, + REAL *xi0, REAL *xi1, REAL *xi2) { + + const Generic3D::DataDevice *data = + static_cast(d_data); + const int shape_type = data->shape_type_int; + + GeometryInterface::loc_collapsed_to_loc_coord(shape_type, eta0, eta1, eta2, + xi0, xi1, xi2); + } + }; /** diff --git a/include/nektar_interface/particle_cell_mapping/newton_prism.hpp b/include/nektar_interface/particle_cell_mapping/newton_prism.hpp index 335306bf..c30b2d84 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_prism.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_prism.hpp @@ -104,17 +104,8 @@ struct MappingPrismLinear3D : MappingNewtonIterationBase { inline void loc_coord_to_loc_collapsed_v(const void *d_data, const REAL xi0, const REAL xi1, const REAL xi2, REAL *eta0, REAL *eta1, REAL *eta2) { - NekDouble d2 = 1.0 - xi2; - if (fabs(d2) < NekConstants::kNekZeroTol) { - if (d2 >= 0.) { - d2 = NekConstants::kNekZeroTol; - } else { - d2 = -NekConstants::kNekZeroTol; - } - } - *eta2 = xi2; // eta_z = xi_z - *eta1 = xi1; // eta_y = xi_y - *eta0 = 2.0 * (1.0 + xi0) / d2 - 1.0; + GeometryInterface::Prism{}.loc_coord_to_loc_collapsed( + xi0, xi1, xi2, eta0, eta1, eta2); } }; diff --git a/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp b/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp index 245f8a47..5a510f48 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp @@ -147,17 +147,8 @@ struct MappingPyrLinear3D : MappingNewtonIterationBase { inline void loc_coord_to_loc_collapsed_v(const void *d_data, const REAL xi0, const REAL xi1, const REAL xi2, REAL *eta0, REAL *eta1, REAL *eta2) { - NekDouble d2 = 1.0 - xi2; - if (fabs(d2) < NekConstants::kNekZeroTol) { - if (d2 >= 0.) { - d2 = NekConstants::kNekZeroTol; - } else { - d2 = -NekConstants::kNekZeroTol; - } - } - *eta2 = xi2; // eta_z = xi_z - *eta1 = 2.0 * (1.0 + xi1) / d2 - 1.0; - *eta0 = 2.0 * (1.0 + xi0) / d2 - 1.0; + GeometryInterface::Pyramid{}.loc_coord_to_loc_collapsed( + xi0, xi1, xi2, eta0, eta1, eta2); } }; diff --git a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp index 89d1a2e7..da9cd0af 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp @@ -168,17 +168,9 @@ struct MappingTriangleLinear2DEmbed3D inline void loc_coord_to_loc_collapsed_v(const void *d_data, const REAL xi0, const REAL xi1, const REAL xi2, REAL *eta0, REAL *eta1, REAL *eta2) { - const NekDouble d1_original = 1.0 - xi1; - const bool mask_small_cond = - (fabs(d1_original) < NekConstants::kNekZeroTol); - NekDouble d1 = d1_original; - d1 = (mask_small_cond && (d1 >= 0.0)) - ? NekConstants::kNekZeroTol - : ((mask_small_cond && (d1 < 0.0)) ? -NekConstants::kNekZeroTol - : d1); - *eta0 = 2. * (1. + xi0) / d1 - 1.0; - *eta1 = xi1; *eta2 = 0.0; + GeometryInterface::Triangle{}.loc_coord_to_loc_collapsed( + xi0, xi1, eta0, eta1); } }; diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 9982746c..89cb1cd8 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -180,7 +180,7 @@ template class XMapNewton { const int k_grid_size_x = std::max(grid_size - 1, 1); const int k_grid_size_y = k_ndim > 1 ? k_grid_size_x : 1; const int k_grid_size_z = k_ndim > 2 ? k_grid_size_x : 1; - const REAL k_grid_width = 2.0 / (k_grid_size_x); + const REAL k_grid_width = 1.8 / (k_grid_size_x); this->sycl_target->queue .submit([&](sycl::handler &cgh) { @@ -208,10 +208,11 @@ template class XMapNewton { for (int g0 = 0; (g0 <= k_grid_size_x) && (!cell_found); g0++) { - k_xi0 = -1.0 + g0 * k_grid_width; - k_xi1 = -1.0 + g1 * k_grid_width; - k_xi2 = -1.0 + g2 * k_grid_width; + k_xi0 = -0.9 + g0 * k_grid_width; + k_xi1 = -0.9 + g1 * k_grid_width; + k_xi2 = -0.9 + g2 * k_grid_width; + nprint("~~~~~~~~~~~~~~", g0, g1, g2, ":", k_xi0, k_xi1, k_xi2); // k_newton_type.set_initial_iteration(k_map_data, p0, p1, // p2, // &k_xi0, &k_xi1, @@ -280,6 +281,7 @@ template class XMapNewton { } }; + } // namespace NESO::Newton #endif diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp index 706fc4a2..b36ad2c0 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp @@ -234,10 +234,124 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { BufferDeviceHost dh_eta(sycl_target, 3); BufferDeviceHost dh_xi(sycl_target, 3); + std::set> vertices_found; + std::vector> vertices = { + {-1.0, -1.0, -1.0}, + { 1.0, -1.0, -1.0}, + {-1.0, 1.0, -1.0}, + { 1.0, 1.0, -1.0}, + {-1.0, -1.0, 1.0}, + { 1.0, -1.0, 1.0}, + {-1.0, 1.0, 1.0}, + { 1.0, 1.0, 1.0} + }; + for (auto &geom_pair : geoms) { auto geom = geom_pair.second; + auto lambda_test_wrapper = [&]( + auto geom, + auto geom_test + ){ + const int shape_type_int = geom->GetShapeType(); + + Array test_eta(3); + Array test_eta_neso(3); + Array test_xi(3); + Array test_xi_neso(3); + REAL eta0, eta1, eta2, xi0, xi1, xi2; + auto xmap = geom->GetXmap(); + for(auto vx : vertices){ + test_eta[0] = vx.at(0); + test_eta[1] = vx.at(1); + test_eta[2] = vx.at(2); + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + xmap->LocCoordToLocCollapsed(test_xi, test_eta); + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + xmap->LocCoordToLocCollapsed(test_xi, test_eta); + + vertices_found.insert( + { + (int) std::round(test_eta[0]), + (int) std::round(test_eta[1]), + (int) std::round(test_eta[2]) + } + ); + } + + const int num_vertices_expected = geom->GetNumVerts(); + const int num_vertices_found = vertices_found.size(); + + // At the time of writing TetGeom mapping is inconsistent with itself in Nektar++ + const bool nektar_mapping_consistent = num_vertices_found == num_vertices_expected; + + vertices_found.clear(); + + for(auto vx : vertices){ + test_eta[0] = vx.at(0); + test_eta[1] = vx.at(1); + test_eta[2] = vx.at(2); + + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi_neso); + GeometryInterface::loc_collapsed_to_loc_coord( + shape_type_int, test_eta[0], test_eta[1], test_eta[2], &xi0, &xi1, &xi2); + ASSERT_NEAR(test_xi_neso[0], xi0, 1.0e-14); + ASSERT_NEAR(test_xi_neso[1], xi1, 1.0e-14); + ASSERT_NEAR(test_xi_neso[2], xi2, 1.0e-14); + + if (nektar_mapping_consistent) { + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + ASSERT_NEAR(test_xi_neso[0], test_xi[0], 1.0e-14); + ASSERT_NEAR(test_xi_neso[1], test_xi[1], 1.0e-14); + ASSERT_NEAR(test_xi_neso[2], test_xi[2], 1.0e-14); + } + + GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, test_xi_neso, test_eta_neso); + GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi0, xi1, xi2, &eta0, &eta1, &eta2); + ASSERT_NEAR(test_eta_neso[0], eta0, 1.0e-14); + ASSERT_NEAR(test_eta_neso[1], eta1, 1.0e-14); + ASSERT_NEAR(test_eta_neso[2], eta2, 1.0e-14); + + if (nektar_mapping_consistent) { + xmap->LocCoordToLocCollapsed(test_xi_neso, test_eta); + ASSERT_NEAR(test_eta_neso[0], test_eta[0], 1.0e-14); + ASSERT_NEAR(test_eta_neso[1], test_eta[1], 1.0e-14); + ASSERT_NEAR(test_eta_neso[2], test_eta[2], 1.0e-14); + } + + vertices_found.insert( + { + (int) std::round(eta0), + (int) std::round(eta1), + (int) std::round(eta2) + } + ); + + } + + // Our implementations should be consistent. + ASSERT_EQ(vertices_found.size(), num_vertices_expected); + }; + + auto shape_type = geom->GetShapeType(); + if (shape_type == LibUtilities::eTetrahedron) { + GeometryInterface::Tetrahedron geom_test{}; + lambda_test_wrapper(geom, geom_test); + } else if (shape_type == LibUtilities::ePyramid) { + GeometryInterface::Pyramid geom_test{}; + lambda_test_wrapper(geom, geom_test); + } else if (shape_type == LibUtilities::ePrism) { + GeometryInterface::Prism geom_test{}; + lambda_test_wrapper(geom, geom_test); + } else if (shape_type == LibUtilities::eHexahedron) { + GeometryInterface::Hexahedron geom_test{}; + lambda_test_wrapper(geom, geom_test); + } else { + // Unknown shape type + ASSERT_TRUE(false); + } + Array xi0(3); Array eta0(3); double xi1[3] = {0.0, 0.0, 0.0}; @@ -266,44 +380,6 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { ASSERT_NEAR(xi0[2], xi1[2], 1.0e-8); }; - auto shape_type = geom->GetShapeType(); - const int k_shape_type_int = shape_type_to_int(shape_type); - if (shape_type == LibUtilities::eTetrahedron) { - GeometryInterface::Tetrahedron geom_test{}; - geom->GetXmap()->LocCollapsedToLocCoord(eta0, xi0); - geom_test.loc_collapsed_to_loc_coord(eta1, xi1); - lambda_test_xi(); - geom->GetXmap()->LocCoordToLocCollapsed(xi0, eta0); - geom_test.loc_coord_to_loc_collapsed(xi1, eta1); - lambda_test_eta(); - } else if (shape_type == LibUtilities::ePyramid) { - GeometryInterface::Pyramid geom_test{}; - geom->GetXmap()->LocCollapsedToLocCoord(eta0, xi0); - geom_test.loc_collapsed_to_loc_coord(eta1, xi1); - lambda_test_xi(); - geom->GetXmap()->LocCoordToLocCollapsed(xi0, eta0); - geom_test.loc_coord_to_loc_collapsed(xi1, eta1); - lambda_test_eta(); - } else if (shape_type == LibUtilities::ePrism) { - GeometryInterface::Prism geom_test{}; - geom->GetXmap()->LocCollapsedToLocCoord(eta0, xi0); - geom_test.loc_collapsed_to_loc_coord(eta1, xi1); - lambda_test_xi(); - geom->GetXmap()->LocCoordToLocCollapsed(xi0, eta0); - geom_test.loc_coord_to_loc_collapsed(xi1, eta1); - lambda_test_eta(); - } else if (shape_type == LibUtilities::eHexahedron) { - GeometryInterface::Hexahedron geom_test{}; - geom->GetXmap()->LocCollapsedToLocCoord(eta0, xi0); - geom_test.loc_collapsed_to_loc_coord(eta1, xi1); - lambda_test_xi(); - geom->GetXmap()->LocCoordToLocCollapsed(xi0, eta0); - geom_test.loc_coord_to_loc_collapsed(xi1, eta1); - lambda_test_eta(); - } else { - // Unknown shape type - ASSERT_TRUE(false); - } // test the function that maps all types dh_eta.h_buffer.ptr[0] = k_eta0; @@ -317,6 +393,7 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { auto k_eta = dh_eta.d_buffer.ptr; auto k_xi = dh_xi.d_buffer.ptr; + const int k_shape_type_int = shape_type_to_int(shape_type); sycl_target->queue .submit([&](sycl::handler &cgh) { diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 0f05f6b8..0c721782 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -30,7 +30,179 @@ static inline void copy_to_cstring(std::string input, char **output) { std::strcpy(*output, input.c_str()); } -TEST(ParticleGeometryInterfaceCurved, Init) { +// TODO REMOVE START +namespace NESO::Newton { + +template class XMapNewtonTest : public XMapNewton { +public: + + template + XMapNewtonTest(SYCLTargetSharedPtr sycl_target, std::shared_ptr geom, + const int num_modes_factor = 1) + : XMapNewton(sycl_target, geom, num_modes_factor) + {} + + inline bool x_inverse(const REAL phys0, const REAL phys1, const REAL phys2, + REAL *xi0, REAL *xi1, REAL *xi2, + const REAL tol = 1.0e-10, + const REAL contained_tol = 1.0e-10) { + + const int k_max_iterations = 51; + auto k_map_data = this->dh_data->d_buffer.ptr; + auto k_fdata = this->dh_fdata->d_buffer.ptr; + const REAL k_tol = tol; + const double k_contained_tol = contained_tol; + const std::size_t num_bytes_local = this->num_bytes_local; + + const int k_ndim = this->ndim; + const int grid_size = this->num_modes_factor * this->num_modes; + const int k_grid_size_x = std::max(grid_size - 1, 1); + const int k_grid_size_y = k_ndim > 1 ? k_grid_size_x : 1; + const int k_grid_size_z = k_ndim > 2 ? k_grid_size_x : 1; + const REAL k_grid_width = 2.0 / (k_grid_size_x); + + this->sycl_target->queue + .submit([&](sycl::handler &cgh) { + sycl::accessor + local_mem(sycl::range<1>(num_bytes_local), cgh); + cgh.parallel_for<>( + sycl::nd_range<1>(sycl::range<1>(1), sycl::range<1>(1)), + [=](auto idx) { + printf("NEWTON TEST ETA GRID:\n"); + MappingNewtonIterationBase k_newton_type{}; + + const REAL p0 = phys0; + const REAL p1 = phys1; + const REAL p2 = phys2; + REAL k_xi0; + REAL k_xi1; + REAL k_xi2; + REAL residual; + bool cell_found = false; + + for (int g2 = 0; (g2 <= k_grid_size_z) && (!cell_found); g2++) { + for (int g1 = 0; (g1 <= k_grid_size_y) && (!cell_found); + g1++) { + for (int g0 = 0; (g0 <= k_grid_size_x) && (!cell_found); + g0++) { + + REAL eta0, eta1, eta2; + + eta0 = -1.0 + g0 * k_grid_width; + eta1 = -1.0 + g1 * k_grid_width; + eta2 = -1.0 + g2 * k_grid_width; + + k_newton_type.loc_collapsed_to_loc_coord( + k_map_data, eta0, eta1, eta2, &k_xi0, &k_xi1, &k_xi2); + + nprint("~~~~~~~~~~~ ETA:", eta0, eta1, eta2, "XI:", k_xi0, k_xi1, k_xi2); + + // k_newton_type.set_initial_iteration(k_map_data, p0, p1, + // p2, + // &k_xi0, &k_xi1, + // &k_xi2); + + // Start of Newton iteration + REAL xin0, xin1, xin2; + REAL f0, f1, f2; + + residual = k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, + &f2, &local_mem[0]); + + bool diverged = false; + bool converged = false; + printf("residual: %f\n", residual); + for (int stepx = 0; ((stepx < k_max_iterations) && + (!converged) && (!diverged)); + stepx++) { + printf("STEPX: %d, RES: %16.8e\n", stepx, residual); + + k_newton_type.newton_step( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f0, f1, + f2, &xin0, &xin1, &xin2, &local_mem[0]); + + k_xi0 = xin0; + k_xi1 = xin1; + k_xi2 = xin2; + + residual = k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, + &f1, &f2, &local_mem[0]); + + diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || + (ABS(k_xi2) > 15.0) || (residual != residual); + converged = (residual <= k_tol) && (!diverged); + } + + k_newton_type.loc_coord_to_loc_collapsed( + k_map_data, k_xi0, k_xi1, k_xi2, &eta0, &eta1, &eta2); + + // bool contained = ((-1.0 - k_contained_tol) <= eta0) && + // (eta0 <= (1.0 + k_contained_tol)) && + // ((-1.0 - k_contained_tol) <= eta1) && + // (eta1 <= (1.0 + k_contained_tol)) && + // ((-1.0 - k_contained_tol) <= eta2) && + // (eta2 <= (1.0 + k_contained_tol)); + + nprint("CLAMPED START"); + nprint("BEFORE CLAMP:", eta0, eta1, eta2); + REAL clamped_eta0 = Kernel::min(eta0, 1.0 + k_contained_tol); + REAL clamped_eta1 = Kernel::min(eta1, 1.0 + k_contained_tol); + REAL clamped_eta2 = Kernel::min(eta2, 1.0 + k_contained_tol); + clamped_eta0 = Kernel::max(clamped_eta0, -1.0 - k_contained_tol); + clamped_eta1 = Kernel::max(clamped_eta1, -1.0 - k_contained_tol); + clamped_eta2 = Kernel::max(clamped_eta2, -1.0 - k_contained_tol); + nprint("AFTER CLAMP:", clamped_eta0, clamped_eta1, clamped_eta2); + + REAL clamped_xi0, clamped_xi1, clamped_xi2; + k_newton_type.loc_collapsed_to_loc_coord( + k_map_data, clamped_eta0, clamped_eta1, clamped_eta2, + &clamped_xi0, &clamped_xi1, &clamped_xi2); + + const REAL clamped_residual = k_newton_type.newton_residual( + k_map_data, clamped_xi0, clamped_xi1, clamped_xi2, + p0, p1, p2, &f0, &f1, + &f2, &local_mem[0]); + + const bool contained = clamped_residual <= k_tol; + + nprint("CLAMPED END"); + + + + cell_found = contained && converged; + } + } + } + k_fdata[0] = k_xi0; + k_fdata[1] = k_xi1; + k_fdata[2] = k_xi2; + k_fdata[3] = (residual <= tol) ? 1 : -1; + }); + }) + .wait_and_throw(); + + this->dh_fdata->device_to_host(); + *xi0 = this->dh_fdata->h_buffer.ptr[0]; + *xi1 = this->dh_fdata->h_buffer.ptr[1]; + *xi2 = this->dh_fdata->h_buffer.ptr[2]; + return (this->dh_fdata->h_buffer.ptr[3] > 0); + } + +}; + + + + +} +// TODO REMOVE END + + + + +TEST(ParticleGeometryInterfaceCurved, CoordinateMapping) { int size, rank; MPI_Comm_size(MPI_COMM_WORLD, &size); @@ -53,6 +225,7 @@ TEST(ParticleGeometryInterfaceCurved, Init) { // std::filesystem::path mesh_file = // test_resources_dir / "reference_all_types_cube/mixed_ref_cube_0.2.xml"; + // TODO std::filesystem::path mesh_file = "/home/js0259/git-ukaea/NESO-workspace/reference_all_types_cube/" "mixed_ref_cube_0.5_perturbed_order_2.xml"; @@ -70,6 +243,7 @@ TEST(ParticleGeometryInterfaceCurved, Init) { std::map> geoms; get_all_elements_3d(graph, geoms); + // TODO clenaup auto lambda_stype = [](auto s) -> std::string { switch (s) { case eTetrahedron: @@ -85,6 +259,7 @@ TEST(ParticleGeometryInterfaceCurved, Init) { } }; + // TODO cleanip auto lambda_btype = [](auto s) -> std::string { switch (s) { case eModified_A: @@ -100,9 +275,156 @@ TEST(ParticleGeometryInterfaceCurved, Init) { } }; + auto lambda_to_collapsed_coord = [&]( + auto geom, + auto xi0, + auto xi1, + auto xi2, + auto * eta0, + auto * eta1, + auto * eta2 + ){ + auto s = geom->GetShapeType(); + switch (s) { + case eTetrahedron: + GeometryInterface::Tetrahedron{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); + break; + case ePyramid: + GeometryInterface::Pyramid{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); + break; + case ePrism: + GeometryInterface::Prism{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); + break; + case eHexahedron: + GeometryInterface::Hexahedron{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); + break; + default: + return "shape unknown"; + } + }; + auto lambda_to_local_coord = [&]( + auto geom, + auto eta0, + auto eta1, + auto eta2, + auto * xi0, + auto * xi1, + auto * xi2 + ){ + auto s = geom->GetShapeType(); + switch (s) { + case eTetrahedron: + GeometryInterface::Tetrahedron{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, xi0, xi1, xi2); + break; + case ePyramid: + GeometryInterface::Pyramid{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, xi0, xi1, xi2); + break; + case ePrism: + GeometryInterface::Prism{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, xi0, xi1, xi2); + break; + case eHexahedron: + GeometryInterface::Hexahedron{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, xi0, xi1, xi2); + break; + default: + return "shape unknown"; + } + }; + + for (auto gx : geoms) { auto geom = gx.second; auto xmap = geom->GetXmap(); + const int shape_type_int = geom->GetShapeType(); + + std::set> vertices_found; + std::vector> vertices = { + {-1.0, -1.0, -1.0}, + { 1.0, -1.0, -1.0}, + {-1.0, 1.0, -1.0}, + { 1.0, 1.0, -1.0}, + {-1.0, -1.0, 1.0}, + { 1.0, -1.0, 1.0}, + {-1.0, 1.0, 1.0}, + { 1.0, 1.0, 1.0} + }; + + Array test_eta(3); + Array test_eta_neso(3); + Array test_xi(3); + Array test_xi_neso(3); + REAL eta0, eta1, eta2, xi0, xi1, xi2; + for(auto vx : vertices){ + test_eta[0] = vx.at(0); + test_eta[1] = vx.at(1); + test_eta[2] = vx.at(2); + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + xmap->LocCoordToLocCollapsed(test_xi, test_eta); + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + xmap->LocCoordToLocCollapsed(test_xi, test_eta); + + vertices_found.insert( + { + (int) std::round(test_eta[0]), + (int) std::round(test_eta[1]), + (int) std::round(test_eta[2]) + } + ); + } + + const int num_vertices_expected = geom->GetNumVerts(); + const int num_vertices_found = vertices_found.size(); + + // At the time of writing TetGeom mapping is inconsistent with itself in Nektar++ + const bool nektar_mapping_consistent = num_vertices_found == num_vertices_expected; + + vertices_found.clear(); + + for(auto vx : vertices){ + test_eta[0] = vx.at(0); + test_eta[1] = vx.at(1); + test_eta[2] = vx.at(2); + + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi_neso); + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta[0], test_eta[1], test_eta[2], &xi0, &xi1, &xi2); + ASSERT_NEAR(test_xi_neso[0], xi0, 1.0e-14); + ASSERT_NEAR(test_xi_neso[1], xi1, 1.0e-14); + ASSERT_NEAR(test_xi_neso[2], xi2, 1.0e-14); + + if (nektar_mapping_consistent) { + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + ASSERT_NEAR(test_xi_neso[0], test_xi[0], 1.0e-14); + ASSERT_NEAR(test_xi_neso[1], test_xi[1], 1.0e-14); + ASSERT_NEAR(test_xi_neso[2], test_xi[2], 1.0e-14); + } + + GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, test_xi_neso, test_eta_neso); + GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi0, xi1, xi2, &eta0, &eta1, &eta2); + ASSERT_NEAR(test_eta_neso[0], eta0, 1.0e-14); + ASSERT_NEAR(test_eta_neso[1], eta1, 1.0e-14); + ASSERT_NEAR(test_eta_neso[2], eta2, 1.0e-14); + + if (nektar_mapping_consistent) { + xmap->LocCoordToLocCollapsed(test_xi_neso, test_eta); + ASSERT_NEAR(test_eta_neso[0], test_eta[0], 1.0e-14); + ASSERT_NEAR(test_eta_neso[1], test_eta[1], 1.0e-14); + ASSERT_NEAR(test_eta_neso[2], test_eta[2], 1.0e-14); + } + + vertices_found.insert( + { + (int) std::round(eta0), + (int) std::round(eta1), + (int) std::round(eta2) + } + ); + + } + + // Our implementations should be consistent. + ASSERT_EQ(vertices_found.size(), num_vertices_expected); + + /* + nprint(geom->GetShapeType(), lambda_stype(geom->GetShapeType())); nprint("Num bases:", xmap->GetNumBases()); for (int dx = 0; dx < 3; dx++) { @@ -157,6 +479,12 @@ TEST(ParticleGeometryInterfaceCurved, Init) { const auto y = xmap->PhysEvaluate(I, ptsy); const auto z = xmap->PhysEvaluate(I, ptsz); nprint(x, y, z); + + */ + + + + } mesh->free(); @@ -239,20 +567,37 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { auto lambda_forward_map = [&](auto geom, const auto &xi, auto &phys) { // Evaluate the forward map from xi to physical space using the expansion. auto xmap = geom->GetXmap(); - auto I0 = xmap->GetBasis(0)->GetI(xi); - auto I1 = xmap->GetBasis(1)->GetI(xi); - auto I2 = xmap->GetBasis(2)->GetI(xi); const int npts = xmap->GetTotPoints(); Array ptsx(npts), ptsy(npts), ptsz(npts); xmap->BwdTrans(geom->GetCoeffs(0), ptsx); xmap->BwdTrans(geom->GetCoeffs(1), ptsy); xmap->BwdTrans(geom->GetCoeffs(2), ptsz); Array eta(3); + Array test_eta(3); + xmap->LocCoordToLocCollapsed(xi, eta); + const int shape_type_int = static_cast(geom->GetShapeType()); + GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi, test_eta); + + ASSERT_NEAR(eta[0], test_eta[0], 1.0e-8); + ASSERT_NEAR(eta[1], test_eta[1], 1.0e-8); + ASSERT_NEAR(eta[2], test_eta[2], 1.0e-8); + + Array test_xi_neso(3); + Array test_xi_nektar(3); + + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, eta, test_xi_neso); + xmap->LocCollapsedToLocCoord(eta, test_xi_nektar); + ASSERT_NEAR(test_xi_nektar[0], test_xi_neso[0], 1.0e-8); + ASSERT_NEAR(test_xi_nektar[1], test_xi_neso[1], 1.0e-8); + ASSERT_NEAR(test_xi_nektar[2], test_xi_neso[2], 1.0e-8); + Array I(3); + I[0] = xmap->GetBasis(0)->GetI(eta); I[1] = xmap->GetBasis(1)->GetI(eta + 1); I[2] = xmap->GetBasis(2)->GetI(eta + 2); + const auto x = xmap->PhysEvaluate(I, ptsx); const auto y = xmap->PhysEvaluate(I, ptsy); const auto z = xmap->PhysEvaluate(I, ptsz); @@ -324,7 +669,7 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { EXPECT_TRUE(dist < 1.0e-8); // test the forward x map from reference space to physical space - Newton::XMapNewton mapper(sycl_target, geom); + Newton::XMapNewtonTest mapper(sycl_target, geom); REAL test_phys0, test_phys1, test_phys2; mapper.x(xi[0], xi[1], xi[2], &test_phys0, &test_phys1, &test_phys2); EXPECT_NEAR(phys[0], test_phys0, 1.0e-10); @@ -340,17 +685,39 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { (std::abs(test_xi1 - xi[1]) < 1.0e-8) && (std::abs(test_xi2 - xi[2]) < 1.0e-8); - // If there were multiple points inside the reference element that map to - // the same physical point there there are major problems with the mesh. - // Hence the point inside the reference element that maps to the physical - // point hould be unique. - ASSERT_TRUE(same_xi); + mapper.x(test_xi0, test_xi1, test_xi2, &test_phys0, &test_phys1, &test_phys2); + nprint("XI:", test_xi0, test_xi1, test_xi2, "PHYS:", test_phys0, test_phys1, test_phys2); + + // If the test_xi is xi then the inverse mapping was good + // Otherwise check test_xi is a reference coordinate that maps to phys + if (!same_xi) { + Array test_phys(3); + lambda_forward_map(geom, xi, test_phys); + const bool equiv_xi = (std::abs(test_phys[0] - phys[0]) < 1.0e-8) && + (std::abs(test_phys[1] - phys[1]) < 1.0e-8) && + (std::abs(test_phys[2] - phys[2]) < 1.0e-8); + // The point we sampled was considered contained by Nektar++ + // Check that this alternative reference point is also contained. + const REAL xi00 = test_xi0; + const REAL xi01 = test_xi1; + const REAL xi02 = test_xi2; + GeometryInterface::loc_coord_to_loc_collapsed_3d( + shape_type_int, xi00, xi01, xi02, &eta0, &eta1, &eta2); + const auto dist = lambda_test_contained(eta0, eta1, eta2); + nprint("dist1", dist, eta0, eta1, eta2); + EXPECT_TRUE(equiv_xi); + EXPECT_TRUE(dist < 1.0e-8); + } nprint("CHECK X MAP END"); }; for (auto gx : geoms) { auto geom = gx.second; + nprint("GLOBALID:", geom->GetGlobalID()); + if (geom->GetGlobalID() != 45){ + continue; + } auto xmap = geom->GetXmap(); const int shape_type_int = static_cast(geom->GetShapeType()); nprint(geom->GetShapeType(), lambda_stype(geom->GetShapeType())); @@ -359,11 +726,169 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { nprint("dx:", dx, "type:", lambda_btype(xmap->GetBasisType(dx)), xmap->GetBasisNumModes(dx)); } + + { + NekDouble x,y,z; + const auto num_verts = geom->GetNumVerts(); + for(int ix=0 ; ixGetVertex(ix); + vx->GetCoords(x,y,z); + nprint("VX:", ix, x, y, z); + } + } + Array test_eta(3); Array test_xi(3); Array test_phys(3); - lambda_sample_internal_point(geom, test_xi, test_phys); - lambda_check_x_map(geom, test_xi, test_phys); + + test_eta[0] = -1.0; + test_eta[1] = 1.0; + test_eta[2] = -1.0; + + geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); + nprint("ETA to XI"); + nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); + nprint("\t", " XI:", test_xi[0], test_xi[1], test_xi[2]); + geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); + nprint("XI to ETA"); + nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); + geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); + nprint("ETA to XI"); + nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); + nprint("\t", " XI:", test_xi[0], test_xi[1], test_xi[2]); + + nprint("NEKTAR FORWARD"); + lambda_forward_map(geom, test_xi, test_phys); + nprint("\t", "PHYS:", test_phys[0], test_phys[1], test_phys[2]); + + test_eta[0] = 1.0; + test_eta[1] = -1.0; + test_eta[2] = -1.0; + + geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); + nprint("ETA to XI"); + nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); + nprint("\t", " XI:", test_xi[0], test_xi[1], test_xi[2]); + geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); + nprint("XI to ETA"); + nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); + geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); + nprint("ETA to XI"); + nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); + nprint("\t", " XI:", test_xi[0], test_xi[1], test_xi[2]); + + nprint("NEKTAR FORWARD"); + lambda_forward_map(geom, test_xi, test_phys); + nprint("\t", "PHYS:", test_phys[0], test_phys[1], test_phys[2]); + + { + // Test vertices of reference element + std::vector> vertices = { + {-1.0, -1.0, -1.0}, + { 1.0, -1.0, -1.0}, + {-1.0, 1.0, -1.0}, + { 1.0, 1.0, -1.0}, + {-1.0, -1.0, 1.0}, + { 1.0, -1.0, 1.0}, + {-1.0, 1.0, 1.0}, + { 1.0, 1.0, 1.0} + }; + + for(auto &etav : vertices){ + nprint("=============================================="); + test_eta[0] = etav.at(0); + test_eta[1] = etav.at(1); + test_eta[2] = etav.at(2); + + // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi); + + nprint("ETA 0:", test_eta[0], test_eta[1], test_eta[2]); + geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); + // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi); + nprint(" XI 0:", test_xi[0], test_xi[1], test_xi[2]); + geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); + nprint("ETA 1:", test_eta[0], test_eta[1], test_eta[2]); + geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); + // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi); + nprint(" XI 1:", test_xi[0], test_xi[1], test_xi[2]); + geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); + nprint("ETA 2:", test_eta[0], test_eta[1], test_eta[2]); + + + lambda_forward_map(geom, test_xi, test_phys); + nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], "\n ETA O:", test_eta[0], test_eta[1], test_eta[2], "\nPHYS:", test_phys[0], test_phys[1], test_phys[2]); + + // Does nektar sucessfully invert the map? + Array test_xi_nektar(3); + auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); + nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], test_xi_nektar[2], "DIST:", dist); + } + + nprint("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + + for(auto &etav : vertices){ + nprint("=============================================="); + test_xi[0] = etav.at(0); + test_xi[1] = etav.at(1); + test_xi[2] = etav.at(2); + + if ((test_xi[0] + test_xi[1] + test_xi[2]) <= -0.9){ + geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); + nprint("ETA::", test_eta[0], test_eta[1], test_eta[2]); + + lambda_forward_map(geom, test_xi, test_phys); + nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], "PHYS:", test_phys[0], test_phys[1], test_phys[2]); + + // Does nektar sucessfully invert the map? + Array test_xi_nektar(3); + auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); + nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], test_xi_nektar[2], "DIST:", dist); + } + } + + + + + } + + + + // Test vertices of reference element + std::vector> vertices = { + //{-1.0, -1.0, -1.0}, + { 1.0, -1.0, -1.0}, + //{-1.0, 1.0, -1.0}, + //{ 1.0, 1.0, -1.0}, + //{-1.0, -1.0, 1.0}, + //{ 1.0, -1.0, 1.0}, + //{-1.0, 1.0, 1.0}, + //{ 1.0, 1.0, 1.0} + }; + + for(auto &etav : vertices){ + nprint("----------------------------------------------"); + test_eta[0] = etav.at(0); + test_eta[1] = etav.at(1); + test_eta[2] = etav.at(2); + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi); + lambda_forward_map(geom, test_xi, test_phys); + nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], "\nETA:", test_eta[0], test_eta[1], test_eta[2], "\nPHYS:", test_phys[0], test_phys[1], test_phys[2]); + + + // Does nektar sucessfully invert the map? + Array test_xi_nektar(3); + auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); + nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], test_xi_nektar[2], "DIST:", dist); + + lambda_check_x_map(geom, test_xi, test_phys); + } + + // test internal points + //for(int testx=0 ; testx<20 ; testx++){ + // nprint("=============================================="); + // lambda_sample_internal_point(geom, test_xi, test_phys); + // lambda_check_x_map(geom, test_xi, test_phys); + //} } mesh->free(); From 9bac47b6ed5bd5a9549eadf2bbf99ac3fb5ccd08 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 29 Oct 2024 11:44:31 +0000 Subject: [PATCH 17/66] added explicit test for 2D coordinate mapping --- .../nektar_interface/coordinate_mapping.hpp | 57 +-- .../mapping_newton_iteration_base.hpp | 12 +- .../newton_generic_3d.hpp | 32 +- .../particle_cell_mapping/newton_prism.hpp | 4 +- .../particle_cell_mapping/newton_pyr.hpp | 4 +- .../newton_triangle_embed_3d.hpp | 4 +- .../particle_cell_mapping/x_map_newton.hpp | 4 +- .../test_particle_geometry_interface.cpp | 108 ++++++ .../test_particle_geometry_interface_3d.cpp | 179 +++++---- ..._particle_geometry_interface_3d_curved.cpp | 350 +++++++++--------- 10 files changed, 422 insertions(+), 332 deletions(-) diff --git a/include/nektar_interface/coordinate_mapping.hpp b/include/nektar_interface/coordinate_mapping.hpp index 109ed65a..6423b858 100644 --- a/include/nektar_interface/coordinate_mapping.hpp +++ b/include/nektar_interface/coordinate_mapping.hpp @@ -454,8 +454,6 @@ struct Triangle : BaseCoordinateMapping2D { } }; - - /** * Map the local collapsed coordinate (eta) to the local coordinate (xi). * @@ -469,15 +467,9 @@ struct Triangle : BaseCoordinateMapping2D { * @param[in, out] xi2 Local coordinate. */ template -inline void loc_collapsed_to_loc_coord( - const int shape_type, - const T eta0, - const T eta1, - const T eta2, - T * xi0, - T * xi1, - T * xi2 - ) { +inline void loc_collapsed_to_loc_coord(const int shape_type, const T eta0, + const T eta1, const T eta2, T *xi0, + T *xi1, T *xi2) { /* Tet @@ -534,19 +526,17 @@ inline void loc_collapsed_to_loc_coord( const REAL a = 1.0 + eta0; const REAL b = 1.0 - eta2; const REAL c = (a) * (b)*0.5 - 1.0; - *xi1 = - (shape_type == shape_type_tet) - ? c - : ((shape_type == shape_type_pyr) ? (1.0 + eta1) * (b)*0.5 - 1.0 - : eta1); + *xi1 = (shape_type == shape_type_tet) + ? c + : ((shape_type == shape_type_pyr) ? (1.0 + eta1) * (b)*0.5 - 1.0 + : eta1); const REAL tet_x = (1.0 + eta0) * (-(*xi1) - eta2) * 0.5 - 1.0; *xi0 = (shape_type == shape_type_tet) - ? tet_x - : ((shape_type == shape_type_hex) ? eta0 : c); + ? tet_x + : ((shape_type == shape_type_hex) ? eta0 : c); *xi2 = eta2; } - /** * Map the local collapsed coordinate (eta) to the local coordinate (xi). * @@ -560,11 +550,10 @@ inline void loc_collapsed_to_loc_coord( template inline void loc_collapsed_to_loc_coord(const int shape_type, const T &eta, T &xi) { - loc_collapsed_to_loc_coord(shape_type, eta[0], eta[1], eta[2], &xi[0], &xi[1], &xi[2]); + loc_collapsed_to_loc_coord(shape_type, eta[0], eta[1], eta[2], &xi[0], &xi[1], + &xi[2]); } - - /** * Map the local coordinate (xi) to the local collapsed coordinate (eta). * @@ -618,7 +607,6 @@ inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T xi0, *eta2 = xi2; } - /** * Map the local coordinate (xi) to the local collapsed coordinate (eta). * @@ -631,7 +619,8 @@ inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T xi0, template inline void loc_coord_to_loc_collapsed_3d(const int shape_type, const T &xi, T &eta) { - loc_coord_to_loc_collapsed_3d(shape_type, xi[0], xi[1], xi[2], &eta[0], &eta[1], &eta[2]); + loc_coord_to_loc_collapsed_3d(shape_type, xi[0], xi[1], xi[2], &eta[0], + &eta[1], &eta[2]); } /** @@ -661,6 +650,26 @@ inline void loc_coord_to_loc_collapsed_2d(const int shape_type, const T xi0, *eta1 = xi1; } +/** + * Map the local collapsed coordinate (eta) to the local coordinate (xi). + * + * @param[in] shape_type Integer denoting shape type found by cast of Nektar++ + * shape type enum to int. + * @param[in] eta0 Local collapsed coordinate to map to local coordinate. + * @param[in] eta1 Local collapsed coordinate to map to local coordinate. + * @param[in, out] xi0 Local coordinate. + * @param[in, out] xi1 Local coordinate. + */ +template +inline void loc_collapsed_to_loc_coord_2d(const int shape_type, const T eta0, + const T eta1, T *xi0, T *xi1) { + constexpr int shape_type_tri = shape_type_to_int(LibUtilities::eTriangle); + *xi0 = (shape_type == shape_type_tri) + ? (1.0 + eta0) * (1.0 - eta1) * 0.5 - 1.0 + : eta0; + *xi1 = eta1; +} + /** * Clamp a single coordinate to the interval [-1-tol, 1+tol] for a given * tolerance. diff --git a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp index ea717005..b7dc0bb6 100644 --- a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp +++ b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp @@ -245,12 +245,12 @@ template struct MappingNewtonIterationBase { * @param[in] eta0 Local collapsed coordinate (eta), x component. * @param[in] eta1 Local collapsed coordinate (eta), y component. * @param[in] eta2 Local collapsed coordinate (eta), z component. - * @param[in, out] xi0 Local coordinate (xi) to be mapped to collapsed coordinate, - * x component. - * @param[in, out] xi1 Local coordinate (xi) to be mapped to collapsed coordinate, - * y component. - * @param[in, out] xi2 Local coordinate (xi) to be mapped to collapsed coordinate, - * z component. + * @param[in, out] xi0 Local coordinate (xi) to be mapped to collapsed + * coordinate, x component. + * @param[in, out] xi1 Local coordinate (xi) to be mapped to collapsed + * coordinate, y component. + * @param[in, out] xi2 Local coordinate (xi) to be mapped to collapsed + * coordinate, z component. */ inline void loc_collapsed_to_loc_coord(const void *d_data, const REAL eta0, const REAL eta1, const REAL eta2, diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index d9619582..645b66ce 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -249,20 +249,20 @@ struct MappingGeneric3D : MappingNewtonIterationBase { d->num_phys2, d->physvals, div_space0, div_space1, div_space2, X); - //const int n0 = d->num_phys0; - //const int n1 = d->num_phys1; - //const int n2 = d->num_phys2; - //nprint("n:", n0, n1, n2); - //for (int ix = 0; ix < n0; ix++) { - // nprint(div_space0[ix]); - //} - //for (int ix = 0; ix < n1; ix++) { - // nprint(div_space1[ix]); - //} - //for (int ix = 0; ix < n2; ix++) { - // nprint(div_space2[ix]); - //} - //nprint(X[0], X[1], X[2], phys0, phys1, phys2); + // const int n0 = d->num_phys0; + // const int n1 = d->num_phys1; + // const int n2 = d->num_phys2; + // nprint("n:", n0, n1, n2); + // for (int ix = 0; ix < n0; ix++) { + // nprint(div_space0[ix]); + // } + // for (int ix = 0; ix < n1; ix++) { + // nprint(div_space1[ix]); + // } + // for (int ix = 0; ix < n2; ix++) { + // nprint(div_space2[ix]); + // } + // nprint(X[0], X[1], X[2], phys0, phys1, phys2); // Residual is defined as F = X(xi) - P *f0 = X[0] - phys0; @@ -285,7 +285,7 @@ struct MappingGeneric3D : MappingNewtonIterationBase { inline void set_initial_iteration_v(const void *d_data, const REAL phys0, const REAL phys1, const REAL phys2, REAL *xi0, REAL *xi1, REAL *xi2) { - + /** * Implementations that avoid singularities: * newton_pyr @@ -293,7 +293,6 @@ struct MappingGeneric3D : MappingNewtonIterationBase { * */ - *xi0 = -0.2; *xi1 = -0.2; *xi2 = -0.2; @@ -322,7 +321,6 @@ struct MappingGeneric3D : MappingNewtonIterationBase { GeometryInterface::loc_collapsed_to_loc_coord(shape_type, eta0, eta1, eta2, xi0, xi1, xi2); } - }; /** diff --git a/include/nektar_interface/particle_cell_mapping/newton_prism.hpp b/include/nektar_interface/particle_cell_mapping/newton_prism.hpp index c30b2d84..ad112989 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_prism.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_prism.hpp @@ -104,8 +104,8 @@ struct MappingPrismLinear3D : MappingNewtonIterationBase { inline void loc_coord_to_loc_collapsed_v(const void *d_data, const REAL xi0, const REAL xi1, const REAL xi2, REAL *eta0, REAL *eta1, REAL *eta2) { - GeometryInterface::Prism{}.loc_coord_to_loc_collapsed( - xi0, xi1, xi2, eta0, eta1, eta2); + GeometryInterface::Prism{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, + eta1, eta2); } }; diff --git a/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp b/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp index 5a510f48..946bbbc9 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp @@ -147,8 +147,8 @@ struct MappingPyrLinear3D : MappingNewtonIterationBase { inline void loc_coord_to_loc_collapsed_v(const void *d_data, const REAL xi0, const REAL xi1, const REAL xi2, REAL *eta0, REAL *eta1, REAL *eta2) { - GeometryInterface::Pyramid{}.loc_coord_to_loc_collapsed( - xi0, xi1, xi2, eta0, eta1, eta2); + GeometryInterface::Pyramid{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, + eta1, eta2); } }; diff --git a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp index da9cd0af..31ef0943 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp @@ -169,8 +169,8 @@ struct MappingTriangleLinear2DEmbed3D const REAL xi1, const REAL xi2, REAL *eta0, REAL *eta1, REAL *eta2) { *eta2 = 0.0; - GeometryInterface::Triangle{}.loc_coord_to_loc_collapsed( - xi0, xi1, eta0, eta1); + GeometryInterface::Triangle{}.loc_coord_to_loc_collapsed(xi0, xi1, eta0, + eta1); } }; diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 89cb1cd8..b6d47307 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -212,7 +212,8 @@ template class XMapNewton { k_xi1 = -0.9 + g1 * k_grid_width; k_xi2 = -0.9 + g2 * k_grid_width; - nprint("~~~~~~~~~~~~~~", g0, g1, g2, ":", k_xi0, k_xi1, k_xi2); + nprint("~~~~~~~~~~~~~~", g0, g1, g2, ":", k_xi0, k_xi1, + k_xi2); // k_newton_type.set_initial_iteration(k_map_data, p0, p1, // p2, // &k_xi0, &k_xi1, @@ -281,7 +282,6 @@ template class XMapNewton { } }; - } // namespace NESO::Newton #endif diff --git a/test/unit/nektar_interface/test_particle_geometry_interface.cpp b/test/unit/nektar_interface/test_particle_geometry_interface.cpp index 505ebbb4..da96d02a 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface.cpp @@ -649,3 +649,111 @@ TEST(ParticleGeometryInterface, PointInSubDomain2D) { delete[] argv[0]; delete[] argv[1]; } + +TEST(ParticleGeometryInterface, CoordinateMapping2D) { + + int argc = 2; + char *argv[2]; + copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); + + std::filesystem::path source_file = __FILE__; + std::filesystem::path source_dir = source_file.parent_path(); + std::filesystem::path test_resources_dir = + source_dir / "../../test_resources"; + std::filesystem::path mesh_file = + test_resources_dir / "square_triangles_quads.xml"; + copy_to_cstring(std::string(mesh_file), &argv[1]); + + // Create session reader. + auto session = LibUtilities::SessionReader::CreateInstance(argc, argv); + + auto graph = SpatialDomains::MeshGraph::Read(session); + auto mesh = std::make_shared(graph); + std::map> geoms; + get_all_elements_2d(graph, geoms); + + std::set> vertices_found; + std::vector> vertices = { + {-1.0, -1.0, 0.0}, + {1.0, -1.0, 0.0}, + {-1.0, 1.0, 0.0}, + {1.0, 1.0, 0.0}, + }; + + auto lambda_test_wrapper = [&](auto geom, auto geom_test) { + const int shape_type_int = geom->GetShapeType(); + + Array test_eta(2); + Array test_xi(2); + REAL eta0, eta1, xi0, xi1, etaa, etab, xia, xib; + auto xmap = geom->GetXmap(); + for (auto vx : vertices) { + test_eta[0] = vx.at(0); + test_eta[1] = vx.at(1); + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + xmap->LocCoordToLocCollapsed(test_xi, test_eta); + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + xmap->LocCoordToLocCollapsed(test_xi, test_eta); + + vertices_found.insert( + {(int)std::round(test_eta[0]), (int)std::round(test_eta[1])}); + } + + const int num_vertices_expected = geom->GetNumVerts(); + const int num_vertices_found = vertices_found.size(); + const bool nektar_mapping_consistent = + num_vertices_found == num_vertices_expected; + vertices_found.clear(); + + for (auto vx : vertices) { + test_eta[0] = vx.at(0); + test_eta[1] = vx.at(1); + GeometryInterface::loc_collapsed_to_loc_coord_2d( + shape_type_int, test_eta[0], test_eta[1], &xi0, &xi1); + geom_test.loc_collapsed_to_loc_coord(test_eta[0], test_eta[1], &xia, + &xib); + ASSERT_NEAR(xia, xi0, 1.0e-14); + ASSERT_NEAR(xib, xi1, 1.0e-14); + + if (nektar_mapping_consistent) { + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + ASSERT_NEAR(test_xi[0], xi0, 1.0e-14); + ASSERT_NEAR(test_xi[1], xi1, 1.0e-14); + } + + GeometryInterface::loc_coord_to_loc_collapsed_2d(shape_type_int, xi0, xi1, + &eta0, &eta1); + geom_test.loc_coord_to_loc_collapsed(xi0, xi1, &etaa, &etab); + ASSERT_NEAR(etaa, eta0, 1.0e-14); + ASSERT_NEAR(etab, eta1, 1.0e-14); + + if (nektar_mapping_consistent) { + xmap->LocCoordToLocCollapsed(test_xi, test_eta); + ASSERT_NEAR(test_eta[0], eta0, 1.0e-14); + ASSERT_NEAR(test_eta[1], eta1, 1.0e-14); + } + vertices_found.insert({(int)std::round(eta0), (int)std::round(eta1)}); + } + + ASSERT_EQ(vertices_found.size(), num_vertices_expected); + }; + + for (auto &geom_pair : geoms) { + + auto geom = geom_pair.second; + auto shape_type = geom->GetShapeType(); + if (shape_type == LibUtilities::eQuadrilateral) { + GeometryInterface::Quadrilateral geom_test{}; + lambda_test_wrapper(geom, geom_test); + } else if (shape_type == LibUtilities::eTriangle) { + GeometryInterface::Triangle geom_test{}; + lambda_test_wrapper(geom, geom_test); + } else { + ASSERT_TRUE(false); + } + } + + mesh->free(); + delete[] argv[0]; + delete[] argv[1]; +} diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp index b36ad2c0..dda62da0 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp @@ -236,103 +236,97 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { std::set> vertices_found; std::vector> vertices = { - {-1.0, -1.0, -1.0}, - { 1.0, -1.0, -1.0}, - {-1.0, 1.0, -1.0}, - { 1.0, 1.0, -1.0}, - {-1.0, -1.0, 1.0}, - { 1.0, -1.0, 1.0}, - {-1.0, 1.0, 1.0}, - { 1.0, 1.0, 1.0} - }; - - for (auto &geom_pair : geoms) { - - auto geom = geom_pair.second; + {-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, + {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, + {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}; + + auto lambda_test_wrapper = [&](auto geom, auto geom_test) { + const int shape_type_int = geom->GetShapeType(); + + Array test_eta(3); + Array test_eta_neso(3); + Array test_xi(3); + Array test_xi_neso(3); + REAL eta0, eta1, eta2, xi0, xi1, xi2; + auto xmap = geom->GetXmap(); + for (auto vx : vertices) { + test_eta[0] = vx.at(0); + test_eta[1] = vx.at(1); + test_eta[2] = vx.at(2); + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + xmap->LocCoordToLocCollapsed(test_xi, test_eta); + xmap->LocCollapsedToLocCoord(test_eta, test_xi); + xmap->LocCoordToLocCollapsed(test_xi, test_eta); + + vertices_found.insert({(int)std::round(test_eta[0]), + (int)std::round(test_eta[1]), + (int)std::round(test_eta[2])}); + } - auto lambda_test_wrapper = [&]( - auto geom, - auto geom_test - ){ - const int shape_type_int = geom->GetShapeType(); - - Array test_eta(3); - Array test_eta_neso(3); - Array test_xi(3); - Array test_xi_neso(3); - REAL eta0, eta1, eta2, xi0, xi1, xi2; - auto xmap = geom->GetXmap(); - for(auto vx : vertices){ - test_eta[0] = vx.at(0); - test_eta[1] = vx.at(1); - test_eta[2] = vx.at(2); - xmap->LocCollapsedToLocCoord(test_eta, test_xi); - xmap->LocCoordToLocCollapsed(test_xi, test_eta); + const int num_vertices_expected = geom->GetNumVerts(); + const int num_vertices_found = vertices_found.size(); + + // At the time of writing TetGeom mapping is inconsistent with itself in + // Nektar++ + const bool nektar_mapping_consistent = + num_vertices_found == num_vertices_expected; + + vertices_found.clear(); + + for (auto vx : vertices) { + test_eta[0] = vx.at(0); + test_eta[1] = vx.at(1); + test_eta[2] = vx.at(2); + + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, + test_xi_neso); + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta[0], + test_eta[1], test_eta[2], + &xi0, &xi1, &xi2); + ASSERT_NEAR(test_xi_neso[0], xi0, 1.0e-14); + ASSERT_NEAR(test_xi_neso[1], xi1, 1.0e-14); + ASSERT_NEAR(test_xi_neso[2], xi2, 1.0e-14); + geom_test.loc_collapsed_to_loc_coord(eta0, eta1, eta2, &xi0, &xi1, &xi2); + ASSERT_NEAR(test_xi_neso[0], xi0, 1.0e-14); + ASSERT_NEAR(test_xi_neso[1], xi1, 1.0e-14); + ASSERT_NEAR(test_xi_neso[2], xi2, 1.0e-14); + + if (nektar_mapping_consistent) { xmap->LocCollapsedToLocCoord(test_eta, test_xi); - xmap->LocCoordToLocCollapsed(test_xi, test_eta); - - vertices_found.insert( - { - (int) std::round(test_eta[0]), - (int) std::round(test_eta[1]), - (int) std::round(test_eta[2]) - } - ); + ASSERT_NEAR(test_xi_neso[0], test_xi[0], 1.0e-14); + ASSERT_NEAR(test_xi_neso[1], test_xi[1], 1.0e-14); + ASSERT_NEAR(test_xi_neso[2], test_xi[2], 1.0e-14); } - const int num_vertices_expected = geom->GetNumVerts(); - const int num_vertices_found = vertices_found.size(); - - // At the time of writing TetGeom mapping is inconsistent with itself in Nektar++ - const bool nektar_mapping_consistent = num_vertices_found == num_vertices_expected; - - vertices_found.clear(); - - for(auto vx : vertices){ - test_eta[0] = vx.at(0); - test_eta[1] = vx.at(1); - test_eta[2] = vx.at(2); - - GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi_neso); - GeometryInterface::loc_collapsed_to_loc_coord( - shape_type_int, test_eta[0], test_eta[1], test_eta[2], &xi0, &xi1, &xi2); - ASSERT_NEAR(test_xi_neso[0], xi0, 1.0e-14); - ASSERT_NEAR(test_xi_neso[1], xi1, 1.0e-14); - ASSERT_NEAR(test_xi_neso[2], xi2, 1.0e-14); - - if (nektar_mapping_consistent) { - xmap->LocCollapsedToLocCoord(test_eta, test_xi); - ASSERT_NEAR(test_xi_neso[0], test_xi[0], 1.0e-14); - ASSERT_NEAR(test_xi_neso[1], test_xi[1], 1.0e-14); - ASSERT_NEAR(test_xi_neso[2], test_xi[2], 1.0e-14); - } - - GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, test_xi_neso, test_eta_neso); - GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi0, xi1, xi2, &eta0, &eta1, &eta2); - ASSERT_NEAR(test_eta_neso[0], eta0, 1.0e-14); - ASSERT_NEAR(test_eta_neso[1], eta1, 1.0e-14); - ASSERT_NEAR(test_eta_neso[2], eta2, 1.0e-14); - - if (nektar_mapping_consistent) { - xmap->LocCoordToLocCollapsed(test_xi_neso, test_eta); - ASSERT_NEAR(test_eta_neso[0], test_eta[0], 1.0e-14); - ASSERT_NEAR(test_eta_neso[1], test_eta[1], 1.0e-14); - ASSERT_NEAR(test_eta_neso[2], test_eta[2], 1.0e-14); - } - - vertices_found.insert( - { - (int) std::round(eta0), - (int) std::round(eta1), - (int) std::round(eta2) - } - ); - + GeometryInterface::loc_coord_to_loc_collapsed_3d( + shape_type_int, test_xi_neso, test_eta_neso); + GeometryInterface::loc_coord_to_loc_collapsed_3d( + shape_type_int, xi0, xi1, xi2, &eta0, &eta1, &eta2); + ASSERT_NEAR(test_eta_neso[0], eta0, 1.0e-14); + ASSERT_NEAR(test_eta_neso[1], eta1, 1.0e-14); + ASSERT_NEAR(test_eta_neso[2], eta2, 1.0e-14); + geom_test.loc_coord_to_loc_collapsed(xi0, xi1, xi2, &eta0, &eta1, &eta2); + ASSERT_NEAR(test_eta_neso[0], eta0, 1.0e-14); + ASSERT_NEAR(test_eta_neso[1], eta1, 1.0e-14); + ASSERT_NEAR(test_eta_neso[2], eta2, 1.0e-14); + + if (nektar_mapping_consistent) { + xmap->LocCoordToLocCollapsed(test_xi_neso, test_eta); + ASSERT_NEAR(test_eta_neso[0], test_eta[0], 1.0e-14); + ASSERT_NEAR(test_eta_neso[1], test_eta[1], 1.0e-14); + ASSERT_NEAR(test_eta_neso[2], test_eta[2], 1.0e-14); } - - // Our implementations should be consistent. - ASSERT_EQ(vertices_found.size(), num_vertices_expected); - }; + + vertices_found.insert({(int)std::round(eta0), (int)std::round(eta1), + (int)std::round(eta2)}); + } + + // Our implementations should be consistent. + ASSERT_EQ(vertices_found.size(), num_vertices_expected); + }; + + for (auto &geom_pair : geoms) { + auto geom = geom_pair.second; auto shape_type = geom->GetShapeType(); if (shape_type == LibUtilities::eTetrahedron) { @@ -380,7 +374,6 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { ASSERT_NEAR(xi0[2], xi1[2], 1.0e-8); }; - // test the function that maps all types dh_eta.h_buffer.ptr[0] = k_eta0; dh_eta.h_buffer.ptr[1] = k_eta1; diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 0c721782..0f99b65e 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -33,14 +33,14 @@ static inline void copy_to_cstring(std::string input, char **output) { // TODO REMOVE START namespace NESO::Newton { -template class XMapNewtonTest : public XMapNewton { +template +class XMapNewtonTest : public XMapNewton { public: - template - XMapNewtonTest(SYCLTargetSharedPtr sycl_target, std::shared_ptr geom, - const int num_modes_factor = 1) - : XMapNewton(sycl_target, geom, num_modes_factor) - {} + XMapNewtonTest(SYCLTargetSharedPtr sycl_target, + std::shared_ptr geom, + const int num_modes_factor = 1) + : XMapNewton(sycl_target, geom, num_modes_factor) {} inline bool x_inverse(const REAL phys0, const REAL phys1, const REAL phys2, REAL *xi0, REAL *xi1, REAL *xi2, @@ -96,7 +96,8 @@ template class XMapNewtonTest : public XMapNewton class XMapNewtonTest : public XMapNewton 15.0) || (ABS(k_xi1) > 15.0) || - (ABS(k_xi2) > 15.0) || (residual != residual); + (ABS(k_xi2) > 15.0) || + (residual != residual); converged = (residual <= k_tol) && (!diverged); } @@ -148,30 +150,35 @@ template class XMapNewtonTest : public XMapNewton class XMapNewtonTest : public XMapNewtondh_fdata->h_buffer.ptr[2]; return (this->dh_fdata->h_buffer.ptr[3] > 0); } - }; - - - -} +} // namespace NESO::Newton // TODO REMOVE END - - - TEST(ParticleGeometryInterfaceCurved, CoordinateMapping) { int size, rank; @@ -275,62 +275,55 @@ TEST(ParticleGeometryInterfaceCurved, CoordinateMapping) { } }; - auto lambda_to_collapsed_coord = [&]( - auto geom, - auto xi0, - auto xi1, - auto xi2, - auto * eta0, - auto * eta1, - auto * eta2 - ){ + auto lambda_to_collapsed_coord = [&](auto geom, auto xi0, auto xi1, auto xi2, + auto *eta0, auto *eta1, auto *eta2) { auto s = geom->GetShapeType(); switch (s) { case eTetrahedron: - GeometryInterface::Tetrahedron{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); + GeometryInterface::Tetrahedron{}.loc_coord_to_loc_collapsed( + xi0, xi1, xi2, eta0, eta1, eta2); break; case ePyramid: - GeometryInterface::Pyramid{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); + GeometryInterface::Pyramid{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, + eta0, eta1, eta2); break; case ePrism: - GeometryInterface::Prism{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); + GeometryInterface::Prism{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, + eta1, eta2); break; case eHexahedron: - GeometryInterface::Hexahedron{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); + GeometryInterface::Hexahedron{}.loc_coord_to_loc_collapsed( + xi0, xi1, xi2, eta0, eta1, eta2); break; default: return "shape unknown"; } }; - auto lambda_to_local_coord = [&]( - auto geom, - auto eta0, - auto eta1, - auto eta2, - auto * xi0, - auto * xi1, - auto * xi2 - ){ + auto lambda_to_local_coord = [&](auto geom, auto eta0, auto eta1, auto eta2, + auto *xi0, auto *xi1, auto *xi2) { auto s = geom->GetShapeType(); switch (s) { case eTetrahedron: - GeometryInterface::Tetrahedron{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, xi0, xi1, xi2); + GeometryInterface::Tetrahedron{}.loc_collapsed_to_loc_coord( + eta0, eta1, eta2, xi0, xi1, xi2); break; case ePyramid: - GeometryInterface::Pyramid{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, xi0, xi1, xi2); + GeometryInterface::Pyramid{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, + xi0, xi1, xi2); break; case ePrism: - GeometryInterface::Prism{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, xi0, xi1, xi2); + GeometryInterface::Prism{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, + xi0, xi1, xi2); break; case eHexahedron: - GeometryInterface::Hexahedron{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, xi0, xi1, xi2); + GeometryInterface::Hexahedron{}.loc_collapsed_to_loc_coord( + eta0, eta1, eta2, xi0, xi1, xi2); break; default: return "shape unknown"; } }; - for (auto gx : geoms) { auto geom = gx.second; auto xmap = geom->GetXmap(); @@ -338,22 +331,16 @@ TEST(ParticleGeometryInterfaceCurved, CoordinateMapping) { std::set> vertices_found; std::vector> vertices = { - {-1.0, -1.0, -1.0}, - { 1.0, -1.0, -1.0}, - {-1.0, 1.0, -1.0}, - { 1.0, 1.0, -1.0}, - {-1.0, -1.0, 1.0}, - { 1.0, -1.0, 1.0}, - {-1.0, 1.0, 1.0}, - { 1.0, 1.0, 1.0} - }; + {-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, + {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, + {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}; Array test_eta(3); Array test_eta_neso(3); Array test_xi(3); Array test_xi_neso(3); REAL eta0, eta1, eta2, xi0, xi1, xi2; - for(auto vx : vertices){ + for (auto vx : vertices) { test_eta[0] = vx.at(0); test_eta[1] = vx.at(1); test_eta[2] = vx.at(2); @@ -361,31 +348,32 @@ TEST(ParticleGeometryInterfaceCurved, CoordinateMapping) { xmap->LocCoordToLocCollapsed(test_xi, test_eta); xmap->LocCollapsedToLocCoord(test_eta, test_xi); xmap->LocCoordToLocCollapsed(test_xi, test_eta); - - vertices_found.insert( - { - (int) std::round(test_eta[0]), - (int) std::round(test_eta[1]), - (int) std::round(test_eta[2]) - } - ); + + vertices_found.insert({(int)std::round(test_eta[0]), + (int)std::round(test_eta[1]), + (int)std::round(test_eta[2])}); } const int num_vertices_expected = geom->GetNumVerts(); const int num_vertices_found = vertices_found.size(); - // At the time of writing TetGeom mapping is inconsistent with itself in Nektar++ - const bool nektar_mapping_consistent = num_vertices_found == num_vertices_expected; + // At the time of writing TetGeom mapping is inconsistent with itself in + // Nektar++ + const bool nektar_mapping_consistent = + num_vertices_found == num_vertices_expected; vertices_found.clear(); - for(auto vx : vertices){ + for (auto vx : vertices) { test_eta[0] = vx.at(0); test_eta[1] = vx.at(1); test_eta[2] = vx.at(2); - - GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi_neso); - GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta[0], test_eta[1], test_eta[2], &xi0, &xi1, &xi2); + + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, + test_xi_neso); + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta[0], + test_eta[1], test_eta[2], + &xi0, &xi1, &xi2); ASSERT_NEAR(test_xi_neso[0], xi0, 1.0e-14); ASSERT_NEAR(test_xi_neso[1], xi1, 1.0e-14); ASSERT_NEAR(test_xi_neso[2], xi2, 1.0e-14); @@ -397,8 +385,10 @@ TEST(ParticleGeometryInterfaceCurved, CoordinateMapping) { ASSERT_NEAR(test_xi_neso[2], test_xi[2], 1.0e-14); } - GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, test_xi_neso, test_eta_neso); - GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi0, xi1, xi2, &eta0, &eta1, &eta2); + GeometryInterface::loc_coord_to_loc_collapsed_3d( + shape_type_int, test_xi_neso, test_eta_neso); + GeometryInterface::loc_coord_to_loc_collapsed_3d( + shape_type_int, xi0, xi1, xi2, &eta0, &eta1, &eta2); ASSERT_NEAR(test_eta_neso[0], eta0, 1.0e-14); ASSERT_NEAR(test_eta_neso[1], eta1, 1.0e-14); ASSERT_NEAR(test_eta_neso[2], eta2, 1.0e-14); @@ -410,16 +400,10 @@ TEST(ParticleGeometryInterfaceCurved, CoordinateMapping) { ASSERT_NEAR(test_eta_neso[2], test_eta[2], 1.0e-14); } - vertices_found.insert( - { - (int) std::round(eta0), - (int) std::round(eta1), - (int) std::round(eta2) - } - ); - + vertices_found.insert({(int)std::round(eta0), (int)std::round(eta1), + (int)std::round(eta2)}); } - + // Our implementations should be consistent. ASSERT_EQ(vertices_found.size(), num_vertices_expected); @@ -481,10 +465,6 @@ TEST(ParticleGeometryInterfaceCurved, CoordinateMapping) { nprint(x, y, z); */ - - - - } mesh->free(); @@ -577,7 +557,8 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { xmap->LocCoordToLocCollapsed(xi, eta); const int shape_type_int = static_cast(geom->GetShapeType()); - GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi, test_eta); + GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi, + test_eta); ASSERT_NEAR(eta[0], test_eta[0], 1.0e-8); ASSERT_NEAR(eta[1], test_eta[1], 1.0e-8); @@ -586,7 +567,8 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { Array test_xi_neso(3); Array test_xi_nektar(3); - GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, eta, test_xi_neso); + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, eta, + test_xi_neso); xmap->LocCollapsedToLocCoord(eta, test_xi_nektar); ASSERT_NEAR(test_xi_nektar[0], test_xi_neso[0], 1.0e-8); ASSERT_NEAR(test_xi_nektar[1], test_xi_neso[1], 1.0e-8); @@ -685,8 +667,10 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { (std::abs(test_xi1 - xi[1]) < 1.0e-8) && (std::abs(test_xi2 - xi[2]) < 1.0e-8); - mapper.x(test_xi0, test_xi1, test_xi2, &test_phys0, &test_phys1, &test_phys2); - nprint("XI:", test_xi0, test_xi1, test_xi2, "PHYS:", test_phys0, test_phys1, test_phys2); + mapper.x(test_xi0, test_xi1, test_xi2, &test_phys0, &test_phys1, + &test_phys2); + nprint("XI:", test_xi0, test_xi1, test_xi2, "PHYS:", test_phys0, test_phys1, + test_phys2); // If the test_xi is xi then the inverse mapping was good // Otherwise check test_xi is a reference coordinate that maps to phys @@ -715,7 +699,7 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { for (auto gx : geoms) { auto geom = gx.second; nprint("GLOBALID:", geom->GetGlobalID()); - if (geom->GetGlobalID() != 45){ + if (geom->GetGlobalID() != 45) { continue; } auto xmap = geom->GetXmap(); @@ -726,13 +710,13 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { nprint("dx:", dx, "type:", lambda_btype(xmap->GetBasisType(dx)), xmap->GetBasisNumModes(dx)); } - + { - NekDouble x,y,z; + NekDouble x, y, z; const auto num_verts = geom->GetNumVerts(); - for(int ix=0 ; ixGetVertex(ix); - vx->GetCoords(x,y,z); + vx->GetCoords(x, y, z); nprint("VX:", ix, x, y, z); } } @@ -782,109 +766,107 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { nprint("\t", "PHYS:", test_phys[0], test_phys[1], test_phys[2]); { - // Test vertices of reference element - std::vector> vertices = { - {-1.0, -1.0, -1.0}, - { 1.0, -1.0, -1.0}, - {-1.0, 1.0, -1.0}, - { 1.0, 1.0, -1.0}, - {-1.0, -1.0, 1.0}, - { 1.0, -1.0, 1.0}, - {-1.0, 1.0, 1.0}, - { 1.0, 1.0, 1.0} - }; - - for(auto &etav : vertices){ - nprint("=============================================="); - test_eta[0] = etav.at(0); - test_eta[1] = etav.at(1); - test_eta[2] = etav.at(2); - - // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi); - - nprint("ETA 0:", test_eta[0], test_eta[1], test_eta[2]); - geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); - // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi); - nprint(" XI 0:", test_xi[0], test_xi[1], test_xi[2]); - geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); - nprint("ETA 1:", test_eta[0], test_eta[1], test_eta[2]); - geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); - // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi); - nprint(" XI 1:", test_xi[0], test_xi[1], test_xi[2]); - geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); - nprint("ETA 2:", test_eta[0], test_eta[1], test_eta[2]); - - - lambda_forward_map(geom, test_xi, test_phys); - nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], "\n ETA O:", test_eta[0], test_eta[1], test_eta[2], "\nPHYS:", test_phys[0], test_phys[1], test_phys[2]); - - // Does nektar sucessfully invert the map? - Array test_xi_nektar(3); - auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); - nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], test_xi_nektar[2], "DIST:", dist); - } + // Test vertices of reference element + std::vector> vertices = { + {-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, + {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, + {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}; + + for (auto &etav : vertices) { + nprint("=============================================="); + test_eta[0] = etav.at(0); + test_eta[1] = etav.at(1); + test_eta[2] = etav.at(2); + + // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, + // test_eta, test_xi); + + nprint("ETA 0:", test_eta[0], test_eta[1], test_eta[2]); + geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); + // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, + // test_eta, test_xi); + nprint(" XI 0:", test_xi[0], test_xi[1], test_xi[2]); + geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); + nprint("ETA 1:", test_eta[0], test_eta[1], test_eta[2]); + geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); + // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, + // test_eta, test_xi); + nprint(" XI 1:", test_xi[0], test_xi[1], test_xi[2]); + geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); + nprint("ETA 2:", test_eta[0], test_eta[1], test_eta[2]); + + lambda_forward_map(geom, test_xi, test_phys); + nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], + "\n ETA O:", test_eta[0], test_eta[1], test_eta[2], + "\nPHYS:", test_phys[0], test_phys[1], test_phys[2]); + + // Does nektar sucessfully invert the map? + Array test_xi_nektar(3); + auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); + nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], + test_xi_nektar[2], "DIST:", dist); + } - nprint("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + nprint("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); - for(auto &etav : vertices){ - nprint("=============================================="); - test_xi[0] = etav.at(0); - test_xi[1] = etav.at(1); - test_xi[2] = etav.at(2); + for (auto &etav : vertices) { + nprint("=============================================="); + test_xi[0] = etav.at(0); + test_xi[1] = etav.at(1); + test_xi[2] = etav.at(2); - if ((test_xi[0] + test_xi[1] + test_xi[2]) <= -0.9){ - geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); - nprint("ETA::", test_eta[0], test_eta[1], test_eta[2]); + if ((test_xi[0] + test_xi[1] + test_xi[2]) <= -0.9) { + geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); + nprint("ETA::", test_eta[0], test_eta[1], test_eta[2]); - lambda_forward_map(geom, test_xi, test_phys); - nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], "PHYS:", test_phys[0], test_phys[1], test_phys[2]); + lambda_forward_map(geom, test_xi, test_phys); + nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], + "PHYS:", test_phys[0], test_phys[1], test_phys[2]); - // Does nektar sucessfully invert the map? - Array test_xi_nektar(3); - auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); - nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], test_xi_nektar[2], "DIST:", dist); + // Does nektar sucessfully invert the map? + Array test_xi_nektar(3); + auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); + nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], + test_xi_nektar[2], "DIST:", dist); + } } } - - - - } - - - // Test vertices of reference element std::vector> vertices = { - //{-1.0, -1.0, -1.0}, - { 1.0, -1.0, -1.0}, - //{-1.0, 1.0, -1.0}, - //{ 1.0, 1.0, -1.0}, - //{-1.0, -1.0, 1.0}, - //{ 1.0, -1.0, 1.0}, - //{-1.0, 1.0, 1.0}, - //{ 1.0, 1.0, 1.0} + //{-1.0, -1.0, -1.0}, + {1.0, -1.0, -1.0}, + //{-1.0, 1.0, -1.0}, + //{ 1.0, 1.0, -1.0}, + //{-1.0, -1.0, 1.0}, + //{ 1.0, -1.0, 1.0}, + //{-1.0, 1.0, 1.0}, + //{ 1.0, 1.0, 1.0} }; - - for(auto &etav : vertices){ + + for (auto &etav : vertices) { nprint("----------------------------------------------"); test_eta[0] = etav.at(0); test_eta[1] = etav.at(1); test_eta[2] = etav.at(2); - GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi); + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, + test_xi); lambda_forward_map(geom, test_xi, test_phys); - nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], "\nETA:", test_eta[0], test_eta[1], test_eta[2], "\nPHYS:", test_phys[0], test_phys[1], test_phys[2]); - + nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], + "\nETA:", test_eta[0], test_eta[1], test_eta[2], + "\nPHYS:", test_phys[0], test_phys[1], test_phys[2]); // Does nektar sucessfully invert the map? Array test_xi_nektar(3); auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); - nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], test_xi_nektar[2], "DIST:", dist); + nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], + test_xi_nektar[2], "DIST:", dist); lambda_check_x_map(geom, test_xi, test_phys); } // test internal points - //for(int testx=0 ; testx<20 ; testx++){ + // for(int testx=0 ; testx<20 ; testx++){ // nprint("=============================================="); // lambda_sample_internal_point(geom, test_xi, test_phys); // lambda_check_x_map(geom, test_xi, test_phys); From c41f27b89d90f810cbb9639908ddc35d1a40d75a Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 29 Oct 2024 11:59:47 +0000 Subject: [PATCH 18/66] NESO tests now expose incorrect Tet coordinate mapping --- .../nektar_interface/test_particle_geometry_interface.cpp | 2 ++ .../test_particle_geometry_interface_3d.cpp | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/test/unit/nektar_interface/test_particle_geometry_interface.cpp b/test/unit/nektar_interface/test_particle_geometry_interface.cpp index da96d02a..b216f610 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface.cpp @@ -703,6 +703,7 @@ TEST(ParticleGeometryInterface, CoordinateMapping2D) { const int num_vertices_found = vertices_found.size(); const bool nektar_mapping_consistent = num_vertices_found == num_vertices_expected; + ASSERT_TRUE(nektar_mapping_consistent); vertices_found.clear(); for (auto vx : vertices) { @@ -736,6 +737,7 @@ TEST(ParticleGeometryInterface, CoordinateMapping2D) { } ASSERT_EQ(vertices_found.size(), num_vertices_expected); + vertices_found.clear(); }; for (auto &geom_pair : geoms) { diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp index dda62da0..c187b940 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp @@ -270,6 +270,8 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { // Nektar++ const bool nektar_mapping_consistent = num_vertices_found == num_vertices_expected; + ASSERT_TRUE(nektar_mapping_consistent || + (geom->GetShapeType() == LibUtilities::eTetrahedron)); vertices_found.clear(); @@ -286,7 +288,8 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { ASSERT_NEAR(test_xi_neso[0], xi0, 1.0e-14); ASSERT_NEAR(test_xi_neso[1], xi1, 1.0e-14); ASSERT_NEAR(test_xi_neso[2], xi2, 1.0e-14); - geom_test.loc_collapsed_to_loc_coord(eta0, eta1, eta2, &xi0, &xi1, &xi2); + geom_test.loc_collapsed_to_loc_coord(test_eta[0], test_eta[1], + test_eta[2], &xi0, &xi1, &xi2); ASSERT_NEAR(test_xi_neso[0], xi0, 1.0e-14); ASSERT_NEAR(test_xi_neso[1], xi1, 1.0e-14); ASSERT_NEAR(test_xi_neso[2], xi2, 1.0e-14); @@ -323,6 +326,7 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { // Our implementations should be consistent. ASSERT_EQ(vertices_found.size(), num_vertices_expected); + vertices_found.clear(); }; for (auto &geom_pair : geoms) { From 923f1072848882fcbe27d9036b60a9fb5327ed2f Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 29 Oct 2024 12:45:58 +0000 Subject: [PATCH 19/66] updated Tetrahedron collapsed to local coordinate mapping --- include/nektar_interface/coordinate_mapping.hpp | 9 +++++---- .../test_particle_geometry_interface_3d.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/include/nektar_interface/coordinate_mapping.hpp b/include/nektar_interface/coordinate_mapping.hpp index 6423b858..a074cac4 100644 --- a/include/nektar_interface/coordinate_mapping.hpp +++ b/include/nektar_interface/coordinate_mapping.hpp @@ -209,7 +209,7 @@ struct Tetrahedron : BaseCoordinateMapping3D { inline void loc_collapsed_to_loc_coord_v(const T eta0, const T eta1, const T eta2, T *xi0, T *xi1, T *xi2) { - *xi1 = (1.0 + eta0) * (1.0 - eta2) * 0.5 - 1.0; + *xi1 = (1.0 + eta1) * (1.0 - eta2) * 0.5 - 1.0; *xi0 = (1.0 + eta0) * (-(*xi1) - eta2) * 0.5 - 1.0; *xi2 = eta2; } @@ -474,7 +474,7 @@ inline void loc_collapsed_to_loc_coord(const int shape_type, const T eta0, /* Tet - xi[1] = (1.0 + eta[0]) * (1.0 - eta[2]) * 0.5 - 1.0; + xi[1] = (1.0 + eta[1]) * (1.0 - eta[2]) * 0.5 - 1.0; xi[0] = (1.0 + eta[0]) * (-xi[1] - eta[2]) * 0.5 - 1.0; xi[2] = eta[2]; @@ -525,7 +525,8 @@ inline void loc_collapsed_to_loc_coord(const int shape_type, const T eta0, const REAL a = 1.0 + eta0; const REAL b = 1.0 - eta2; - const REAL c = (a) * (b)*0.5 - 1.0; + const REAL c = (1.0 + eta1) * (b)*0.5 - 1.0; + const REAL d = (a) * (b)*0.5 - 1.0; *xi1 = (shape_type == shape_type_tet) ? c : ((shape_type == shape_type_pyr) ? (1.0 + eta1) * (b)*0.5 - 1.0 @@ -533,7 +534,7 @@ inline void loc_collapsed_to_loc_coord(const int shape_type, const T eta0, const REAL tet_x = (1.0 + eta0) * (-(*xi1) - eta2) * 0.5 - 1.0; *xi0 = (shape_type == shape_type_tet) ? tet_x - : ((shape_type == shape_type_hex) ? eta0 : c); + : ((shape_type == shape_type_hex) ? eta0 : d); *xi2 = eta2; } diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp index c187b940..058b1226 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d.cpp @@ -414,7 +414,8 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { xi1[dimx] = dh_xi.h_buffer.ptr[dimx]; eta0[dimx] = dh_eta.h_buffer.ptr[dimx]; } - geom->GetXmap()->LocCollapsedToLocCoord(eta0, xi0); + // geom->GetXmap()->LocCollapsedToLocCoord(eta0, xi0); + GeometryInterface::loc_collapsed_to_loc_coord(k_shape_type_int, eta0, xi0); lambda_test_xi(); // test the xi to eta map @@ -440,7 +441,9 @@ TEST(ParticleGeometryInterface, CoordinateMapping3D) { eta1[dimx] = dh_eta.h_buffer.ptr[dimx]; xi0[dimx] = dh_xi.h_buffer.ptr[dimx]; } - geom->GetXmap()->LocCoordToLocCollapsed(xi0, eta0); + // geom->GetXmap()->LocCoordToLocCollapsed(xi0, eta0); + GeometryInterface::loc_coord_to_loc_collapsed_3d(k_shape_type_int, xi0, + eta0); lambda_test_eta(); } From 1fa74886f00eece5e6b2223066b669497939ed0f Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 29 Oct 2024 12:55:21 +0000 Subject: [PATCH 20/66] updated some function names to name a correct namespace --- include/nektar_interface/coordinate_mapping.hpp | 3 ++- .../particle_cell_mapping/particle_cell_mapping_common.hpp | 2 +- src/nektar_interface/particle_boundary_conditions.cpp | 2 +- .../particle_cell_mapping/map_particles_2d_regular.cpp | 2 +- src/species.cpp | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/nektar_interface/coordinate_mapping.hpp b/include/nektar_interface/coordinate_mapping.hpp index a074cac4..99fadace 100644 --- a/include/nektar_interface/coordinate_mapping.hpp +++ b/include/nektar_interface/coordinate_mapping.hpp @@ -641,7 +641,8 @@ inline void loc_coord_to_loc_collapsed_2d(const int shape_type, const T xi0, constexpr int shape_type_tri = shape_type_to_int(LibUtilities::eTriangle); const NekDouble d1_original = 1.0 - xi1; - const bool mask_small_cond = (fabs(d1_original) < NekConstants::kNekZeroTol); + const bool mask_small_cond = + (sycl::fabs(d1_original) < NekConstants::kNekZeroTol); NekDouble d1 = d1_original; d1 = (mask_small_cond && (d1 >= 0.0)) diff --git a/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp b/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp index caba4edd..0620f83c 100644 --- a/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp +++ b/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp @@ -108,7 +108,7 @@ inline double get_local_coords_2d(std::shared_ptr geom, double eta1 = -2; if (geom->GetShapeType() == LibUtilities::eTriangle) { NekDouble d1 = 1. - Lcoords[1]; - if (fabs(d1) < NekConstants::kNekZeroTol) { + if (sycl::fabs(d1) < NekConstants::kNekZeroTol) { if (d1 >= 0.) { d1 = NekConstants::kNekZeroTol; } else { diff --git a/src/nektar_interface/particle_boundary_conditions.cpp b/src/nektar_interface/particle_boundary_conditions.cpp index 5129cc94..fc1ab33e 100644 --- a/src/nektar_interface/particle_boundary_conditions.cpp +++ b/src/nektar_interface/particle_boundary_conditions.cpp @@ -66,7 +66,7 @@ NektarCartesianPeriodic::NektarCartesianPeriodic( const double tmp_extent = k_extents[dimx]; const INT n_extent_offset_int = n_extent_offset_real + 2.0; const double pos_fmod = - fmod(pos + n_extent_offset_int * tmp_extent, tmp_extent); + sycl::fmod(pos + n_extent_offset_int * tmp_extent, tmp_extent); k_positions_dat.at(dimx) = pos_fmod + k_origin[dimx]; } }, diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_2d_regular.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_2d_regular.cpp index 22ce47f7..fc5e0360 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_2d_regular.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_2d_regular.cpp @@ -236,7 +236,7 @@ void MapParticles2DRegular::map(ParticleGroup &particle_group, double tmp_eta0; if (geom_type == k_geom_is_triangle) { NekDouble d1 = 1. - xi1; - if (fabs(d1) < NekConstants::kNekZeroTol) { + if (sycl::fabs(d1) < NekConstants::kNekZeroTol) { if (d1 >= 0.) { d1 = NekConstants::kNekZeroTol; } else { diff --git a/src/species.cpp b/src/species.cpp index 92d84162..c694800b 100644 --- a/src/species.cpp +++ b/src/species.cpp @@ -117,7 +117,7 @@ void Species::push(sycl::queue &queue, Mesh *mesh) { while (x_a[idx] < 0) { x_a[idx] += 1.0; } - x_a[idx] = std::fmod(x_a[idx], 1.0); + x_a[idx] = sycl::fmod(x_a[idx], 1.0); const double F1 = Mesh1D::sycl_evaluate_electric_field( mesh_a, k_mesh_size, electric_field_a, x_a[idx]); From 39999dad2bee541fe9ff6d3b56d56dadf9022726 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 29 Oct 2024 14:13:02 +0000 Subject: [PATCH 21/66] cleanup of test for curved cell binning --- ..._particle_geometry_interface_3d_curved.cpp | 190 +----------------- 1 file changed, 7 insertions(+), 183 deletions(-) diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 0f99b65e..82b193ea 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -553,27 +553,8 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { xmap->BwdTrans(geom->GetCoeffs(1), ptsy); xmap->BwdTrans(geom->GetCoeffs(2), ptsz); Array eta(3); - Array test_eta(3); xmap->LocCoordToLocCollapsed(xi, eta); - const int shape_type_int = static_cast(geom->GetShapeType()); - GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi, - test_eta); - - ASSERT_NEAR(eta[0], test_eta[0], 1.0e-8); - ASSERT_NEAR(eta[1], test_eta[1], 1.0e-8); - ASSERT_NEAR(eta[2], test_eta[2], 1.0e-8); - - Array test_xi_neso(3); - Array test_xi_nektar(3); - - GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, eta, - test_xi_neso); - xmap->LocCollapsedToLocCoord(eta, test_xi_nektar); - ASSERT_NEAR(test_xi_nektar[0], test_xi_neso[0], 1.0e-8); - ASSERT_NEAR(test_xi_nektar[1], test_xi_neso[1], 1.0e-8); - ASSERT_NEAR(test_xi_nektar[2], test_xi_neso[2], 1.0e-8); - Array I(3); I[0] = xmap->GetBasis(0)->GetI(eta); @@ -635,8 +616,6 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { auto lambda_check_x_map = [&](auto geom, Array &xi, Array &phys) { - nprint("CHECK X MAP START", xi[0], xi[1], xi[2], phys[0], phys[1], phys[2]); - REAL eta0, eta1, eta2; const int shape_type_int = static_cast(geom->GetShapeType()); // The point we sampled was considered contained by Nektar++ @@ -647,7 +626,6 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { GeometryInterface::loc_coord_to_loc_collapsed_3d(shape_type_int, xi00, xi01, xi02, &eta0, &eta1, &eta2); const auto dist = lambda_test_contained(eta0, eta1, eta2); - nprint("dist0", dist, eta0, eta1, eta2); EXPECT_TRUE(dist < 1.0e-8); // test the forward x map from reference space to physical space @@ -667,11 +645,6 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { (std::abs(test_xi1 - xi[1]) < 1.0e-8) && (std::abs(test_xi2 - xi[2]) < 1.0e-8); - mapper.x(test_xi0, test_xi1, test_xi2, &test_phys0, &test_phys1, - &test_phys2); - nprint("XI:", test_xi0, test_xi1, test_xi2, "PHYS:", test_phys0, test_phys1, - test_phys2); - // If the test_xi is xi then the inverse mapping was good // Otherwise check test_xi is a reference coordinate that maps to phys if (!same_xi) { @@ -688,189 +661,40 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { GeometryInterface::loc_coord_to_loc_collapsed_3d( shape_type_int, xi00, xi01, xi02, &eta0, &eta1, &eta2); const auto dist = lambda_test_contained(eta0, eta1, eta2); - nprint("dist1", dist, eta0, eta1, eta2); EXPECT_TRUE(equiv_xi); EXPECT_TRUE(dist < 1.0e-8); } - - nprint("CHECK X MAP END"); }; for (auto gx : geoms) { auto geom = gx.second; - nprint("GLOBALID:", geom->GetGlobalID()); - if (geom->GetGlobalID() != 45) { - continue; - } - auto xmap = geom->GetXmap(); const int shape_type_int = static_cast(geom->GetShapeType()); - nprint(geom->GetShapeType(), lambda_stype(geom->GetShapeType())); - nprint("Num bases:", xmap->GetNumBases()); - for (int dx = 0; dx < 3; dx++) { - nprint("dx:", dx, "type:", lambda_btype(xmap->GetBasisType(dx)), - xmap->GetBasisNumModes(dx)); - } - - { - NekDouble x, y, z; - const auto num_verts = geom->GetNumVerts(); - for (int ix = 0; ix < num_verts; ix++) { - auto vx = geom->GetVertex(ix); - vx->GetCoords(x, y, z); - nprint("VX:", ix, x, y, z); - } - } Array test_eta(3); Array test_xi(3); Array test_phys(3); - test_eta[0] = -1.0; - test_eta[1] = 1.0; - test_eta[2] = -1.0; - - geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); - nprint("ETA to XI"); - nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); - nprint("\t", " XI:", test_xi[0], test_xi[1], test_xi[2]); - geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); - nprint("XI to ETA"); - nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); - geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); - nprint("ETA to XI"); - nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); - nprint("\t", " XI:", test_xi[0], test_xi[1], test_xi[2]); - - nprint("NEKTAR FORWARD"); - lambda_forward_map(geom, test_xi, test_phys); - nprint("\t", "PHYS:", test_phys[0], test_phys[1], test_phys[2]); - - test_eta[0] = 1.0; - test_eta[1] = -1.0; - test_eta[2] = -1.0; - - geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); - nprint("ETA to XI"); - nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); - nprint("\t", " XI:", test_xi[0], test_xi[1], test_xi[2]); - geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); - nprint("XI to ETA"); - nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); - geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); - nprint("ETA to XI"); - nprint("\t", "ETA:", test_eta[0], test_eta[1], test_eta[2]); - nprint("\t", " XI:", test_xi[0], test_xi[1], test_xi[2]); - - nprint("NEKTAR FORWARD"); - lambda_forward_map(geom, test_xi, test_phys); - nprint("\t", "PHYS:", test_phys[0], test_phys[1], test_phys[2]); - - { - // Test vertices of reference element - std::vector> vertices = { - {-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, - {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, - {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}; - - for (auto &etav : vertices) { - nprint("=============================================="); - test_eta[0] = etav.at(0); - test_eta[1] = etav.at(1); - test_eta[2] = etav.at(2); - - // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, - // test_eta, test_xi); - - nprint("ETA 0:", test_eta[0], test_eta[1], test_eta[2]); - geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); - // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, - // test_eta, test_xi); - nprint(" XI 0:", test_xi[0], test_xi[1], test_xi[2]); - geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); - nprint("ETA 1:", test_eta[0], test_eta[1], test_eta[2]); - geom->GetXmap()->LocCollapsedToLocCoord(test_eta, test_xi); - // GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, - // test_eta, test_xi); - nprint(" XI 1:", test_xi[0], test_xi[1], test_xi[2]); - geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); - nprint("ETA 2:", test_eta[0], test_eta[1], test_eta[2]); - - lambda_forward_map(geom, test_xi, test_phys); - nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], - "\n ETA O:", test_eta[0], test_eta[1], test_eta[2], - "\nPHYS:", test_phys[0], test_phys[1], test_phys[2]); - - // Does nektar sucessfully invert the map? - Array test_xi_nektar(3); - auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); - nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], - test_xi_nektar[2], "DIST:", dist); - } - - nprint("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); - - for (auto &etav : vertices) { - nprint("=============================================="); - test_xi[0] = etav.at(0); - test_xi[1] = etav.at(1); - test_xi[2] = etav.at(2); - - if ((test_xi[0] + test_xi[1] + test_xi[2]) <= -0.9) { - geom->GetXmap()->LocCoordToLocCollapsed(test_xi, test_eta); - nprint("ETA::", test_eta[0], test_eta[1], test_eta[2]); - - lambda_forward_map(geom, test_xi, test_phys); - nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], - "PHYS:", test_phys[0], test_phys[1], test_phys[2]); - - // Does nektar sucessfully invert the map? - Array test_xi_nektar(3); - auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); - nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], - test_xi_nektar[2], "DIST:", dist); - } - } - } - // Test vertices of reference element std::vector> vertices = { - //{-1.0, -1.0, -1.0}, - {1.0, -1.0, -1.0}, - //{-1.0, 1.0, -1.0}, - //{ 1.0, 1.0, -1.0}, - //{-1.0, -1.0, 1.0}, - //{ 1.0, -1.0, 1.0}, - //{-1.0, 1.0, 1.0}, - //{ 1.0, 1.0, 1.0} - }; + {-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, + {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, + {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}; for (auto &etav : vertices) { - nprint("----------------------------------------------"); test_eta[0] = etav.at(0); test_eta[1] = etav.at(1); test_eta[2] = etav.at(2); GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, test_xi); lambda_forward_map(geom, test_xi, test_phys); - nprint("TEST: XI:", test_xi[0], test_xi[1], test_xi[2], - "\nETA:", test_eta[0], test_eta[1], test_eta[2], - "\nPHYS:", test_phys[0], test_phys[1], test_phys[2]); - - // Does nektar sucessfully invert the map? - Array test_xi_nektar(3); - auto dist = geom->GetLocCoords(test_phys, test_xi_nektar); - nprint("TEST: NK:", test_xi_nektar[0], test_xi_nektar[1], - test_xi_nektar[2], "DIST:", dist); - lambda_check_x_map(geom, test_xi, test_phys); } // test internal points - // for(int testx=0 ; testx<20 ; testx++){ - // nprint("=============================================="); - // lambda_sample_internal_point(geom, test_xi, test_phys); - // lambda_check_x_map(geom, test_xi, test_phys); - //} + for (int testx = 0; testx < 20; testx++) { + lambda_sample_internal_point(geom, test_xi, test_phys); + lambda_check_x_map(geom, test_xi, test_phys); + } } mesh->free(); From 09df508276b3be0bd59906f695437475b27c6768 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 29 Oct 2024 15:09:51 +0000 Subject: [PATCH 22/66] cleanup of newton iterations, XMapNewton test passing with curved cells --- .../map_particles_newton.hpp | 42 +++++++--- .../newton_generic_3d.hpp | 27 +------ .../particle_cell_mapping/newton_hex.hpp | 8 ++ .../particle_cell_mapping/newton_prism.hpp | 7 ++ .../particle_cell_mapping/newton_pyr.hpp | 7 ++ .../particle_cell_mapping/newton_quad.hpp | 8 ++ .../newton_quad_embed_3d.hpp | 8 ++ .../particle_cell_mapping/newton_tet.hpp | 7 ++ .../newton_triangle_embed_3d.hpp | 9 +++ .../particle_cell_mapping/x_map_newton.hpp | 76 ++++++------------- .../x_map_newton_kernel.hpp | 4 +- .../composite_intersection.cpp | 46 +++++++---- ..._particle_geometry_interface_3d_curved.cpp | 4 +- 13 files changed, 147 insertions(+), 106 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp index fbbc18a6..9ed10d63 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -197,12 +197,21 @@ class MapParticlesNewton : public CoarseMappersBase { k_newton_type.loc_coord_to_loc_collapsed( map_data, xi[0], xi[1], xi[2], &eta0, &eta1, &eta2); - bool contained = ((-1.0 - k_contained_tol) <= eta0) && - (eta0 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta1) && - (eta1 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta2) && - (eta2 <= (1.0 + k_contained_tol)); + eta0 = Kernel::min(eta0, 1.0 + k_contained_tol); + eta1 = Kernel::min(eta1, 1.0 + k_contained_tol); + eta2 = Kernel::min(eta2, 1.0 + k_contained_tol); + eta0 = Kernel::max(eta0, -1.0 - k_contained_tol); + eta1 = Kernel::max(eta1, -1.0 - k_contained_tol); + eta2 = Kernel::max(eta2, -1.0 - k_contained_tol); + + k_newton_type.loc_collapsed_to_loc_coord( + map_data, eta0, eta1, eta2, &xi[0], &xi[1], &xi[2]); + + const REAL clamped_residual = k_newton_type.newton_residual( + map_data, xi[0], xi[1], xi[2], p0, p1, p2, &eta0, &eta1, + &eta2, k_local_memory_ptr); + + const bool contained = clamped_residual <= k_newton_tol; cell_found = contained && converged; if (cell_found) { @@ -346,12 +355,21 @@ class MapParticlesNewton : public CoarseMappersBase { k_newton_type.loc_coord_to_loc_collapsed( map_data, xi[0], xi[1], xi[2], &eta0, &eta1, &eta2); - bool contained = ((-1.0 - k_contained_tol) <= eta0) && - (eta0 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta1) && - (eta1 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta2) && - (eta2 <= (1.0 + k_contained_tol)); + eta0 = Kernel::min(eta0, 1.0 + k_contained_tol); + eta1 = Kernel::min(eta1, 1.0 + k_contained_tol); + eta2 = Kernel::min(eta2, 1.0 + k_contained_tol); + eta0 = Kernel::max(eta0, -1.0 - k_contained_tol); + eta1 = Kernel::max(eta1, -1.0 - k_contained_tol); + eta2 = Kernel::max(eta2, -1.0 - k_contained_tol); + + k_newton_type.loc_collapsed_to_loc_coord( + map_data, eta0, eta1, eta2, &xi[0], &xi[1], &xi[2]); + + const REAL clamped_residual = k_newton_type.newton_residual( + map_data, xi[0], xi[1], xi[2], p0, p1, p2, &eta0, &eta1, + &eta2, k_local_memory_ptr); + + const bool contained = clamped_residual <= k_newton_tol; cell_found = contained && converged; diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index 645b66ce..cd55ced1 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -216,7 +216,6 @@ struct MappingGeneric3D : MappingNewtonIterationBase { (J0[0] * J2[1] - J0[1] * J2[0]) * (-f1) + (J0[0] * J1[1] - J0[1] * J1[0]) * (-f2)) * inverse_J; - nprint("NEW:", *xin0, *xin1, *xin2); } inline REAL newton_residual_v(const void *d_data, const REAL xi0, @@ -232,9 +231,6 @@ struct MappingGeneric3D : MappingNewtonIterationBase { this->loc_coord_to_loc_collapsed(d_data, xi0, xi1, xi2, &eta0, &eta1, &eta2); - std::cout << std::setprecision(16); - nprint("COORDS: XI", xi0, xi1, xi2, "ETA:", eta0, eta1, eta2); - // compute X at xi by evaluating the Bary interpolation at eta REAL *div_space0 = static_cast(local_memory); REAL *div_space1 = div_space0 + d->num_phys0; @@ -249,34 +245,15 @@ struct MappingGeneric3D : MappingNewtonIterationBase { d->num_phys2, d->physvals, div_space0, div_space1, div_space2, X); - // const int n0 = d->num_phys0; - // const int n1 = d->num_phys1; - // const int n2 = d->num_phys2; - // nprint("n:", n0, n1, n2); - // for (int ix = 0; ix < n0; ix++) { - // nprint(div_space0[ix]); - // } - // for (int ix = 0; ix < n1; ix++) { - // nprint(div_space1[ix]); - // } - // for (int ix = 0; ix < n2; ix++) { - // nprint(div_space2[ix]); - // } - // nprint(X[0], X[1], X[2], phys0, phys1, phys2); - // Residual is defined as F = X(xi) - P *f0 = X[0] - phys0; *f1 = X[1] - phys1; *f2 = X[2] - phys2; - nprint("PHYS:", phys0, phys1, phys2); - nprint(" X:", X[0], X[1], X[2]); - const REAL norm2 = MAX(MAX(ABS(*f0), ABS(*f1)), ABS(*f2)); const REAL tol_scaling = d->tol_scaling; const REAL scaled_norm2 = norm2 * tol_scaling; - nprint("TOL SCALING:", scaled_norm2, tol_scaling); return scaled_norm2; } @@ -288,9 +265,7 @@ struct MappingGeneric3D : MappingNewtonIterationBase { /** * Implementations that avoid singularities: - * newton_pyr - * - * + * newton_pyr? */ *xi0 = -0.2; diff --git a/include/nektar_interface/particle_cell_mapping/newton_hex.hpp b/include/nektar_interface/particle_cell_mapping/newton_hex.hpp index d6619af6..c7ea0588 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_hex.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_hex.hpp @@ -112,6 +112,14 @@ struct MappingHexLinear3D : MappingNewtonIterationBase { *eta1 = xi1; *eta2 = xi2; } + + inline void loc_collapsed_to_loc_coord_v(const void *d_data, const REAL eta0, + const REAL eta1, const REAL eta2, + REAL *xi0, REAL *xi1, REAL *xi2) { + *xi0 = eta0; + *xi1 = eta1; + *xi2 = eta2; + } }; } // namespace Newton diff --git a/include/nektar_interface/particle_cell_mapping/newton_prism.hpp b/include/nektar_interface/particle_cell_mapping/newton_prism.hpp index ad112989..f700a9ac 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_prism.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_prism.hpp @@ -107,6 +107,13 @@ struct MappingPrismLinear3D : MappingNewtonIterationBase { GeometryInterface::Prism{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); } + + inline void loc_collapsed_to_loc_coord_v(const void *d_data, const REAL eta0, + const REAL eta1, const REAL eta2, + REAL *xi0, REAL *xi1, REAL *xi2) { + GeometryInterface::Prism{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, xi0, + xi1, xi2); + } }; } // namespace Newton diff --git a/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp b/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp index 946bbbc9..22c66e9c 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_pyr.hpp @@ -150,6 +150,13 @@ struct MappingPyrLinear3D : MappingNewtonIterationBase { GeometryInterface::Pyramid{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, eta1, eta2); } + + inline void loc_collapsed_to_loc_coord_v(const void *d_data, const REAL eta0, + const REAL eta1, const REAL eta2, + REAL *xi0, REAL *xi1, REAL *xi2) { + GeometryInterface::Pyramid{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, + xi0, xi1, xi2); + } }; } // namespace Newton diff --git a/include/nektar_interface/particle_cell_mapping/newton_quad.hpp b/include/nektar_interface/particle_cell_mapping/newton_quad.hpp index ee890eea..7616ef6a 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_quad.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_quad.hpp @@ -122,6 +122,14 @@ struct MappingQuadLinear2D : MappingNewtonIterationBase { *eta1 = xi1; *eta2 = 0.0; } + + inline void loc_collapsed_to_loc_coord_v(const void *d_data, const REAL eta0, + const REAL eta1, const REAL eta2, + REAL *xi0, REAL *xi1, REAL *xi2) { + *xi0 = eta0; + *xi1 = eta1; + *xi2 = 0.0; + } }; } // namespace Newton diff --git a/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp index e2729790..489cbdee 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp @@ -154,6 +154,14 @@ struct MappingQuadLinear2DEmbed3D *eta1 = xi1; *eta2 = 0.0; } + + inline void loc_collapsed_to_loc_coord_v(const void *d_data, const REAL eta0, + const REAL eta1, const REAL eta2, + REAL *xi0, REAL *xi1, REAL *xi2) { + *xi0 = eta0; + *xi1 = eta1; + *xi2 = 0.0; + } }; } // namespace Newton diff --git a/include/nektar_interface/particle_cell_mapping/newton_tet.hpp b/include/nektar_interface/particle_cell_mapping/newton_tet.hpp index 44851b50..77ec3b23 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_tet.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_tet.hpp @@ -104,6 +104,13 @@ struct MappingTetLinear3D : MappingNewtonIterationBase { GeometryInterface::Tetrahedron{}.loc_coord_to_loc_collapsed( xi0, xi1, xi2, eta0, eta1, eta2); } + + inline void loc_collapsed_to_loc_coord_v(const void *d_data, const REAL eta0, + const REAL eta1, const REAL eta2, + REAL *xi0, REAL *xi1, REAL *xi2) { + GeometryInterface::Tetrahedron{}.loc_collapsed_to_loc_coord( + eta0, eta1, eta2, xi0, xi1, xi2); + } }; } // namespace Newton diff --git a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp index 31ef0943..75701a82 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp @@ -172,6 +172,15 @@ struct MappingTriangleLinear2DEmbed3D GeometryInterface::Triangle{}.loc_coord_to_loc_collapsed(xi0, xi1, eta0, eta1); } + + inline void loc_collapsed_to_loc_coord_v(const void *d_data, const REAL eta0, + const REAL eta1, const REAL eta2, + REAL *xi0, REAL *xi1, REAL *xi2) { + + *xi2 = 0.0; + GeometryInterface::Triangle{}.loc_collapsed_to_loc_coord(eta0, eta1, xi0, + xi1); + } }; } // namespace Newton diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index b6d47307..4f80c78e 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -180,7 +180,7 @@ template class XMapNewton { const int k_grid_size_x = std::max(grid_size - 1, 1); const int k_grid_size_y = k_ndim > 1 ? k_grid_size_x : 1; const int k_grid_size_z = k_ndim > 2 ? k_grid_size_x : 1; - const REAL k_grid_width = 1.8 / (k_grid_size_x); + const REAL k_grid_width = 2.0 / (k_grid_size_x); this->sycl_target->queue .submit([&](sycl::handler &cgh) { @@ -190,8 +190,8 @@ template class XMapNewton { cgh.parallel_for<>( sycl::nd_range<1>(sycl::range<1>(1), sycl::range<1>(1)), [=](auto idx) { - printf("NEWTON:\n"); MappingNewtonIterationBase k_newton_type{}; + XMapNewtonKernel k_newton_kernel{}; const REAL p0 = phys0; const REAL p1 = phys1; @@ -208,60 +208,34 @@ template class XMapNewton { for (int g0 = 0; (g0 <= k_grid_size_x) && (!cell_found); g0++) { - k_xi0 = -0.9 + g0 * k_grid_width; - k_xi1 = -0.9 + g1 * k_grid_width; - k_xi2 = -0.9 + g2 * k_grid_width; - - nprint("~~~~~~~~~~~~~~", g0, g1, g2, ":", k_xi0, k_xi1, - k_xi2); - // k_newton_type.set_initial_iteration(k_map_data, p0, p1, - // p2, - // &k_xi0, &k_xi1, - // &k_xi2); - - // Start of Newton iteration - REAL xin0, xin1, xin2; - REAL f0, f1, f2; - - residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, - &f2, &local_mem[0]); - - bool diverged = false; - bool converged = false; - printf("residual: %f\n", residual); - for (int stepx = 0; ((stepx < k_max_iterations) && - (!converged) && (!diverged)); - stepx++) { - printf("STEPX: %d, RES: %16.8e\n", stepx, residual); - - k_newton_type.newton_step( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f0, f1, - f2, &xin0, &xin1, &xin2, &local_mem[0]); - - k_xi0 = xin0; - k_xi1 = xin1; - k_xi2 = xin2; - - residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, - &f1, &f2, &local_mem[0]); - - diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || - (ABS(k_xi2) > 15.0); - converged = (residual <= k_tol) && (!diverged); - } + k_xi0 = -1.0 + g0 * k_grid_width; + k_xi1 = -1.0 + g1 * k_grid_width; + k_xi2 = -1.0 + g2 * k_grid_width; + bool converged = k_newton_kernel.x_inverse( + k_map_data, p0, p1, p2, &k_xi0, &k_xi1, &k_xi2, + &local_mem[0], k_max_iterations, k_tol, true); REAL eta0, eta1, eta2; + k_newton_type.loc_coord_to_loc_collapsed( k_map_data, k_xi0, k_xi1, k_xi2, &eta0, &eta1, &eta2); - bool contained = ((-1.0 - k_contained_tol) <= eta0) && - (eta0 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta1) && - (eta1 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta2) && - (eta2 <= (1.0 + k_contained_tol)); + eta0 = Kernel::min(eta0, 1.0 + k_contained_tol); + eta1 = Kernel::min(eta1, 1.0 + k_contained_tol); + eta2 = Kernel::min(eta2, 1.0 + k_contained_tol); + eta0 = Kernel::max(eta0, -1.0 - k_contained_tol); + eta1 = Kernel::max(eta1, -1.0 - k_contained_tol); + eta2 = Kernel::max(eta2, -1.0 - k_contained_tol); + + k_newton_type.loc_collapsed_to_loc_coord( + k_map_data, eta0, eta1, eta2, &k_xi0, &k_xi1, &k_xi2); + + const REAL clamped_residual = + k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, + &eta0, &eta1, &eta2, &local_mem[0]); + + const bool contained = clamped_residual <= k_tol; cell_found = contained && converged; } } diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp index 99da0ee7..73111d06 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp @@ -110,8 +110,8 @@ template struct XMapNewtonKernel { k_newton_type.newton_residual(map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, &f2, local_memory); - diverged = - (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || (ABS(k_xi2) > 15.0); + diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || + (ABS(k_xi2) > 15.0) || (!sycl::isfinite(residual)); } *xi0 = k_xi0; *xi1 = k_xi1; diff --git a/src/nektar_interface/composite_interaction/composite_intersection.cpp b/src/nektar_interface/composite_interaction/composite_intersection.cpp index 5364897a..11dda34e 100644 --- a/src/nektar_interface/composite_interaction/composite_intersection.cpp +++ b/src/nektar_interface/composite_interaction/composite_intersection.cpp @@ -525,13 +525,24 @@ void CompositeIntersection::find_intersections_3d( map_data, xi[0], xi[1], xi[2], &eta0, &eta1, &eta2); + eta0 = Kernel::min(eta0, 1.0 + k_contained_tol); + eta1 = Kernel::min(eta1, 1.0 + k_contained_tol); + eta2 = Kernel::min(eta2, 1.0 + k_contained_tol); + eta0 = Kernel::max(eta0, -1.0 - k_contained_tol); + eta1 = Kernel::max(eta1, -1.0 - k_contained_tol); + eta2 = Kernel::max(eta2, -1.0 - k_contained_tol); + + k_newton_type.loc_collapsed_to_loc_coord( + map_data, eta0, eta1, eta2, &xi[0], &xi[1], + &xi[2]); + + const REAL clamped_residual = + k_newton_type.newton_residual( + map_data, xi[0], xi[1], xi[2], i0, i1, i2, + &eta0, &eta1, &eta2, nullptr); + const bool contained = - ((-1.0 - k_contained_tol) <= eta0) && - (eta0 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta1) && - (eta1 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta2) && - (eta2 <= (1.0 + k_contained_tol)); + clamped_residual <= k_newton_tol; cell_found = contained && converged; if (cell_found) { @@ -681,13 +692,22 @@ void CompositeIntersection::find_intersections_3d( k_newton_type.loc_coord_to_loc_collapsed( map_data, xi0, xi1, xi2, &eta0, &eta1, &eta2); - const bool contained = - ((-1.0 - k_contained_tol) <= eta0) && - (eta0 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta1) && - (eta1 <= (1.0 + k_contained_tol)) && - ((-1.0 - k_contained_tol) <= eta2) && - (eta2 <= (1.0 + k_contained_tol)); + eta0 = Kernel::min(eta0, 1.0 + k_contained_tol); + eta1 = Kernel::min(eta1, 1.0 + k_contained_tol); + eta2 = Kernel::min(eta2, 1.0 + k_contained_tol); + eta0 = Kernel::max(eta0, -1.0 - k_contained_tol); + eta1 = Kernel::max(eta1, -1.0 - k_contained_tol); + eta2 = Kernel::max(eta2, -1.0 - k_contained_tol); + + k_newton_type.loc_collapsed_to_loc_coord( + map_data, eta0, eta1, eta2, &xi0, &xi1, &xi2); + + const REAL clamped_residual = + k_newton_type.newton_residual(map_data, xi0, xi1, xi2, + i0, i1, i2, &eta0, + &eta1, &eta2, nullptr); + + const bool contained = clamped_residual <= k_newton_tol; if (contained && converged) { const REAL r0 = p00 - i0; diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 82b193ea..8096a7a5 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -629,7 +629,7 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { EXPECT_TRUE(dist < 1.0e-8); // test the forward x map from reference space to physical space - Newton::XMapNewtonTest mapper(sycl_target, geom); + Newton::XMapNewton mapper(sycl_target, geom); REAL test_phys0, test_phys1, test_phys2; mapper.x(xi[0], xi[1], xi[2], &test_phys0, &test_phys1, &test_phys2); EXPECT_NEAR(phys[0], test_phys0, 1.0e-10); @@ -691,7 +691,7 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { } // test internal points - for (int testx = 0; testx < 20; testx++) { + for (int testx = 0; testx < 5; testx++) { lambda_sample_internal_point(geom, test_xi, test_phys); lambda_check_x_map(geom, test_xi, test_phys); } From 6dcc6799417834c8c1a9a55b91e0171703099adb Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 29 Oct 2024 15:16:15 +0000 Subject: [PATCH 23/66] removed redundant code from test --- ..._particle_geometry_interface_3d_curved.cpp | 473 ------------------ 1 file changed, 473 deletions(-) diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 8096a7a5..a656e834 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -30,449 +30,6 @@ static inline void copy_to_cstring(std::string input, char **output) { std::strcpy(*output, input.c_str()); } -// TODO REMOVE START -namespace NESO::Newton { - -template -class XMapNewtonTest : public XMapNewton { -public: - template - XMapNewtonTest(SYCLTargetSharedPtr sycl_target, - std::shared_ptr geom, - const int num_modes_factor = 1) - : XMapNewton(sycl_target, geom, num_modes_factor) {} - - inline bool x_inverse(const REAL phys0, const REAL phys1, const REAL phys2, - REAL *xi0, REAL *xi1, REAL *xi2, - const REAL tol = 1.0e-10, - const REAL contained_tol = 1.0e-10) { - - const int k_max_iterations = 51; - auto k_map_data = this->dh_data->d_buffer.ptr; - auto k_fdata = this->dh_fdata->d_buffer.ptr; - const REAL k_tol = tol; - const double k_contained_tol = contained_tol; - const std::size_t num_bytes_local = this->num_bytes_local; - - const int k_ndim = this->ndim; - const int grid_size = this->num_modes_factor * this->num_modes; - const int k_grid_size_x = std::max(grid_size - 1, 1); - const int k_grid_size_y = k_ndim > 1 ? k_grid_size_x : 1; - const int k_grid_size_z = k_ndim > 2 ? k_grid_size_x : 1; - const REAL k_grid_width = 2.0 / (k_grid_size_x); - - this->sycl_target->queue - .submit([&](sycl::handler &cgh) { - sycl::accessor - local_mem(sycl::range<1>(num_bytes_local), cgh); - cgh.parallel_for<>( - sycl::nd_range<1>(sycl::range<1>(1), sycl::range<1>(1)), - [=](auto idx) { - printf("NEWTON TEST ETA GRID:\n"); - MappingNewtonIterationBase k_newton_type{}; - - const REAL p0 = phys0; - const REAL p1 = phys1; - const REAL p2 = phys2; - REAL k_xi0; - REAL k_xi1; - REAL k_xi2; - REAL residual; - bool cell_found = false; - - for (int g2 = 0; (g2 <= k_grid_size_z) && (!cell_found); g2++) { - for (int g1 = 0; (g1 <= k_grid_size_y) && (!cell_found); - g1++) { - for (int g0 = 0; (g0 <= k_grid_size_x) && (!cell_found); - g0++) { - - REAL eta0, eta1, eta2; - - eta0 = -1.0 + g0 * k_grid_width; - eta1 = -1.0 + g1 * k_grid_width; - eta2 = -1.0 + g2 * k_grid_width; - - k_newton_type.loc_collapsed_to_loc_coord( - k_map_data, eta0, eta1, eta2, &k_xi0, &k_xi1, &k_xi2); - - nprint("~~~~~~~~~~~ ETA:", eta0, eta1, eta2, "XI:", k_xi0, - k_xi1, k_xi2); - - // k_newton_type.set_initial_iteration(k_map_data, p0, p1, - // p2, - // &k_xi0, &k_xi1, - // &k_xi2); - - // Start of Newton iteration - REAL xin0, xin1, xin2; - REAL f0, f1, f2; - - residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, - &f2, &local_mem[0]); - - bool diverged = false; - bool converged = false; - printf("residual: %f\n", residual); - for (int stepx = 0; ((stepx < k_max_iterations) && - (!converged) && (!diverged)); - stepx++) { - printf("STEPX: %d, RES: %16.8e\n", stepx, residual); - - k_newton_type.newton_step( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f0, f1, - f2, &xin0, &xin1, &xin2, &local_mem[0]); - - k_xi0 = xin0; - k_xi1 = xin1; - k_xi2 = xin2; - - residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, - &f1, &f2, &local_mem[0]); - - diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || - (ABS(k_xi2) > 15.0) || - (residual != residual); - converged = (residual <= k_tol) && (!diverged); - } - - k_newton_type.loc_coord_to_loc_collapsed( - k_map_data, k_xi0, k_xi1, k_xi2, &eta0, &eta1, &eta2); - - // bool contained = ((-1.0 - k_contained_tol) <= eta0) && - // (eta0 <= (1.0 + k_contained_tol)) && - // ((-1.0 - k_contained_tol) <= eta1) && - // (eta1 <= (1.0 + k_contained_tol)) && - // ((-1.0 - k_contained_tol) <= eta2) && - // (eta2 <= (1.0 + k_contained_tol)); - - nprint("CLAMPED START"); - nprint("BEFORE CLAMP:", eta0, eta1, eta2); - REAL clamped_eta0 = - Kernel::min(eta0, 1.0 + k_contained_tol); - REAL clamped_eta1 = - Kernel::min(eta1, 1.0 + k_contained_tol); - REAL clamped_eta2 = - Kernel::min(eta2, 1.0 + k_contained_tol); - clamped_eta0 = - Kernel::max(clamped_eta0, -1.0 - k_contained_tol); - clamped_eta1 = - Kernel::max(clamped_eta1, -1.0 - k_contained_tol); - clamped_eta2 = - Kernel::max(clamped_eta2, -1.0 - k_contained_tol); - nprint("AFTER CLAMP:", clamped_eta0, clamped_eta1, - clamped_eta2); - - REAL clamped_xi0, clamped_xi1, clamped_xi2; - k_newton_type.loc_collapsed_to_loc_coord( - k_map_data, clamped_eta0, clamped_eta1, clamped_eta2, - &clamped_xi0, &clamped_xi1, &clamped_xi2); - - const REAL clamped_residual = - k_newton_type.newton_residual( - k_map_data, clamped_xi0, clamped_xi1, clamped_xi2, - p0, p1, p2, &f0, &f1, &f2, &local_mem[0]); - - const bool contained = clamped_residual <= k_tol; - - nprint("CLAMPED END"); - - cell_found = contained && converged; - } - } - } - k_fdata[0] = k_xi0; - k_fdata[1] = k_xi1; - k_fdata[2] = k_xi2; - k_fdata[3] = (residual <= tol) ? 1 : -1; - }); - }) - .wait_and_throw(); - - this->dh_fdata->device_to_host(); - *xi0 = this->dh_fdata->h_buffer.ptr[0]; - *xi1 = this->dh_fdata->h_buffer.ptr[1]; - *xi2 = this->dh_fdata->h_buffer.ptr[2]; - return (this->dh_fdata->h_buffer.ptr[3] > 0); - } -}; - -} // namespace NESO::Newton -// TODO REMOVE END - -TEST(ParticleGeometryInterfaceCurved, CoordinateMapping) { - - int size, rank; - MPI_Comm_size(MPI_COMM_WORLD, &size); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - - LibUtilities::SessionReaderSharedPtr session; - SpatialDomains::MeshGraphSharedPtr graph; - - int argc = 3; - char *argv[3]; - copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); - - std::filesystem::path source_file = __FILE__; - std::filesystem::path source_dir = source_file.parent_path(); - std::filesystem::path test_resources_dir = - source_dir / "../../test_resources"; - std::filesystem::path conditions_file = - test_resources_dir / "reference_all_types_cube/conditions.xml"; - copy_to_cstring(std::string(conditions_file), &argv[1]); - // std::filesystem::path mesh_file = - // test_resources_dir / "reference_all_types_cube/mixed_ref_cube_0.2.xml"; - - // TODO - std::filesystem::path mesh_file = - "/home/js0259/git-ukaea/NESO-workspace/reference_all_types_cube/" - "mixed_ref_cube_0.5_perturbed_order_2.xml"; - copy_to_cstring(std::string(mesh_file), &argv[2]); - - // Create session reader. - session = LibUtilities::SessionReader::CreateInstance(argc, argv); - - // Create MeshGraph. - graph = SpatialDomains::MeshGraph::Read(session); - - // build map from owned mesh hierarchy cells to geoms that touch that cell - auto mesh = std::make_shared(graph); - - std::map> geoms; - get_all_elements_3d(graph, geoms); - - // TODO clenaup - auto lambda_stype = [](auto s) -> std::string { - switch (s) { - case eTetrahedron: - return "Tet"; - case ePyramid: - return "Pyr"; - case ePrism: - return "Prism"; - case eHexahedron: - return "Hex"; - default: - return "shape unknown"; - } - }; - - // TODO cleanip - auto lambda_btype = [](auto s) -> std::string { - switch (s) { - case eModified_A: - return "eA"; - case eModified_B: - return "eB"; - case eModified_C: - return "eC"; - case eModifiedPyr_C: - return "ePyrC"; - default: - return "basis unknown"; - } - }; - - auto lambda_to_collapsed_coord = [&](auto geom, auto xi0, auto xi1, auto xi2, - auto *eta0, auto *eta1, auto *eta2) { - auto s = geom->GetShapeType(); - switch (s) { - case eTetrahedron: - GeometryInterface::Tetrahedron{}.loc_coord_to_loc_collapsed( - xi0, xi1, xi2, eta0, eta1, eta2); - break; - case ePyramid: - GeometryInterface::Pyramid{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, - eta0, eta1, eta2); - break; - case ePrism: - GeometryInterface::Prism{}.loc_coord_to_loc_collapsed(xi0, xi1, xi2, eta0, - eta1, eta2); - break; - case eHexahedron: - GeometryInterface::Hexahedron{}.loc_coord_to_loc_collapsed( - xi0, xi1, xi2, eta0, eta1, eta2); - break; - default: - return "shape unknown"; - } - }; - auto lambda_to_local_coord = [&](auto geom, auto eta0, auto eta1, auto eta2, - auto *xi0, auto *xi1, auto *xi2) { - auto s = geom->GetShapeType(); - switch (s) { - case eTetrahedron: - GeometryInterface::Tetrahedron{}.loc_collapsed_to_loc_coord( - eta0, eta1, eta2, xi0, xi1, xi2); - break; - case ePyramid: - GeometryInterface::Pyramid{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, - xi0, xi1, xi2); - break; - case ePrism: - GeometryInterface::Prism{}.loc_collapsed_to_loc_coord(eta0, eta1, eta2, - xi0, xi1, xi2); - break; - case eHexahedron: - GeometryInterface::Hexahedron{}.loc_collapsed_to_loc_coord( - eta0, eta1, eta2, xi0, xi1, xi2); - break; - default: - return "shape unknown"; - } - }; - - for (auto gx : geoms) { - auto geom = gx.second; - auto xmap = geom->GetXmap(); - const int shape_type_int = geom->GetShapeType(); - - std::set> vertices_found; - std::vector> vertices = { - {-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, - {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, - {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}; - - Array test_eta(3); - Array test_eta_neso(3); - Array test_xi(3); - Array test_xi_neso(3); - REAL eta0, eta1, eta2, xi0, xi1, xi2; - for (auto vx : vertices) { - test_eta[0] = vx.at(0); - test_eta[1] = vx.at(1); - test_eta[2] = vx.at(2); - xmap->LocCollapsedToLocCoord(test_eta, test_xi); - xmap->LocCoordToLocCollapsed(test_xi, test_eta); - xmap->LocCollapsedToLocCoord(test_eta, test_xi); - xmap->LocCoordToLocCollapsed(test_xi, test_eta); - - vertices_found.insert({(int)std::round(test_eta[0]), - (int)std::round(test_eta[1]), - (int)std::round(test_eta[2])}); - } - - const int num_vertices_expected = geom->GetNumVerts(); - const int num_vertices_found = vertices_found.size(); - - // At the time of writing TetGeom mapping is inconsistent with itself in - // Nektar++ - const bool nektar_mapping_consistent = - num_vertices_found == num_vertices_expected; - - vertices_found.clear(); - - for (auto vx : vertices) { - test_eta[0] = vx.at(0); - test_eta[1] = vx.at(1); - test_eta[2] = vx.at(2); - - GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta, - test_xi_neso); - GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, test_eta[0], - test_eta[1], test_eta[2], - &xi0, &xi1, &xi2); - ASSERT_NEAR(test_xi_neso[0], xi0, 1.0e-14); - ASSERT_NEAR(test_xi_neso[1], xi1, 1.0e-14); - ASSERT_NEAR(test_xi_neso[2], xi2, 1.0e-14); - - if (nektar_mapping_consistent) { - xmap->LocCollapsedToLocCoord(test_eta, test_xi); - ASSERT_NEAR(test_xi_neso[0], test_xi[0], 1.0e-14); - ASSERT_NEAR(test_xi_neso[1], test_xi[1], 1.0e-14); - ASSERT_NEAR(test_xi_neso[2], test_xi[2], 1.0e-14); - } - - GeometryInterface::loc_coord_to_loc_collapsed_3d( - shape_type_int, test_xi_neso, test_eta_neso); - GeometryInterface::loc_coord_to_loc_collapsed_3d( - shape_type_int, xi0, xi1, xi2, &eta0, &eta1, &eta2); - ASSERT_NEAR(test_eta_neso[0], eta0, 1.0e-14); - ASSERT_NEAR(test_eta_neso[1], eta1, 1.0e-14); - ASSERT_NEAR(test_eta_neso[2], eta2, 1.0e-14); - - if (nektar_mapping_consistent) { - xmap->LocCoordToLocCollapsed(test_xi_neso, test_eta); - ASSERT_NEAR(test_eta_neso[0], test_eta[0], 1.0e-14); - ASSERT_NEAR(test_eta_neso[1], test_eta[1], 1.0e-14); - ASSERT_NEAR(test_eta_neso[2], test_eta[2], 1.0e-14); - } - - vertices_found.insert({(int)std::round(eta0), (int)std::round(eta1), - (int)std::round(eta2)}); - } - - // Our implementations should be consistent. - ASSERT_EQ(vertices_found.size(), num_vertices_expected); - - /* - - nprint(geom->GetShapeType(), lambda_stype(geom->GetShapeType())); - nprint("Num bases:", xmap->GetNumBases()); - for (int dx = 0; dx < 3; dx++) { - nprint("dx:", dx, "type:", lambda_btype(xmap->GetBasisType(dx)), - xmap->GetBasisNumModes(dx)); - } - - Array Lcoord(3); - Array Lcoord2(3); - Array Gcoord(3); - Array Gcoord2(3); - Lcoord[0] = -0.05; - Lcoord[1] = -0.05; - Lcoord[2] = -0.05; - - for (int dx = 0; dx < 3; dx++) { - // calls phys evaluate which takes a loc coord not a loc collapsed coord - Gcoord[dx] = geom->GetCoord(dx, Lcoord); - } - - geom->GetLocCoords(Gcoord, Lcoord2); - - for (int dx = 0; dx < 3; dx++) { - // calls phys evaluate which takes a loc coord not a loc collapsed coord - Gcoord2[dx] = geom->GetCoord(dx, Lcoord2); - } - nprint(Lcoord[0], Lcoord[1], Lcoord[2], "\n", Lcoord2[0], Lcoord2[1], - Lcoord2[2], "\n", Gcoord[0], Gcoord[1], Gcoord[2], "\n", Gcoord2[0], - Gcoord2[1], Gcoord2[2], "\n------"); - - auto I0 = xmap->GetBasis(0)->GetI(Lcoord); - auto I1 = xmap->GetBasis(1)->GetI(Lcoord); - auto I2 = xmap->GetBasis(2)->GetI(Lcoord); - - for (auto ix = I0->begin(); ix != I0->end(); ix++) { - nprint(*ix); - } - nprint("-----"); - const int npts = xmap->GetTotPoints(); - Array ptsx(npts), ptsy(npts), ptsz(npts); - xmap->BwdTrans(geom->GetCoeffs(0), ptsx); - xmap->BwdTrans(geom->GetCoeffs(1), ptsy); - xmap->BwdTrans(geom->GetCoeffs(2), ptsz); - - Array eta(3); - xmap->LocCoordToLocCollapsed(Lcoord, eta); - Array I(3); - I[0] = xmap->GetBasis(0)->GetI(eta); - I[1] = xmap->GetBasis(1)->GetI(eta + 1); - I[2] = xmap->GetBasis(2)->GetI(eta + 2); - const auto x = xmap->PhysEvaluate(I, ptsx); - const auto y = xmap->PhysEvaluate(I, ptsy); - const auto z = xmap->PhysEvaluate(I, ptsz); - nprint(x, y, z); - - */ - } - - mesh->free(); - delete[] argv[0]; - delete[] argv[1]; - delete[] argv[2]; -} - TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { int size, rank; @@ -514,36 +71,6 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { std::map> geoms; get_all_elements_3d(graph, geoms); - auto lambda_stype = [](auto s) -> std::string { - switch (s) { - case eTetrahedron: - return "Tet"; - case ePyramid: - return "Pyr"; - case ePrism: - return "Prism"; - case eHexahedron: - return "Hex"; - default: - return "shape unknown"; - } - }; - - auto lambda_btype = [](auto s) -> std::string { - switch (s) { - case eModified_A: - return "eA"; - case eModified_B: - return "eB"; - case eModified_C: - return "eC"; - case eModifiedPyr_C: - return "ePyrC"; - default: - return "basis unknown"; - } - }; - auto lambda_forward_map = [&](auto geom, const auto &xi, auto &phys) { // Evaluate the forward map from xi to physical space using the expansion. auto xmap = geom->GetXmap(); From 89829a02ce8e659aef528e0105396f235dff9e4a Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 30 Oct 2024 14:18:32 +0000 Subject: [PATCH 24/66] local memory bug fixes and deprecation warnings --- .../function_bary_evaluation.hpp | 5 +- .../function_basis_evaluation.hpp | 5 +- .../function_basis_projection.hpp | 5 +- .../newton_generic_3d.hpp | 3 ++ .../particle_cell_mapping/x_map_newton.hpp | 53 ++++++++++++------- include/nektar_interface/utility_sycl.hpp | 5 +- 6 files changed, 46 insertions(+), 30 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index b426c090..54950cfa 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -256,9 +256,8 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { this->sycl_target->queue .submit([&](sycl::handler &cgh) { // Allocate local memory to compute the divides. - sycl::accessor - local_mem(sycl::range<1>(local_num_reals * local_size), cgh); + sycl::local_accessor local_mem( + sycl::range<1>(local_num_reals * local_size), cgh); cgh.parallel_for<>(pl_iter_range, [=](sycl::nd_item<2> idx) { const INT cellx = idx.get_global_id(0); diff --git a/include/nektar_interface/function_basis_evaluation.hpp b/include/nektar_interface/function_basis_evaluation.hpp index 67d3c6d2..b55b7688 100644 --- a/include/nektar_interface/function_basis_evaluation.hpp +++ b/include/nektar_interface/function_basis_evaluation.hpp @@ -102,9 +102,8 @@ class FunctionEvaluateBasis : public BasisEvaluateBase { sycl::range<2> local_iterset{1, local_size}; auto event_loop = this->sycl_target->queue.submit([&](sycl::handler &cgh) { - sycl::accessor - local_mem(sycl::range<1>(local_mem_num_items), cgh); + sycl::local_accessor local_mem( + sycl::range<1>(local_mem_num_items), cgh); cgh.parallel_for<>( sycl::nd_range<2>(cell_iterset_range, local_iterset), diff --git a/include/nektar_interface/function_basis_projection.hpp b/include/nektar_interface/function_basis_projection.hpp index 2ae3eb1a..29b9a37a 100644 --- a/include/nektar_interface/function_basis_projection.hpp +++ b/include/nektar_interface/function_basis_projection.hpp @@ -102,9 +102,8 @@ template class FunctionProjectBasis : public BasisEvaluateBase { sycl::range<2> local_iterset{1, local_size}; auto event_loop = this->sycl_target->queue.submit([&](sycl::handler &cgh) { - sycl::accessor - local_mem(sycl::range<1>(local_mem_num_items), cgh); + sycl::local_accessor local_mem( + sycl::range<1>(local_mem_num_items), cgh); cgh.parallel_for<>( sycl::nd_range<2>(cell_iterset_range, local_iterset), diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index cd55ced1..808f5f93 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -135,6 +135,9 @@ struct MappingGeneric3D : MappingNewtonIterationBase { // Create a device buffer with the z,bw,physvals h_data->d_zbw = std::make_unique>(sycl_target, s_zbw); + // Number of bytes required for local memory + h_data->data_size_local = + (num_phys0 + num_phys1 + num_phys2) * sizeof(REAL); // store the pointers into the buffer we just made in the device struct so // that pointer arithmetric does not have to happen in the kernel but the diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 4f80c78e..52f4a197 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -57,7 +57,10 @@ template class XMapNewton { this->newton_type.write_data(this->sycl_target, geom, h_data_ptr, d_data_ptr); - this->dh_data->host_to_device(); + + if (this->num_bytes_per_map_device) { + this->dh_data->host_to_device(); + } this->num_bytes_local = std::max(static_cast(1), this->newton_type.data_size_local(h_data_ptr)); @@ -109,15 +112,23 @@ template class XMapNewton { inline void x(const REAL xi0, const REAL xi1, const REAL xi2, REAL *phys0, REAL *phys1, REAL *phys2) { - auto k_map_data = this->dh_data->d_buffer.ptr; + char *k_map_data; + if (this->dh_data) { + k_map_data = this->dh_data->d_buffer.ptr; + } + NESOASSERT(this->dh_fdata != nullptr, "Bad pointer"); auto k_fdata = this->dh_fdata->d_buffer.ptr; + NESOASSERT(k_fdata != nullptr, "Bad pointer"); const std::size_t num_bytes_local = this->num_bytes_local; + const REAL k_xi0 = xi0; + const REAL k_xi1 = xi1; + const REAL k_xi2 = xi2; + this->sycl_target->queue - .submit([&](sycl::handler &cgh) { - sycl::accessor - local_mem(sycl::range<1>(num_bytes_local), cgh); + .submit([=](sycl::handler &cgh) { + sycl::local_accessor local_mem( + sycl::range<1>(num_bytes_local), cgh); cgh.parallel_for<>( sycl::nd_range<1>(sycl::range<1>(1), sycl::range<1>(1)), @@ -131,8 +142,9 @@ template class XMapNewton { const REAL p1 = 0.0; const REAL p2 = 0.0; - k_newton_type.newton_residual(k_map_data, xi0, xi1, xi2, p0, p1, - p2, &f0, &f1, &f2, &local_mem[0]); + k_newton_type.newton_residual(k_map_data, k_xi0, k_xi1, k_xi2, + p0, p1, p2, &f0, &f1, &f2, + &local_mem[0]); k_fdata[0] = f0; k_fdata[1] = f1; @@ -169,8 +181,14 @@ template class XMapNewton { const REAL contained_tol = 1.0e-10) { const int k_max_iterations = 51; - auto k_map_data = this->dh_data->d_buffer.ptr; + char *k_map_data; + if (this->dh_data) { + k_map_data = this->dh_data->d_buffer.ptr; + } + NESOASSERT(this->dh_fdata != nullptr, "Bad pointer"); auto k_fdata = this->dh_fdata->d_buffer.ptr; + NESOASSERT(k_fdata != nullptr, "Bad pointer"); + const REAL k_tol = tol; const double k_contained_tol = contained_tol; const std::size_t num_bytes_local = this->num_bytes_local; @@ -184,9 +202,9 @@ template class XMapNewton { this->sycl_target->queue .submit([&](sycl::handler &cgh) { - sycl::accessor - local_mem(sycl::range<1>(num_bytes_local), cgh); + sycl::local_accessor local_mem( + sycl::range<1>(num_bytes_local), cgh); + cgh.parallel_for<>( sycl::nd_range<1>(sycl::range<1>(1), sycl::range<1>(1)), [=](auto idx) { @@ -230,12 +248,11 @@ template class XMapNewton { k_newton_type.loc_collapsed_to_loc_coord( k_map_data, eta0, eta1, eta2, &k_xi0, &k_xi1, &k_xi2); - const REAL clamped_residual = - k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, - &eta0, &eta1, &eta2, &local_mem[0]); + residual = k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &eta0, + &eta1, &eta2, &local_mem[0]); - const bool contained = clamped_residual <= k_tol; + const bool contained = residual <= k_tol; cell_found = contained && converged; } } @@ -243,7 +260,7 @@ template class XMapNewton { k_fdata[0] = k_xi0; k_fdata[1] = k_xi1; k_fdata[2] = k_xi2; - k_fdata[3] = (residual <= tol) ? 1 : -1; + k_fdata[3] = (residual <= tol) && cell_found ? 1 : -1; }); }) .wait_and_throw(); diff --git a/include/nektar_interface/utility_sycl.hpp b/include/nektar_interface/utility_sycl.hpp index dc625ad8..a26775bd 100644 --- a/include/nektar_interface/utility_sycl.hpp +++ b/include/nektar_interface/utility_sycl.hpp @@ -25,9 +25,8 @@ inline std::size_t get_num_local_work_items(SYCLTargetSharedPtr sycl_target, const std::size_t default_num) { sycl::device device = sycl_target->device; auto local_mem_exists = - device.is_host() || - (device.get_info() != - sycl::info::local_mem_type::none); + device.get_info() != + sycl::info::local_mem_type::none; auto local_mem_size = device.get_info(); const std::size_t max_num_workitems = local_mem_size / num_bytes; From b571bf2b12a55390a671d36b186d26a16f6fa8cf Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Thu, 31 Oct 2024 11:57:00 +0000 Subject: [PATCH 25/66] loosened regular mapper default tolerance --- .../particle_cell_mapping/map_particles_2d_regular.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_2d_regular.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_2d_regular.cpp index fc5e0360..1271db29 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_2d_regular.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_2d_regular.cpp @@ -9,7 +9,7 @@ MapParticles2DRegular::MapParticles2DRegular( : CoarseMappersBase(sycl_target), particle_mesh_interface(particle_mesh_interface) { - this->tol = config->get("MapParticles2DRegular/tol", 0.0); + this->tol = config->get("MapParticles2DRegular/tol", 1.0e-12); // filter out the non-regular elements // process locally owned elements From edbad59512fddc239faefd5bbab392d8825dc375 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Thu, 31 Oct 2024 12:43:04 +0000 Subject: [PATCH 26/66] cleanup some TODOs --- include/nektar_interface/bary_interpolation/bary_evaluation.hpp | 1 - .../particle_cell_mapping/mapping_newton_iteration_base.hpp | 1 - 2 files changed, 2 deletions(-) diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp index 99b10334..f2cc1906 100644 --- a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -146,7 +146,6 @@ inline void compute_dir_210_interlaced( const int num_phys0, const int num_phys1, const int num_phys2, const REAL *const physvals, const REAL *const div_space0, const REAL *const div_space1, const REAL *const div_space2, REAL *output) { - // writes via this tmporary until restrict keyword added TODO. REAL tmp[N]; for (int ix = 0; ix < N; ix++) { tmp[ix] = 0.0; diff --git a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp index b7dc0bb6..f0a6a944 100644 --- a/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp +++ b/include/nektar_interface/particle_cell_mapping/mapping_newton_iteration_base.hpp @@ -258,7 +258,6 @@ template struct MappingNewtonIterationBase { auto &underlying = static_cast(*this); underlying.loc_collapsed_to_loc_coord_v(d_data, eta0, eta1, eta2, xi0, xi1, xi2); - // TODO IMPLEMENT FOR NEWTON TYPES } }; From b2e4f03fc854988e6f9726aa0a99c2df689fcc64 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Fri, 1 Nov 2024 14:15:56 +0000 Subject: [PATCH 27/66] moved exising bary interpolation to better particle looping method --- .../function_bary_evaluation.hpp | 135 +++++++++--------- 1 file changed, 66 insertions(+), 69 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 54950cfa..6f7d1000 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -216,22 +216,6 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { } this->dh_global_physvals.host_to_device(); - // iteration set specification for the particle loop - auto mpi_rank_dat = particle_group->mpi_rank_dat; - const auto pl_stride = mpi_rank_dat->get_particle_loop_cell_stride(); - const auto pl_npart_cell = mpi_rank_dat->get_particle_loop_npart_cell(); - - const std::size_t local_num_reals = 2 * this->stride_base; - const std::size_t local_size = get_num_local_work_items( - this->sycl_target, local_num_reals * sizeof(REAL), 32); - const std::size_t cell_global_size = - get_particle_loop_global_size(mpi_rank_dat, local_size); - const std::size_t ncells = mpi_rank_dat->cell_dat.ncells; - - sycl::range<2> global_iter_set{ncells, cell_global_size}; - sycl::range<2> local_iter_set{1, local_size}; - sycl::nd_range<2> pl_iter_range{global_iter_set, local_iter_set}; - // output and particle position dats auto k_output = (*particle_group)[sym]->cell_dat.device_ptr(); const auto k_ref_positions = @@ -253,59 +237,72 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { const auto k_map_to_geom_type = this->cell_id_translation->dh_map_to_geom_type.d_buffer.ptr; - this->sycl_target->queue - .submit([&](sycl::handler &cgh) { - // Allocate local memory to compute the divides. - sycl::local_accessor local_mem( - sycl::range<1>(local_num_reals * local_size), cgh); - - cgh.parallel_for<>(pl_iter_range, [=](sycl::nd_item<2> idx) { - const INT cellx = idx.get_global_id(0); - const int idx_local = idx.get_local_id(1); - const INT layerx = idx.get_global_id(1); - if (layerx < pl_npart_cell[cellx]) { - - REAL *div_space0 = &local_mem[idx_local * 2 * k_stride_base]; - REAL *div_space1 = div_space0 + k_stride_base; - - // query the map from cells to expansion type - const int expansion_type = k_map_to_geom_type[cellx]; - // use the type key to index into the Bary weights and points - const int expansion_type_offset = - (expansion_type == k_index_tri_geom) - ? 0 - : k_stride_expansion_type; - // get the z values and weights for this expansion type - const auto z0 = &k_z[expansion_type_offset]; - const auto z1 = &k_z[expansion_type_offset + k_stride_base]; - const auto bw0 = &k_bw[expansion_type_offset]; - const auto bw1 = &k_bw[expansion_type_offset + k_stride_base]; - - const REAL xi0 = k_ref_positions[cellx][0][layerx]; - const REAL xi1 = k_ref_positions[cellx][1][layerx]; - // If this cell is a triangle then we need to map to the - // collapsed coordinates. - REAL coord0, coord1; - - GeometryInterface::loc_coord_to_loc_collapsed_2d( - expansion_type, xi0, xi1, &coord0, &coord1); - - const int num_phys0 = k_phys_num0[cellx]; - const int num_phys1 = k_phys_num1[cellx]; - - // Get pointer to the start of the quadrature point values for - // this cell - const auto physvals = &k_global_physvals[k_phys_offsets[cellx]]; - - const REAL evaluation = - Bary::evaluate_2d(coord0, coord1, num_phys0, num_phys1, - physvals, div_space0, z0, z1, bw0, bw1); - - k_output[cellx][k_component][layerx] = evaluation; - } - }); - }) - .wait_and_throw(); + // iteration set specification for the particle loop + auto mpi_rank_dat = particle_group->mpi_rank_dat; + ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat, + 16}; + const std::size_t local_size = 256; + const std::size_t local_num_reals = 2 * this->stride_base; + const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); + + EventStack es; + auto is = ish.get_all_cells(local_size, num_bytes_local); + + for (auto &blockx : is) { + const auto block_device = blockx.block_device; + es.push(sycl_target->queue.submit([&](sycl::handler &cgh) { + // Allocate local memory to compute the divides. + sycl::local_accessor local_mem( + sycl::range<1>(local_num_reals * blockx.local_size), cgh); + + cgh.parallel_for<>( + blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { + const int idx_local = idx.get_local_id(1); + std::size_t cell; + std::size_t layer; + block_device.get_cell_layer(idx, &cell, &layer); + if (block_device.work_item_required(cell, layer)) { + REAL *div_space0 = &local_mem[idx_local * 2 * k_stride_base]; + + // query the map from cells to expansion type + const int expansion_type = k_map_to_geom_type[cell]; + // use the type key to index into the Bary weights and points + const int expansion_type_offset = + (expansion_type == k_index_tri_geom) + ? 0 + : k_stride_expansion_type; + // get the z values and weights for this expansion type + const auto z0 = &k_z[expansion_type_offset]; + const auto z1 = &k_z[expansion_type_offset + k_stride_base]; + const auto bw0 = &k_bw[expansion_type_offset]; + const auto bw1 = &k_bw[expansion_type_offset + k_stride_base]; + + const REAL xi0 = k_ref_positions[cell][0][layer]; + const REAL xi1 = k_ref_positions[cell][1][layer]; + // If this cell is a triangle then we need to map to the + // collapsed coordinates. + REAL coord0, coord1; + + GeometryInterface::loc_coord_to_loc_collapsed_2d( + expansion_type, xi0, xi1, &coord0, &coord1); + + const int num_phys0 = k_phys_num0[cell]; + const int num_phys1 = k_phys_num1[cell]; + + // Get pointer to the start of the quadrature point values for + // this cell + const auto physvals = &k_global_physvals[k_phys_offsets[cell]]; + + const REAL evaluation = + Bary::evaluate_2d(coord0, coord1, num_phys0, num_phys1, + physvals, div_space0, z0, z1, bw0, bw1); + + k_output[cell][k_component][layer] = evaluation; + } + }); + })); + } + es.wait(); } }; From 9feb33640e6a72c6b923928babbc132b186a4649 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Fri, 1 Nov 2024 14:49:34 +0000 Subject: [PATCH 28/66] added a stride to the local memory part of bary interpolation --- .../bary_interpolation/bary_evaluation.hpp | 102 ++++++++++-------- .../test_particle_function_evaluation_3d.cpp | 23 +++- 2 files changed, 77 insertions(+), 48 deletions(-) diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp index f2cc1906..daaa221b 100644 --- a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -16,19 +16,22 @@ namespace NESO::Bary { * points. * @param[in] z_values A length num_phys array containing the quadrature * weights. - * @param[in, out] div_values Array of length num_phys which will be + * @param[in, out] div_values Array of length num_phys * stride which will be * populated with the bw_i/(r - r_i) values. + * @param[in] stride Stride to use for storing elements in div_values, + * default 1. */ inline void preprocess_weights(const int num_phys, const REAL coord, const REAL *const z_values, - const REAL *const bw_values, REAL *div_values) { + const REAL *const bw_values, REAL *div_values, + const std::size_t stride = 1) { for (int ix = 0; ix < num_phys; ix++) { - div_values[ix] = 0.0; + div_values[ix * stride] = 0.0; } for (int ix = 0; ix < num_phys; ix++) { const auto xdiff = z_values[ix] - coord; if (xdiff == 0.0) { - div_values[ix] = 1.0; + div_values[ix * stride] = 1.0; return; } } @@ -36,31 +39,31 @@ inline void preprocess_weights(const int num_phys, const REAL coord, for (int ix = 0; ix < num_phys; ix++) { const auto xdiff = z_values[ix] - coord; const auto bw_over_diff = bw_values[ix] / xdiff; - div_values[ix] = bw_over_diff; + div_values[ix * stride] = bw_over_diff; denom += bw_over_diff; } const REAL factor = 1.0 / denom; for (int ix = 0; ix < num_phys; ix++) { - div_values[ix] *= factor; + div_values[ix * stride] *= factor; } } /** - * Perform Bary interpolation in the first dimension. This function is - * intended to be called from a function that performs Bary interpolation - * over the second dimension and first dimension. + * Perform Bary interpolation in the first dimension. * * @param num_phys Number of quadrature points. * @param physvals Vector of length num_phys plus padding to multiple of the * vector length which contains the quadrature point values. + * @param stride Stride between elements in div_space, default 1. * @returns Contribution to Bary interpolation from a dimension 0 evaluation. */ inline REAL compute_dir_0(const int num_phys, const REAL *const physvals, - const REAL *const div_space) { + const REAL *const div_space, + const std::size_t stride = 1) { REAL numer = 0.0; for (int ix = 0; ix < num_phys; ix++) { const REAL pval = physvals[ix]; - const REAL tmp = div_space[ix]; + const REAL tmp = div_space[ix * stride]; numer += tmp * pval; } const REAL eval0 = numer; @@ -68,25 +71,26 @@ inline REAL compute_dir_0(const int num_phys, const REAL *const physvals, } /** - * Computes Bary interpolation over two dimensions. The inner dimension is - * computed with calls to compute_dir_0. + * Computes Bary interpolation over two dimensions. * * @param num_phys0 Number of quadrature points in dimension 0. * @param num_phys1 Number of quadrature points in dimension 1. * @param physvals Array of function values at quadrature points. * @param div_space0 The output of preprocess_weights applied to dimension 0. * @param div_space1 The output of preprocess_weights applied to dimension 1. + * @param stride Stride between elements in div_space, default 1. * @returns Bary evaluation of a function at a coordinate. */ inline REAL compute_dir_10(const int num_phys0, const int num_phys1, const REAL *const physvals, const REAL *const div_space0, - const REAL *const div_space1) { + const REAL *const div_space1, + const std::size_t stride = 1) { REAL pval1 = 0.0; for (int i1 = 0; i1 < num_phys1; i1++) { - const REAL c1 = div_space1[i1]; + const REAL c1 = div_space1[i1 * stride]; for (int i0 = 0; i0 < num_phys0; i0++) { - pval1 += physvals[i1 * num_phys0 + i0] * div_space0[i0] * c1; + pval1 += physvals[i1 * num_phys0 + i0] * div_space0[i0 * stride] * c1; } } return pval1; @@ -102,22 +106,25 @@ inline REAL compute_dir_10(const int num_phys0, const int num_phys1, * @param div_space0 The output of preprocess_weights applied to dimension 0. * @param div_space1 The output of preprocess_weights applied to dimension 1. * @param div_space2 The output of preprocess_weights applied to dimension 2. + * @param stride Stride between elements in div_space, default 1. * @returns Bary evaluation of a function at a coordinate. */ inline REAL compute_dir_210(const int num_phys0, const int num_phys1, const int num_phys2, const REAL *const physvals, const REAL *const div_space0, const REAL *const div_space1, - const REAL *const div_space2) { - const int stride = num_phys0 * num_phys1; + const REAL *const div_space2, + const std::size_t stride = 1) { + + const int stride_phys = num_phys0 * num_phys1; REAL pval2 = 0.0; for (int i2 = 0; i2 < num_phys2; i2++) { - const REAL c2 = div_space2[i2]; + const REAL c2 = div_space2[i2 * stride]; for (int i1 = 0; i1 < num_phys1; i1++) { - const REAL c1 = c2 * div_space1[i1]; + const REAL c1 = c2 * div_space1[i1 * stride]; for (int i0 = 0; i0 < num_phys0; i0++) { - pval2 += - physvals[i2 * stride + i1 * num_phys0 + i0] * div_space0[i0] * c1; + pval2 += physvals[i2 * stride_phys + i1 * num_phys0 + i0] * + div_space0[i0 * stride] * c1; } } } @@ -139,25 +146,27 @@ inline REAL compute_dir_210(const int num_phys0, const int num_phys1, * dimension 1. * @param[in] div_space2 The output of preprocess_weights applied to * dimension 2. + * @param stride Stride between elements in div_space, default 1. * @param[in, out] output Output function evaluations. */ template inline void compute_dir_210_interlaced( const int num_phys0, const int num_phys1, const int num_phys2, const REAL *const physvals, const REAL *const div_space0, - const REAL *const div_space1, const REAL *const div_space2, REAL *output) { + const REAL *const div_space1, const REAL *const div_space2, + REAL *RESTRICT output, const std::size_t stride = 1) { REAL tmp[N]; for (int ix = 0; ix < N; ix++) { tmp[ix] = 0.0; } - const int stride = num_phys0 * num_phys1; + const int stride_phys = num_phys0 * num_phys1; for (int i2 = 0; i2 < num_phys2; i2++) { - const REAL c2 = div_space2[i2]; + const REAL c2 = div_space2[i2 * stride]; for (int i1 = 0; i1 < num_phys1; i1++) { - const REAL c1 = c2 * div_space1[i1]; + const REAL c1 = c2 * div_space1[i1 * stride]; for (int i0 = 0; i0 < num_phys0; i0++) { - const int inner_stride = (i2 * stride + i1 * num_phys0 + i0) * N; - const REAL inner_c = div_space0[i0] * c1; + const int inner_stride = (i2 * stride_phys + i1 * num_phys0 + i0) * N; + const REAL inner_c = div_space0[i0 * stride] * c1; for (int ix = 0; ix < N; ix++) { tmp[ix] += physvals[inner_stride + ix] * inner_c; } @@ -179,28 +188,30 @@ inline void compute_dir_210_interlaced( * @param num_phys1 Number of quadrature points in the y direction. * @param physvals Function evaluations at quadrature points, x runs fastest * and y slowest. - * @param div_space Space of size num_phys0 + num_phys1 + num_phys2 to use as - * temporary space. + * @param div_space Space of size (num_phys0 + num_phys1 + num_phys2) * stride + * to use as temporary space. * @param z0 Quadrature points in x direction. * @param z1 Quadrature points in y direction. * @param bw0 Weights for each quadrature point in x direction. * @param bw1 Weights for each quadrature point in y direction. + * @param stride Stride between elements in div_space, default 1. * @returns Evaluation at passed point using Bary interpolation. * */ inline REAL evaluate_2d(const REAL coord0, const REAL coord1, const int num_phys0, const int num_phys1, const REAL *const physvals, REAL *div_space, const REAL *const z0, const REAL *const z1, - const REAL *const bw0, const REAL *const bw1) { + const REAL *const bw0, const REAL *const bw1, + const std::size_t stride = 1) { REAL *div_space0 = div_space; - REAL *div_space1 = div_space0 + num_phys0; + REAL *div_space1 = div_space0 + num_phys0 * stride; - preprocess_weights(num_phys0, coord0, z0, bw0, div_space0); - preprocess_weights(num_phys1, coord1, z1, bw1, div_space1); + preprocess_weights(num_phys0, coord0, z0, bw0, div_space0, stride); + preprocess_weights(num_phys1, coord1, z1, bw1, div_space1, stride); - REAL eval = - compute_dir_10(num_phys0, num_phys1, physvals, div_space0, div_space1); + REAL eval = compute_dir_10(num_phys0, num_phys1, physvals, div_space0, + div_space1, stride); return eval; } @@ -217,14 +228,15 @@ inline REAL evaluate_2d(const REAL coord0, const REAL coord1, * @param num_phys2 Number of quadrature points in the z direction. * @param physvals Function evaluations at quadrature points, x runs fastest * and z slowest. - * @param div_space Space of size num_phys0 + num_phys1 + num_phys2 to use as - * temporary space. + * @param div_space Space of size (num_phys0 + num_phys1 + num_phys2) * stride + * to use as temporary space. * @param z0 Quadrature points in x direction. * @param z1 Quadrature points in y direction. * @param z2 Quadrature points in z direction. * @param bw0 Weights for each quadrature point in x direction. * @param bw1 Weights for each quadrature point in y direction. * @param bw2 Weights for each quadrature point in z direction. + * @param stride Stride between elements in div_space, default 1. * @returns Evaluation at passed point using Bary interpolation. */ inline REAL evaluate_3d(const REAL coord0, const REAL coord1, const REAL coord2, @@ -233,18 +245,18 @@ inline REAL evaluate_3d(const REAL coord0, const REAL coord1, const REAL coord2, REAL *div_space, const REAL *const z0, const REAL *const z1, const REAL *const z2, const REAL *const bw0, const REAL *const bw1, - const REAL *const bw2) { + const REAL *const bw2, const std::size_t stride = 1) { REAL *div_space0 = div_space; - REAL *div_space1 = div_space0 + num_phys0; - REAL *div_space2 = div_space1 + num_phys1; + REAL *div_space1 = div_space0 + num_phys0 * stride; + REAL *div_space2 = div_space1 + num_phys1 * stride; - preprocess_weights(num_phys0, coord0, z0, bw0, div_space0); - preprocess_weights(num_phys1, coord1, z1, bw1, div_space1); - preprocess_weights(num_phys2, coord2, z2, bw2, div_space2); + preprocess_weights(num_phys0, coord0, z0, bw0, div_space0, stride); + preprocess_weights(num_phys1, coord1, z1, bw1, div_space1, stride); + preprocess_weights(num_phys2, coord2, z2, bw2, div_space2, stride); const REAL eval = compute_dir_210(num_phys0, num_phys1, num_phys2, physvals, - div_space0, div_space1, div_space2); + div_space0, div_space1, div_space2, stride); return eval; } diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index 35422a7d..49724589 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -224,6 +224,8 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, const int num_elts = field->GetNumElmts(); Array Lcoord(3); Array coord(3); + const std::size_t stride = 3; + for (int ex = 0; ex < num_elts; ex++) { auto exp = field->GetExp(ex); auto geom = exp->GetGeom(); @@ -238,7 +240,7 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, const int num_phys1 = z1.size(); const int num_phys2 = z2.size(); const int num_phys = std::max(num_phys0, std::max(num_phys1, num_phys2)); - std::vector div_space(3 * num_phys); + std::vector div_space(3 * num_phys * stride); std::vector z0v(num_phys); std::vector z1v(num_phys); std::vector z2v(num_phys); @@ -279,7 +281,11 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), div_space.data(), z0v.data(), z1v.data(), z2v.data(), bw0v.data(), bw1v.data(), bw2v.data()); - + const REAL to_test_stride = Bary::evaluate_3d( + x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), + div_space.data(), z0v.data(), z1v.data(), z2v.data(), bw0v.data(), + bw1v.data(), bw2v.data(), stride); + EXPECT_NEAR(to_test, to_test_stride, 1.0e-15); const REAL err_abs = std::abs(correct - to_test); const REAL abs_correct = std::abs(correct); const REAL err_rel = @@ -305,7 +311,18 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), div_space.data(), z0v.data(), z1v.data(), z2v.data(), bw0v.data(), bw1v.data(), bw2v.data()); - + // Check the values not a multiple of stride are untouched + std::fill(div_space.begin(), div_space.end(), 3.1415); + const REAL to_test_stride = Bary::evaluate_3d( + x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), + div_space.data(), z0v.data(), z1v.data(), z2v.data(), bw0v.data(), + bw1v.data(), bw2v.data(), stride); + EXPECT_NEAR(to_test, to_test_stride, 1.0e-15); + for (int ix = 0; ix < div_space.size(); ix++) { + if (ix % stride != 0) { + EXPECT_EQ(div_space.at(ix), 3.1415); + } + } const REAL err_abs = std::abs(correct - to_test); const REAL abs_correct = std::abs(correct); const REAL err_rel = From 88cf46c25015c5494a1d1e116bea63d6c2dc7931 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Fri, 1 Nov 2024 15:04:10 +0000 Subject: [PATCH 29/66] added stride to function bary evaluation --- .../nektar_interface/function_bary_evaluation.hpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 6f7d1000..cf6c68c9 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -250,10 +250,11 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { for (auto &blockx : is) { const auto block_device = blockx.block_device; + const std::size_t local_size = blockx.local_size; es.push(sycl_target->queue.submit([&](sycl::handler &cgh) { // Allocate local memory to compute the divides. sycl::local_accessor local_mem( - sycl::range<1>(local_num_reals * blockx.local_size), cgh); + sycl::range<1>(local_num_reals * local_size), cgh); cgh.parallel_for<>( blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { @@ -262,7 +263,8 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { std::size_t layer; block_device.get_cell_layer(idx, &cell, &layer); if (block_device.work_item_required(cell, layer)) { - REAL *div_space0 = &local_mem[idx_local * 2 * k_stride_base]; + // offset by the local index for the striding to work + REAL *div_space0 = &local_mem[idx_local]; // query the map from cells to expansion type const int expansion_type = k_map_to_geom_type[cell]; @@ -293,9 +295,9 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { // this cell const auto physvals = &k_global_physvals[k_phys_offsets[cell]]; - const REAL evaluation = - Bary::evaluate_2d(coord0, coord1, num_phys0, num_phys1, - physvals, div_space0, z0, z1, bw0, bw1); + const REAL evaluation = Bary::evaluate_2d( + coord0, coord1, num_phys0, num_phys1, physvals, div_space0, + z0, z1, bw0, bw1, local_size); k_output[cell][k_component][layer] = evaluation; } From c5b08574c16737c73549a7efbc0fb9628b858291 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Fri, 1 Nov 2024 16:32:20 +0000 Subject: [PATCH 30/66] reimplemented Bary evaluation to be extendable to 3D/variable p more easily --- .../function_bary_evaluation.hpp | 239 +++++++----------- 1 file changed, 90 insertions(+), 149 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index cf6c68c9..d2712f93 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -27,38 +27,30 @@ namespace NESO { */ template class BaryEvaluateBase : GeomToExpansionBuilder { protected: + int ndim; std::shared_ptr field; ParticleMeshInterfaceSharedPtr mesh; - CellIDTranslationSharedPtr cell_id_translation; SYCLTargetSharedPtr sycl_target; - - BufferDeviceHost dh_phys_offsets; - BufferDeviceHost dh_phys_num0; - BufferDeviceHost dh_phys_num1; BufferDeviceHost dh_global_physvals; - /** - * Helper function to assemble the data required on the device for an - * expansion type. - */ - inline void assemble_data(const int offset, - StdExpansion2DSharedPtr expansion) { - auto base = expansion->GetBase(); - - double *z_ptr = this->dh_z.h_buffer.ptr + offset * stride_expansion_type; - double *bw_ptr = this->dh_bw.h_buffer.ptr + offset * stride_expansion_type; - - for (int dimx = 0; dimx < 2; dimx++) { - const auto &z = base[dimx]->GetZ(); - const auto &bw = base[dimx]->GetBaryWeights(); - NESOASSERT(z.size() == bw.size(), "Expected these two sizes to match."); - const int size = z.size(); - for (int cx = 0; cx < size; cx++) { - z_ptr[dimx * stride_base + cx] = z[cx]; - bw_ptr[dimx * stride_base + cx] = bw[cx]; - } - } - } + struct CellInfo { + int shape_type_int; + std::size_t num_phys[3]; + REAL const *d_z[3]; + REAL const *d_bw[3]; + std::size_t phys_offset; + }; + + using MapKey = std::tuple>; + + std::map map_cells_to_info; + + std::shared_ptr> d_cell_info; + std::stack>> stack_ptrs; + + /// Stride between z and weight values in each dimension for all expansion + /// types. + std::size_t max_num_phys; public: /// Disable (implicit) copies. @@ -66,18 +58,6 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { /// Disable (implicit) copies. BaryEvaluateBase &operator=(BaryEvaluateBase const &a) = delete; - /// Stride between z and weight values in each dimension for all expansion - /// types. - int stride_base; - /// Stride between expansion types for z and weight values. - int stride_expansion_type; - - /// The GetZ values for different expansion types. - BufferDeviceHost dh_z; - - /// The GetBaryWeights for different expansion types. - BufferDeviceHost dh_bw; - /** * Create instance to evaluate a passed field. * @@ -90,104 +70,82 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { BaryEvaluateBase(std::shared_ptr field, ParticleMeshInterfaceSharedPtr mesh, CellIDTranslationSharedPtr cell_id_translation) - : field(field), mesh(mesh), cell_id_translation(cell_id_translation), - sycl_target(cell_id_translation->sycl_target), dh_z(sycl_target, 1), - dh_bw(sycl_target, 1), dh_phys_offsets(sycl_target, 1), - dh_phys_num0(sycl_target, 1), dh_phys_num1(sycl_target, 1), + : ndim(mesh->get_ndim()), field(field), mesh(mesh), + sycl_target(cell_id_translation->sycl_target), dh_global_physvals(sycl_target, 1) { // build the map from geometry ids to expansion ids std::map geom_to_exp; build_geom_to_expansion_map(this->field, geom_to_exp); - - TriExpSharedPtr tri_exp{nullptr}; - QuadExpSharedPtr quad_exp{nullptr}; - auto geom_type_lookup = - this->cell_id_translation->dh_map_to_geom_type.h_buffer.ptr; - - const int index_tri_geom = - shape_type_to_int(LibUtilities::ShapeType::eTriangle); - const int index_quad_geom = - shape_type_to_int(LibUtilities::ShapeType::eQuadrilateral); - const int neso_cell_count = mesh->get_cell_count(); - this->dh_phys_offsets.realloc_no_copy(neso_cell_count); - this->dh_phys_num0.realloc_no_copy(neso_cell_count); - this->dh_phys_num1.realloc_no_copy(neso_cell_count); - // Assume all TriGeoms and QuadGeoms are the same (TODO generalise for - // varying p). Get the offsets to the coefficients for each cell. - for (int neso_cellx = 0; neso_cellx < neso_cell_count; neso_cellx++) { + std::vector v_cell_info; + v_cell_info.reserve(neso_cell_count); + this->max_num_phys = 0; - const int nektar_geom_id = - this->cell_id_translation->map_to_nektar[neso_cellx]; + for (int neso_cellx = 0; neso_cellx < neso_cell_count; neso_cellx++) { + const int nektar_geom_id = cell_id_translation->map_to_nektar[neso_cellx]; const int expansion_id = geom_to_exp[nektar_geom_id]; // get the nektar expansion auto expansion = this->field->GetExp(expansion_id); - // is this a tri expansion? - if ((geom_type_lookup[neso_cellx] == index_tri_geom) && - (tri_exp == nullptr)) { - tri_exp = std::dynamic_pointer_cast(expansion); + MapKey key; + std::get<0>(key) = + shape_type_to_int(expansion->GetGeom()->GetShapeType()); + for (int dimx = 0; dimx < 3; dimx++) { + std::get<1>(key)[dimx] = 0; } - // is this a quad expansion? - if ((geom_type_lookup[neso_cellx] == index_quad_geom) && - (quad_exp == nullptr)) { - quad_exp = std::dynamic_pointer_cast(expansion); + for (int dimx = 0; dimx < this->ndim; dimx++) { + std::get<1>(key)[dimx] = + static_cast(expansion->GetBase()[dimx]->GetZ().size()); } - - // record offsets and number of coefficients - this->dh_phys_offsets.h_buffer.ptr[neso_cellx] = - this->field->GetPhys_Offset(expansion_id); - - // Get the number of quadrature points in both dimensions. - this->dh_phys_num0.h_buffer.ptr[neso_cellx] = - (expansion->GetBase()[0])->GetZ().size(); - this->dh_phys_num1.h_buffer.ptr[neso_cellx] = - (expansion->GetBase()[1])->GetZ().size(); - } - - // stride between basis values across all expansion types - stride_base = 0; - for (int dimx = 0; dimx < 2; dimx++) { - if (tri_exp != nullptr) { - auto base = tri_exp->GetBase(); - stride_base = std::max(stride_base, (int)(base[dimx]->GetZ().size())); + if (this->map_cells_to_info.count(key) == 0) { + CellInfo cell_info; + cell_info.shape_type_int = std::get<0>(key); + for (int dx = 0; dx < 3; dx++) { + cell_info.num_phys[dx] = std::get<1>(key)[dx]; + } + + // Get the z values and bw values for this geom type with this number + // of physvals + for (int dimx = 0; dimx < this->ndim; dimx++) { + auto base = expansion->GetBase(); + const auto &z = base[dimx]->GetZ(); + const auto &bw = base[dimx]->GetBaryWeights(); + NESOASSERT(z.size() == bw.size(), + "Expected these two sizes to match."); + const auto size = z.size(); + this->max_num_phys = std::max(this->max_num_phys, size); + std::vector tmp_reals(2 * size); + for (int cx = 0; cx < size; cx++) { + tmp_reals.at(cx) = z[cx]; + } + for (int cx = 0; cx < size; cx++) { + tmp_reals.at(cx + size) = bw[cx]; + } + auto ptr = std::make_shared>(this->sycl_target, + tmp_reals); + auto d_ptr = ptr->ptr; + this->stack_ptrs.push(ptr); + + cell_info.d_z[dimx] = d_ptr; + cell_info.d_bw[dimx] = d_ptr + size; + } + + this->map_cells_to_info[key] = cell_info; } - if (quad_exp != nullptr) { - auto base = quad_exp->GetBase(); - stride_base = std::max(stride_base, (int)(base[dimx]->GetZ().size())); - } - } - stride_base = pad_to_vector_length(stride_base); - - // stride between expansion types. - stride_expansion_type = 2 * stride_base; - - // malloc space for arrays - const int num_coeffs_all_types = 2 * stride_expansion_type; - this->dh_z.realloc_no_copy(num_coeffs_all_types); - this->dh_bw.realloc_no_copy(num_coeffs_all_types); - for (int cx = 0; cx < num_coeffs_all_types; cx++) { - this->dh_z.h_buffer.ptr[cx] = 0.0; - this->dh_bw.h_buffer.ptr[cx] = 0.0; - } - // TriExp has expansion type 0 - is the first set of data - if (tri_exp != nullptr) { - this->assemble_data(0, std::static_pointer_cast(tri_exp)); - } - // QuadExp has expansion type 1 - is the first set of data - if (quad_exp != nullptr) { - this->assemble_data(1, - std::static_pointer_cast(quad_exp)); + // Get the generic info for this cell type and number of modes + auto cell_info = this->map_cells_to_info.at(key); + // push on the offset for this particular cell + cell_info.phys_offset = + static_cast(this->field->GetPhys_Offset(expansion_id)); + + v_cell_info.push_back(cell_info); } - this->dh_phys_offsets.host_to_device(); - this->dh_phys_num0.host_to_device(); - this->dh_phys_num1.host_to_device(); - this->dh_z.host_to_device(); - this->dh_bw.host_to_device(); + this->d_cell_info = std::make_shared>( + this->sycl_target, v_cell_info); } /** @@ -215,6 +173,7 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { this->dh_global_physvals.h_buffer.ptr[px] = 0.0; } this->dh_global_physvals.host_to_device(); + const auto k_global_physvals = this->dh_global_physvals.d_buffer.ptr; // output and particle position dats auto k_output = (*particle_group)[sym]->cell_dat.device_ptr(); @@ -224,25 +183,15 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { const int k_component = component; // values required to evaluate the field - const int k_index_tri_geom = - shape_type_to_int(LibUtilities::ShapeType::eTriangle); - const auto k_global_physvals = this->dh_global_physvals.d_buffer.ptr; - const auto k_phys_offsets = this->dh_phys_offsets.d_buffer.ptr; - const auto k_phys_num0 = this->dh_phys_num0.d_buffer.ptr; - const auto k_phys_num1 = this->dh_phys_num1.d_buffer.ptr; - const auto k_z = this->dh_z.d_buffer.ptr; - const auto k_bw = this->dh_bw.d_buffer.ptr; - const auto k_stride_base = this->stride_base; - const auto k_stride_expansion_type = this->stride_expansion_type; - const auto k_map_to_geom_type = - this->cell_id_translation->dh_map_to_geom_type.d_buffer.ptr; + auto k_cell_info = this->d_cell_info->ptr; // iteration set specification for the particle loop auto mpi_rank_dat = particle_group->mpi_rank_dat; ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat, 16}; const std::size_t local_size = 256; - const std::size_t local_num_reals = 2 * this->stride_base; + const std::size_t local_num_reals = + static_cast(this->ndim * this->max_num_phys); const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); EventStack es; @@ -265,19 +214,7 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { if (block_device.work_item_required(cell, layer)) { // offset by the local index for the striding to work REAL *div_space0 = &local_mem[idx_local]; - - // query the map from cells to expansion type - const int expansion_type = k_map_to_geom_type[cell]; - // use the type key to index into the Bary weights and points - const int expansion_type_offset = - (expansion_type == k_index_tri_geom) - ? 0 - : k_stride_expansion_type; - // get the z values and weights for this expansion type - const auto z0 = &k_z[expansion_type_offset]; - const auto z1 = &k_z[expansion_type_offset + k_stride_base]; - const auto bw0 = &k_bw[expansion_type_offset]; - const auto bw1 = &k_bw[expansion_type_offset + k_stride_base]; + const auto cell_info = k_cell_info[cell]; const REAL xi0 = k_ref_positions[cell][0][layer]; const REAL xi1 = k_ref_positions[cell][1][layer]; @@ -286,14 +223,18 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { REAL coord0, coord1; GeometryInterface::loc_coord_to_loc_collapsed_2d( - expansion_type, xi0, xi1, &coord0, &coord1); + cell_info.shape_type_int, xi0, xi1, &coord0, &coord1); - const int num_phys0 = k_phys_num0[cell]; - const int num_phys1 = k_phys_num1[cell]; + const auto num_phys0 = cell_info.num_phys[0]; + const auto num_phys1 = cell_info.num_phys[1]; + const auto z0 = cell_info.d_z[0]; + const auto z1 = cell_info.d_z[1]; + const auto bw0 = cell_info.d_bw[0]; + const auto bw1 = cell_info.d_bw[1]; // Get pointer to the start of the quadrature point values for // this cell - const auto physvals = &k_global_physvals[k_phys_offsets[cell]]; + const auto physvals = &k_global_physvals[cell_info.phys_offset]; const REAL evaluation = Bary::evaluate_2d( coord0, coord1, num_phys0, num_phys1, physvals, div_space0, From 07b5439966ef6993f4935a1f57cf87b9b1050268 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Fri, 1 Nov 2024 16:52:24 +0000 Subject: [PATCH 31/66] added profiling information to bary evaluate in 2D --- include/nektar_interface/function_bary_evaluation.hpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index d2712f93..a6e20ccc 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -197,6 +197,7 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { EventStack es; auto is = ish.get_all_cells(local_size, num_bytes_local); + ProfileRegion pr("BaryEvaluateBase", "evaluate_2d"); for (auto &blockx : is) { const auto block_device = blockx.block_device; const std::size_t local_size = blockx.local_size; @@ -245,7 +246,14 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { }); })); } + const auto nphys = this->max_num_phys; + const auto npart = particle_group->get_npart_local(); + const auto nflop_prepare = this->ndim * nphys * 5; + const auto nflop_loop = nphys * nphys * 3; + pr.num_flops = (nflop_loop + nflop_prepare) * npart; es.wait(); + pr.end(); + this->sycl_target->profile_map.add_region(pr); } }; From f17287580abdb194950613587e82ef7aa542b751 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Thu, 7 Nov 2024 14:58:24 +0000 Subject: [PATCH 32/66] added low level bary evaluation implementations for runtime numbers of functions --- .../bary_interpolation/bary_evaluation.hpp | 128 +++++++++++ .../function_bary_evaluation.hpp | 99 ++++---- .../function_basis_evaluation.hpp | 6 +- .../function_basis_projection.hpp | 6 +- .../map_particles_3d_regular.cpp | 5 +- .../test_particle_function_evaluation.cpp | 211 ++++++++++++++++++ 6 files changed, 411 insertions(+), 44 deletions(-) diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp index daaa221b..f90a3627 100644 --- a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -96,6 +96,85 @@ inline REAL compute_dir_10(const int num_phys0, const int num_phys1, return pval1; } +/** + * Computes Bary interpolation over two dimensions. Evaluates N functions + * with interlaced quadrature point values. + * + * @param[in] num_phys0 Number of quadrature points in dimension 0. + * @param[in] num_phys1 Number of quadrature points in dimension 1. + * @param[in] physvals Array of function values at quadrature points interlaced + * values for each function to evaluate. + * @param[in] div_space0 The output of preprocess_weights applied to dimension + * 0. + * @param[in] div_space1 The output of preprocess_weights applied to + * dimension 1. + * @param stride Stride between elements in div_space, default 1. + * @param[in, out] output Output function evaluations. + */ +template +inline void compute_dir_10_interlaced(const int num_phys0, const int num_phys1, + const REAL *const physvals, + const REAL *const div_space0, + const REAL *const div_space1, + REAL *RESTRICT output, + const std::size_t stride = 1) { + REAL tmp[N]; + for (int ix = 0; ix < N; ix++) { + tmp[ix] = 0.0; + } + for (int i1 = 0; i1 < num_phys1; i1++) { + const REAL c1 = div_space1[i1 * stride]; + for (int i0 = 0; i0 < num_phys0; i0++) { + const int inner_stride = (i1 * num_phys0 + i0) * N; + const REAL inner_c = div_space0[i0 * stride] * c1; + for (int ix = 0; ix < N; ix++) { + tmp[ix] += physvals[inner_stride + ix] * inner_c; + } + } + } + for (int ix = 0; ix < N; ix++) { + output[ix] = tmp[ix]; + } +} + +/** + * Computes Bary interpolation over two dimensions. Evaluates N functions + * with interlaced quadrature point values. + * + * @param[in] num_functions Number of functions to evaluate. + * @param[in] num_phys0 Number of quadrature points in dimension 0. + * @param[in] num_phys1 Number of quadrature points in dimension 1. + * @param[in] physvals Array of function values at quadrature points interlaced + * values for each function to evaluate. + * @param[in] div_space0 The output of preprocess_weights applied to dimension + * 0. + * @param[in] div_space1 The output of preprocess_weights applied to + * dimension 1. + * @param stride Stride between elements in div_space, default 1. + * @param[in, out] output Output function evaluations. + */ +inline void compute_dir_10_interlaced(const int num_functions, + const int num_phys0, const int num_phys1, + const REAL *const physvals, + const REAL *const div_space0, + const REAL *const div_space1, + REAL *RESTRICT output, + const std::size_t stride = 1) { + for (int ix = 0; ix < num_functions; ix++) { + output[ix] = 0.0; + } + for (int i1 = 0; i1 < num_phys1; i1++) { + const REAL c1 = div_space1[i1 * stride]; + for (int i0 = 0; i0 < num_phys0; i0++) { + const int inner_stride = (i1 * num_phys0 + i0) * num_functions; + const REAL inner_c = div_space0[i0 * stride] * c1; + for (int ix = 0; ix < num_functions; ix++) { + output[ix] += physvals[inner_stride + ix] * inner_c; + } + } + } +} + /** * Computes Bary interpolation over three dimensions. * @@ -178,6 +257,55 @@ inline void compute_dir_210_interlaced( } } +/** + * Computes Bary interpolation over three dimensions. Evaluates N functions + * with interlaced quadrature point values. + * + * @param[in] num_functions Number of functions to evaluate. + * @param[in] num_phys0 Number of quadrature points in dimension 0. + * @param[in] num_phys1 Number of quadrature points in dimension 1. + * @param[in] num_phys2 Number of quadrature points in dimension 2. + * @param[in] physvals Array of function values at quadrature points interlaced + * values for each function to evaluate. + * @param[in] div_space0 The output of preprocess_weights applied to dimension + * 0. + * @param[in] div_space1 The output of preprocess_weights applied to + * dimension 1. + * @param[in] div_space2 The output of preprocess_weights applied to + * dimension 2. + * @param stride Stride between elements in div_space, default 1. + * @param[in, out] output Output function evaluations. + */ +inline void compute_dir_210_interlaced(const int num_functions, + const int num_phys0, const int num_phys1, + const int num_phys2, + const REAL *RESTRICT const physvals, + const REAL *RESTRICT const div_space0, + const REAL *RESTRICT const div_space1, + const REAL *RESTRICT const div_space2, + REAL *RESTRICT output, + const std::size_t stride = 1) { + for (int ix = 0; ix < num_functions; ix++) { + output[ix] = 0.0; + } + + const int stride_phys = num_phys0 * num_phys1; + for (int i2 = 0; i2 < num_phys2; i2++) { + const REAL c2 = div_space2[i2 * stride]; + for (int i1 = 0; i1 < num_phys1; i1++) { + const REAL c1 = c2 * div_space1[i1 * stride]; + for (int i0 = 0; i0 < num_phys0; i0++) { + const int inner_stride = + (i2 * stride_phys + i1 * num_phys0 + i0) * num_functions; + const REAL inner_c = div_space0[i0 * stride] * c1; + for (int ix = 0; ix < num_functions; ix++) { + output[ix] += physvals[inner_stride + ix] * inner_c; + } + } + } + } +} + /** * Compute a function evaluation at a point using the passed quadrature point * values, quadrature points and weights. diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index a6e20ccc..0a9808ea 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -187,9 +187,11 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { // iteration set specification for the particle loop auto mpi_rank_dat = particle_group->mpi_rank_dat; - ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat, - 16}; - const std::size_t local_size = 256; + ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat}; + const std::size_t local_size = + this->sycl_target->parameters + ->template get("LOOP_LOCAL_SIZE") + ->value; const std::size_t local_num_reals = static_cast(this->ndim * this->max_num_phys); const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); @@ -206,44 +208,59 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { sycl::local_accessor local_mem( sycl::range<1>(local_num_reals * local_size), cgh); - cgh.parallel_for<>( - blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { - const int idx_local = idx.get_local_id(1); - std::size_t cell; - std::size_t layer; - block_device.get_cell_layer(idx, &cell, &layer); - if (block_device.work_item_required(cell, layer)) { - // offset by the local index for the striding to work - REAL *div_space0 = &local_mem[idx_local]; - const auto cell_info = k_cell_info[cell]; - - const REAL xi0 = k_ref_positions[cell][0][layer]; - const REAL xi1 = k_ref_positions[cell][1][layer]; - // If this cell is a triangle then we need to map to the - // collapsed coordinates. - REAL coord0, coord1; - - GeometryInterface::loc_coord_to_loc_collapsed_2d( - cell_info.shape_type_int, xi0, xi1, &coord0, &coord1); - - const auto num_phys0 = cell_info.num_phys[0]; - const auto num_phys1 = cell_info.num_phys[1]; - const auto z0 = cell_info.d_z[0]; - const auto z1 = cell_info.d_z[1]; - const auto bw0 = cell_info.d_bw[0]; - const auto bw1 = cell_info.d_bw[1]; - - // Get pointer to the start of the quadrature point values for - // this cell - const auto physvals = &k_global_physvals[cell_info.phys_offset]; - - const REAL evaluation = Bary::evaluate_2d( - coord0, coord1, num_phys0, num_phys1, physvals, div_space0, - z0, z1, bw0, bw1, local_size); - - k_output[cell][k_component][layer] = evaluation; - } - }); + auto lambda_inner = [=](auto idx_local, auto cell, auto layer) { + // offset by the local index for the striding to work + REAL *div_space0 = &local_mem[idx_local]; + const auto cell_info = k_cell_info[cell]; + + const REAL xi0 = k_ref_positions[cell][0][layer]; + const REAL xi1 = k_ref_positions[cell][1][layer]; + // If this cell is a triangle then we need to map to the + // collapsed coordinates. + REAL coord0, coord1; + + GeometryInterface::loc_coord_to_loc_collapsed_2d( + cell_info.shape_type_int, xi0, xi1, &coord0, &coord1); + + const auto num_phys0 = cell_info.num_phys[0]; + const auto num_phys1 = cell_info.num_phys[1]; + const auto z0 = cell_info.d_z[0]; + const auto z1 = cell_info.d_z[1]; + const auto bw0 = cell_info.d_bw[0]; + const auto bw1 = cell_info.d_bw[1]; + + // Get pointer to the start of the quadrature point values for + // this cell + const auto physvals = &k_global_physvals[cell_info.phys_offset]; + + const REAL evaluation = + Bary::evaluate_2d(coord0, coord1, num_phys0, num_phys1, physvals, + div_space0, z0, z1, bw0, bw1, local_size); + + k_output[cell][k_component][layer] = evaluation; + }; + + if (blockx.layer_bounds_check_required) { + cgh.parallel_for<>( + blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { + const int idx_local = idx.get_local_id(1); + std::size_t cell; + std::size_t layer; + block_device.get_cell_layer(idx, &cell, &layer); + if (block_device.work_item_required(cell, layer)) { + lambda_inner(idx_local, cell, layer); + } + }); + } else { + cgh.parallel_for<>(blockx.loop_iteration_set, + [=](sycl::nd_item<2> idx) { + const int idx_local = idx.get_local_id(1); + std::size_t cell; + std::size_t layer; + block_device.get_cell_layer(idx, &cell, &layer); + lambda_inner(idx_local, cell, layer); + }); + } })); } const auto nphys = this->max_num_phys; diff --git a/include/nektar_interface/function_basis_evaluation.hpp b/include/nektar_interface/function_basis_evaluation.hpp index b55b7688..0d0b9b1a 100644 --- a/include/nektar_interface/function_basis_evaluation.hpp +++ b/include/nektar_interface/function_basis_evaluation.hpp @@ -81,12 +81,16 @@ class FunctionEvaluateBasis : public BasisEvaluateBase { const int k_max_total_nummodes2 = this->map_total_nummodes.at(shape_type).at(2); + const std::size_t default_local_size = + this->sycl_target->parameters + ->template get("LOOP_LOCAL_SIZE") + ->value; const size_t local_size = get_num_local_work_items( this->sycl_target, static_cast(k_max_total_nummodes0 + k_max_total_nummodes1 + k_max_total_nummodes2) * sizeof(REAL), - 128); + default_local_size); const int local_mem_num_items = (k_max_total_nummodes0 + k_max_total_nummodes1 + diff --git a/include/nektar_interface/function_basis_projection.hpp b/include/nektar_interface/function_basis_projection.hpp index 29b9a37a..98241f3b 100644 --- a/include/nektar_interface/function_basis_projection.hpp +++ b/include/nektar_interface/function_basis_projection.hpp @@ -81,12 +81,16 @@ template class FunctionProjectBasis : public BasisEvaluateBase { const int k_max_total_nummodes2 = this->map_total_nummodes.at(shape_type).at(2); + const std::size_t default_local_size = + this->sycl_target->parameters + ->template get("LOOP_LOCAL_SIZE") + ->value; const size_t local_size = get_num_local_work_items( this->sycl_target, static_cast(k_max_total_nummodes0 + k_max_total_nummodes1 + k_max_total_nummodes2) * sizeof(REAL), - 128); + default_local_size); const int local_mem_num_items = (k_max_total_nummodes0 + k_max_total_nummodes1 + diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_3d_regular.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_3d_regular.cpp index 0eed518b..312d8c59 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_3d_regular.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_3d_regular.cpp @@ -147,7 +147,10 @@ void MapParticles3DRegular::map(ParticleGroup &particle_group, ? position_dat->h_npart_cell[map_cell] : position_dat->cell_dat.get_nrow_max(); const int k_cell_offset = (map_cell > -1) ? map_cell : 0; - const size_t local_size = 256; + const std::size_t local_size = + this->sycl_target->parameters + ->template get("LOOP_LOCAL_SIZE") + ->value; const auto div_mod = std::div(max_cell_occupancy, local_size); const int outer_size = div_mod.quot + (div_mod.rem == 0 ? 0 : 1); const size_t cell_count = diff --git a/test/unit/nektar_interface/test_particle_function_evaluation.cpp b/test/unit/nektar_interface/test_particle_function_evaluation.cpp index 7b3f5fd4..5462bdfd 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation.cpp @@ -722,3 +722,214 @@ TEST(BaryInterpolation, Evaluation2D) { delete[] argv[1]; delete[] argv[2]; } + +TEST(BaryInterpolation, Generic) { + + const int stride = 3; + const int num_phys0 = 7; + const int num_phys1 = 5; + const int num_phys2 = 9; + const int num_phys = num_phys0 * num_phys1 * num_phys2; + std::mt19937 rng(22123257); + std::uniform_real_distribution uniform_rng(-2.0, 2.0); + + auto lambda_rng = [&]() -> REAL { return uniform_rng(rng); }; + + auto lambda_make_phys_vals = [&]() -> std::vector { + std::vector data(num_phys); + std::generate(data.begin(), data.end(), lambda_rng); + return data; + }; + + auto lambda_interlace_2 = [](auto p0, auto p1) -> std::vector { + std::vector data(p0.size() + p1.size()); + EXPECT_EQ(p0.size(), p1.size()); + const auto N = p0.size(); + std::size_t index = 0; + for (std::size_t ix = 0; ix < N; ix++) { + data.at(index++) = p0.at(ix); + data.at(index++) = p1.at(ix); + } + return data; + }; + + auto lambda_interlace_3 = [](auto p0, auto p1, auto p2) -> std::vector { + std::vector data(p0.size() + p1.size() + p2.size()); + EXPECT_EQ(p0.size(), p1.size()); + EXPECT_EQ(p0.size(), p2.size()); + const auto N = p0.size(); + std::size_t index = 0; + for (std::size_t ix = 0; ix < N; ix++) { + data.at(index++) = p0.at(ix); + data.at(index++) = p1.at(ix); + data.at(index++) = p2.at(ix); + } + return data; + }; + + auto lambda_rel_error = [](auto a, auto b) { + const auto err_abs = std::abs(a - b); + const auto mag = std::abs(a); + const auto err_rel = mag > 0.0 ? err_abs / mag : err_abs; + const REAL tol = 1.0e-14; + if (err_rel > tol) { + nprint("Error:", a, b); + } + EXPECT_TRUE(err_rel <= tol); + }; + + std::vector div_space0(num_phys0 * stride); + std::vector div_space1(num_phys1 * stride); + std::vector div_space2(num_phys2 * stride); + std::generate(div_space0.begin(), div_space0.end(), lambda_rng); + std::generate(div_space1.begin(), div_space1.end(), lambda_rng); + std::generate(div_space2.begin(), div_space2.end(), lambda_rng); + + REAL output[3]; + + auto func0 = lambda_make_phys_vals(); + auto func1 = lambda_make_phys_vals(); + auto func2 = lambda_make_phys_vals(); + + std::vector strides = {1, stride}; + for (auto test_stride : strides) { + + // 2D, 1 function + { + const REAL correct = Bary::compute_dir_10(num_phys0, num_phys1, + func0.data(), div_space0.data(), + div_space1.data(), test_stride); + + REAL to_test[1]; + Bary::compute_dir_10_interlaced<1>(num_phys0, num_phys1, func0.data(), + div_space0.data(), div_space1.data(), + to_test, test_stride); + lambda_rel_error(correct, to_test[0]); + + Bary::compute_dir_10_interlaced(1, num_phys0, num_phys1, func0.data(), + div_space0.data(), div_space1.data(), + to_test, test_stride); + lambda_rel_error(correct, to_test[0]); + } + + // 2D, 2 functions + { + auto func01 = lambda_interlace_2(func0, func1); + REAL to_test0[2]; + Bary::compute_dir_10_interlaced<2>(num_phys0, num_phys1, func01.data(), + div_space0.data(), div_space1.data(), + to_test0, test_stride); + + REAL *tmp_data[2] = {func0.data(), func1.data()}; + for (int dx = 0; dx < 2; dx++) { + const REAL correct = Bary::compute_dir_10( + num_phys0, num_phys1, tmp_data[dx], div_space0.data(), + div_space1.data(), test_stride); + lambda_rel_error(correct, to_test0[dx]); + } + + REAL to_test1[2]; + Bary::compute_dir_10_interlaced(2, num_phys0, num_phys1, func01.data(), + div_space0.data(), div_space1.data(), + to_test1, test_stride); + + lambda_rel_error(to_test0[0], to_test1[0]); + lambda_rel_error(to_test0[1], to_test1[1]); + } + + // 2D, 3 functions + { + auto func012 = lambda_interlace_3(func0, func1, func2); + REAL to_test0[3]; + Bary::compute_dir_10_interlaced<3>(num_phys0, num_phys1, func012.data(), + div_space0.data(), div_space1.data(), + to_test0, test_stride); + + REAL *tmp_data[3] = {func0.data(), func1.data(), func2.data()}; + for (int dx = 0; dx < 3; dx++) { + const REAL correct = Bary::compute_dir_10( + num_phys0, num_phys1, tmp_data[dx], div_space0.data(), + div_space1.data(), test_stride); + lambda_rel_error(correct, to_test0[dx]); + } + + REAL to_test1[3]; + Bary::compute_dir_10_interlaced(3, num_phys0, num_phys1, func012.data(), + div_space0.data(), div_space1.data(), + to_test1, test_stride); + + lambda_rel_error(to_test0[0], to_test1[0]); + lambda_rel_error(to_test0[1], to_test1[1]); + lambda_rel_error(to_test0[2], to_test1[2]); + } + + // 3D, 1 function + { + const REAL correct = Bary::compute_dir_210( + num_phys0, num_phys1, num_phys2, func0.data(), div_space0.data(), + div_space1.data(), div_space2.data(), test_stride); + + REAL to_test[1]; + Bary::compute_dir_210_interlaced<1>( + num_phys0, num_phys1, num_phys2, func0.data(), div_space0.data(), + div_space1.data(), div_space2.data(), to_test, test_stride); + lambda_rel_error(correct, to_test[0]); + + Bary::compute_dir_210_interlaced( + 1, num_phys0, num_phys1, num_phys2, func0.data(), div_space0.data(), + div_space1.data(), div_space2.data(), to_test, test_stride); + lambda_rel_error(correct, to_test[0]); + } + + // 3D, 2 functions + { + auto func01 = lambda_interlace_2(func0, func1); + REAL to_test0[2]; + Bary::compute_dir_210_interlaced<2>( + num_phys0, num_phys1, num_phys2, func01.data(), div_space0.data(), + div_space1.data(), div_space2.data(), to_test0, test_stride); + + REAL *tmp_data[2] = {func0.data(), func1.data()}; + for (int dx = 0; dx < 2; dx++) { + const REAL correct = Bary::compute_dir_210( + num_phys0, num_phys1, num_phys2, tmp_data[dx], div_space0.data(), + div_space1.data(), div_space2.data(), test_stride); + lambda_rel_error(correct, to_test0[dx]); + } + + REAL to_test1[2]; + Bary::compute_dir_210_interlaced( + 2, num_phys0, num_phys1, num_phys2, func01.data(), div_space0.data(), + div_space1.data(), div_space2.data(), to_test1, test_stride); + + lambda_rel_error(to_test0[0], to_test1[0]); + lambda_rel_error(to_test0[1], to_test1[1]); + } + + // 3D, 3 functions + { + auto func012 = lambda_interlace_3(func0, func1, func2); + REAL to_test0[3]; + Bary::compute_dir_210_interlaced<3>( + num_phys0, num_phys1, num_phys2, func012.data(), div_space0.data(), + div_space1.data(), div_space2.data(), to_test0, test_stride); + + REAL *tmp_data[3] = {func0.data(), func1.data(), func2.data()}; + for (int dx = 0; dx < 3; dx++) { + const REAL correct = Bary::compute_dir_210( + num_phys0, num_phys1, num_phys2, tmp_data[dx], div_space0.data(), + div_space1.data(), div_space2.data(), test_stride); + lambda_rel_error(correct, to_test0[dx]); + } + + REAL to_test1[3]; + Bary::compute_dir_210_interlaced( + 3, num_phys0, num_phys1, num_phys2, func012.data(), div_space0.data(), + div_space1.data(), div_space2.data(), to_test1, test_stride); + + lambda_rel_error(to_test0[0], to_test1[0]); + lambda_rel_error(to_test0[1], to_test1[1]); + lambda_rel_error(to_test0[2], to_test1[2]); + } + } +} From f8a3a758aa073bccbf80c1c573b970ad82f0b4c8 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Thu, 7 Nov 2024 16:41:57 +0000 Subject: [PATCH 33/66] initial implementation of bary evaluation for a generic number of functions --- .../function_bary_evaluation.hpp | 383 +++++++++++++----- .../nektar_interface/function_evaluation.hpp | 28 +- 2 files changed, 293 insertions(+), 118 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 0a9808ea..5e0500cf 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -31,7 +31,7 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { std::shared_ptr field; ParticleMeshInterfaceSharedPtr mesh; SYCLTargetSharedPtr sycl_target; - BufferDeviceHost dh_global_physvals; + BufferDevice d_global_physvals; struct CellInfo { int shape_type_int; @@ -52,6 +52,248 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { /// types. std::size_t max_num_phys; + template + inline void evaluate_inner_2d(ParticleGroupSharedPtr particle_group, + Sym sym, const int component, + Array &global_physvals) { + + // copy the quadrature point values over to the device + const int num_global_physvals = global_physvals.size(); + this->d_global_physvals.realloc_no_copy(num_global_physvals); + NekDouble *k_global_physvals = this->d_global_physvals.ptr; + auto copy_event = this->sycl_target->queue.memcpy( + k_global_physvals, global_physvals.data(), + num_global_physvals * sizeof(NekDouble)); + + // output and particle position dats + auto k_output = (*particle_group)[sym]->cell_dat.device_ptr(); + const auto k_ref_positions = + (*particle_group)[Sym("NESO_REFERENCE_POSITIONS")] + ->cell_dat.device_ptr(); + const int k_component = component; + + // values required to evaluate the field + auto k_cell_info = this->d_cell_info->ptr; + + // iteration set specification for the particle loop + auto mpi_rank_dat = particle_group->mpi_rank_dat; + ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat}; + const std::size_t local_size = + this->sycl_target->parameters + ->template get("LOOP_LOCAL_SIZE") + ->value; + const std::size_t local_num_reals = + static_cast(this->ndim * this->max_num_phys); + const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); + + EventStack es; + auto is = ish.get_all_cells(local_size, num_bytes_local); + copy_event.wait_and_throw(); + ProfileRegion pr("BaryEvaluateBase", "evaluate_2d"); + for (auto &blockx : is) { + const auto block_device = blockx.block_device; + const std::size_t local_size = blockx.local_size; + es.push(sycl_target->queue.submit([&](sycl::handler &cgh) { + // Allocate local memory to compute the divides. + sycl::local_accessor local_mem( + sycl::range<1>(local_num_reals * local_size), cgh); + + cgh.parallel_for<>( + blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { + const int idx_local = idx.get_local_id(1); + std::size_t cell; + std::size_t layer; + block_device.get_cell_layer(idx, &cell, &layer); + if (block_device.work_item_required(cell, layer)) { + // offset by the local index for the striding to work + REAL *div_space0 = &local_mem[idx_local]; + const auto cell_info = k_cell_info[cell]; + + const REAL xi0 = k_ref_positions[cell][0][layer]; + const REAL xi1 = k_ref_positions[cell][1][layer]; + // If this cell is a triangle then we need to map to the + // collapsed coordinates. + REAL eta0, eta1; + + GeometryInterface::loc_coord_to_loc_collapsed_2d( + cell_info.shape_type_int, xi0, xi1, &eta0, &eta1); + + const auto num_phys0 = cell_info.num_phys[0]; + const auto num_phys1 = cell_info.num_phys[1]; + const auto z0 = cell_info.d_z[0]; + const auto z1 = cell_info.d_z[1]; + const auto bw0 = cell_info.d_bw[0]; + const auto bw1 = cell_info.d_bw[1]; + + // Get pointer to the start of the quadrature point values for + // this cell + const auto physvals = &k_global_physvals[cell_info.phys_offset]; + + const REAL evaluation = Bary::evaluate_2d( + eta0, eta1, num_phys0, num_phys1, physvals, div_space0, z0, + z1, bw0, bw1, local_size); + + k_output[cell][k_component][layer] = evaluation; + } + }); + })); + } + const auto nphys = this->max_num_phys; + const auto npart = particle_group->get_npart_local(); + const auto nflop_prepare = this->ndim * nphys * 5; + const auto nflop_loop = nphys * nphys * 3; + pr.num_flops = (nflop_loop + nflop_prepare) * npart; + es.wait(); + pr.end(); + this->sycl_target->profile_map.add_region(pr); + } + + template + inline void + evaluate_inner_2d(ParticleGroupSharedPtr particle_group, + std::vector> syms, const std::vector components, + std::vector> &global_physvals) { + + EventStack es; + NESOASSERT(syms.size() == components.size(), "Input size missmatch"); + NESOASSERT(global_physvals.size() == components.size(), + "Input size missmatch"); + const std::size_t num_functions = static_cast(syms.size()); + const std::size_t num_physvals_per_function = global_physvals.at(0).size(); + + // copy the quadrature point values over to the device + const std::size_t num_global_physvals = + syms.size() * global_physvals.at(0).size(); + this->d_global_physvals.realloc_no_copy(2 * num_global_physvals); + NekDouble *k_global_physvals = this->d_global_physvals.ptr; + NekDouble *k_global_physvals_interlaced = + k_global_physvals + num_global_physvals; + + static_assert( + std::is_same::value == true, + "This implementation assumes that NekDouble and REAL are the same."); + for (std::size_t fx = 0; fx < num_functions; fx++) { + es.push(this->sycl_target->queue.memcpy( + k_global_physvals + fx * num_physvals_per_function, + global_physvals.at(fx).data(), + num_physvals_per_function * sizeof(NekDouble))); + } + // wait for the copies + es.wait(); + + // interlaced the values for the bary evaluation function + matrix_transpose(this->sycl_target, num_functions, + num_physvals_per_function, k_global_physvals, + k_global_physvals_interlaced) + .wait_and_throw(); + + std::vector h_sym_ptrs(num_functions); + for (std::size_t fx = 0; fx < num_functions; fx++) { + h_sym_ptrs.at(fx) = + particle_group->get_dat(syms.at(fx))->cell_dat.device_ptr(); + } + + BufferDevice d_syms_ptrs(this->sycl_target, h_sym_ptrs); + BufferDevice d_components(this->sycl_target, components); + U ****k_syms_ptrs = d_syms_ptrs.ptr; + int *k_components = d_components.ptr; + + const auto k_ref_positions = + particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")) + ->cell_dat.device_ptr(); + + // values required to evaluate the field + auto k_cell_info = this->d_cell_info->ptr; + + // iteration set specification for the particle loop + auto mpi_rank_dat = particle_group->mpi_rank_dat; + ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat}; + const std::size_t local_size = + this->sycl_target->parameters + ->template get("LOOP_LOCAL_SIZE") + ->value; + const std::size_t local_num_reals = + static_cast(this->ndim * this->max_num_phys) + + num_functions; + const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); + const auto k_max_num_phys = this->max_num_phys; + + auto is = ish.get_all_cells(local_size, num_bytes_local); + + ProfileRegion pr("BaryEvaluateBase", + "evaluate_2d_" + std::to_string(num_functions)); + for (auto &blockx : is) { + const auto block_device = blockx.block_device; + const std::size_t local_size = blockx.local_size; + es.push(sycl_target->queue.submit([&](sycl::handler &cgh) { + // Allocate local memory to compute the divides. + sycl::local_accessor local_mem( + sycl::range<1>(local_num_reals * local_size), cgh); + + cgh.parallel_for<>( + blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { + const int idx_local = idx.get_local_id(1); + std::size_t cell; + std::size_t layer; + block_device.get_cell_layer(idx, &cell, &layer); + if (block_device.work_item_required(cell, layer)) { + // offset by the local index for the striding to work + REAL *evaluations = &local_mem[0] + idx_local * num_functions; + REAL *div_start = &local_mem[local_size * num_functions]; + REAL *div_space0 = div_start + idx_local; + REAL *div_space1 = div_space0 + k_max_num_phys * local_size; + + const auto cell_info = k_cell_info[cell]; + + const REAL xi0 = k_ref_positions[cell][0][layer]; + const REAL xi1 = k_ref_positions[cell][1][layer]; + // If this cell is a triangle then we need to map to the + // collapsed coordinates. + REAL eta0, eta1; + + GeometryInterface::loc_coord_to_loc_collapsed_2d( + cell_info.shape_type_int, xi0, xi1, &eta0, &eta1); + + const auto num_phys0 = cell_info.num_phys[0]; + const auto num_phys1 = cell_info.num_phys[1]; + const auto z0 = cell_info.d_z[0]; + const auto z1 = cell_info.d_z[1]; + const auto bw0 = cell_info.d_bw[0]; + const auto bw1 = cell_info.d_bw[1]; + + Bary::preprocess_weights(num_phys0, eta0, z0, bw0, div_space0, + local_size); + Bary::preprocess_weights(num_phys1, eta1, z1, bw1, div_space1, + local_size); + + // Get pointer to the start of the quadrature point values for + // this cell + const auto physvals = + &k_global_physvals[cell_info.phys_offset * num_functions]; + + Bary::compute_dir_10_interlaced( + num_functions, num_phys0, num_phys1, physvals, div_space0, + div_space1, evaluations, local_size); + + for (std::size_t fx = 0; fx < num_functions; fx++) { + auto ptr = k_syms_ptrs[fx]; + auto component = k_components[fx]; + ptr[cell][component][layer] = evaluations[fx]; + } + } + }); + })); + } + const auto nphys = this->max_num_phys; + const auto npart = particle_group->get_npart_local(); + const auto nflop_prepare = this->ndim * nphys * 5; + const auto nflop_loop = nphys * nphys * 3; + pr.num_flops = (nflop_loop + nflop_prepare) * npart; + es.wait(); + pr.end(); + this->sycl_target->profile_map.add_region(pr); + } + public: /// Disable (implicit) copies. BaryEvaluateBase(const BaryEvaluateBase &st) = delete; @@ -72,7 +314,7 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { CellIDTranslationSharedPtr cell_id_translation) : ndim(mesh->get_ndim()), field(field), mesh(mesh), sycl_target(cell_id_translation->sycl_target), - dh_global_physvals(sycl_target, 1) { + d_global_physvals(sycl_target, 1) { // build the map from geometry ids to expansion ids std::map geom_to_exp; @@ -158,119 +400,38 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { * output. * @param global_physvals Field values at quadrature points to evaluate. */ - template + template inline void evaluate(ParticleGroupSharedPtr particle_group, Sym sym, - const int component, const V &global_physvals) { - - // copy the quadrature point values over to the device - const int num_global_physvals = global_physvals.size(); - const int device_phys_vals_size = pad_to_vector_length(num_global_physvals); - this->dh_global_physvals.realloc_no_copy(device_phys_vals_size); - for (int px = 0; px < num_global_physvals; px++) { - this->dh_global_physvals.h_buffer.ptr[px] = global_physvals[px]; - } - for (int px = num_global_physvals; px < device_phys_vals_size; px++) { - this->dh_global_physvals.h_buffer.ptr[px] = 0.0; + const int component, + Array &global_physvals) { + if (this->ndim == 2) { + return this->evaluate_inner_2d(particle_group, sym, component, + global_physvals); + } else { + NESOASSERT(false, "Error not implemented"); } - this->dh_global_physvals.host_to_device(); - const auto k_global_physvals = this->dh_global_physvals.d_buffer.ptr; - - // output and particle position dats - auto k_output = (*particle_group)[sym]->cell_dat.device_ptr(); - const auto k_ref_positions = - (*particle_group)[Sym("NESO_REFERENCE_POSITIONS")] - ->cell_dat.device_ptr(); - const int k_component = component; - - // values required to evaluate the field - auto k_cell_info = this->d_cell_info->ptr; - - // iteration set specification for the particle loop - auto mpi_rank_dat = particle_group->mpi_rank_dat; - ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat}; - const std::size_t local_size = - this->sycl_target->parameters - ->template get("LOOP_LOCAL_SIZE") - ->value; - const std::size_t local_num_reals = - static_cast(this->ndim * this->max_num_phys); - const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); - - EventStack es; - auto is = ish.get_all_cells(local_size, num_bytes_local); - - ProfileRegion pr("BaryEvaluateBase", "evaluate_2d"); - for (auto &blockx : is) { - const auto block_device = blockx.block_device; - const std::size_t local_size = blockx.local_size; - es.push(sycl_target->queue.submit([&](sycl::handler &cgh) { - // Allocate local memory to compute the divides. - sycl::local_accessor local_mem( - sycl::range<1>(local_num_reals * local_size), cgh); + } - auto lambda_inner = [=](auto idx_local, auto cell, auto layer) { - // offset by the local index for the striding to work - REAL *div_space0 = &local_mem[idx_local]; - const auto cell_info = k_cell_info[cell]; - - const REAL xi0 = k_ref_positions[cell][0][layer]; - const REAL xi1 = k_ref_positions[cell][1][layer]; - // If this cell is a triangle then we need to map to the - // collapsed coordinates. - REAL coord0, coord1; - - GeometryInterface::loc_coord_to_loc_collapsed_2d( - cell_info.shape_type_int, xi0, xi1, &coord0, &coord1); - - const auto num_phys0 = cell_info.num_phys[0]; - const auto num_phys1 = cell_info.num_phys[1]; - const auto z0 = cell_info.d_z[0]; - const auto z1 = cell_info.d_z[1]; - const auto bw0 = cell_info.d_bw[0]; - const auto bw1 = cell_info.d_bw[1]; - - // Get pointer to the start of the quadrature point values for - // this cell - const auto physvals = &k_global_physvals[cell_info.phys_offset]; - - const REAL evaluation = - Bary::evaluate_2d(coord0, coord1, num_phys0, num_phys1, physvals, - div_space0, z0, z1, bw0, bw1, local_size); - - k_output[cell][k_component][layer] = evaluation; - }; - - if (blockx.layer_bounds_check_required) { - cgh.parallel_for<>( - blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { - const int idx_local = idx.get_local_id(1); - std::size_t cell; - std::size_t layer; - block_device.get_cell_layer(idx, &cell, &layer); - if (block_device.work_item_required(cell, layer)) { - lambda_inner(idx_local, cell, layer); - } - }); - } else { - cgh.parallel_for<>(blockx.loop_iteration_set, - [=](sycl::nd_item<2> idx) { - const int idx_local = idx.get_local_id(1); - std::size_t cell; - std::size_t layer; - block_device.get_cell_layer(idx, &cell, &layer); - lambda_inner(idx_local, cell, layer); - }); - } - })); + /** + * Evaluate Nektar++ fields at particle locations using the provided + * quadrature point values and Bary Interpolation. + * + * @param particle_group ParticleGroup containing the particles. + * @param syms Vector of Syms in which to place evaluations. + * @param components Vector of components in which to place evaluations. + * @param global_physvals Phys values for each function to evaluate. + */ + template + inline void evaluate(ParticleGroupSharedPtr particle_group, + std::vector> syms, + const std::vector components, + std::vector> &global_physvals) { + if (this->ndim == 2) { + return this->evaluate_inner_2d(particle_group, syms, components, + global_physvals); + } else { + NESOASSERT(false, "Error not implemented"); } - const auto nphys = this->max_num_phys; - const auto npart = particle_group->get_npart_local(); - const auto nflop_prepare = this->ndim * nphys * 5; - const auto nflop_loop = nphys * nphys * 3; - pr.num_flops = (nflop_loop + nflop_prepare) * npart; - es.wait(); - pr.end(); - this->sycl_target->profile_map.add_region(pr); } }; diff --git a/include/nektar_interface/function_evaluation.hpp b/include/nektar_interface/function_evaluation.hpp index 89018ac7..85cb2337 100644 --- a/include/nektar_interface/function_evaluation.hpp +++ b/include/nektar_interface/function_evaluation.hpp @@ -93,15 +93,29 @@ template class FieldEvaluate { template inline void evaluate(Sym sym) { if (this->derivative) { + const auto ndim = this->particle_group->domain->mesh->get_ndim(); + auto global_physvals = this->field->GetPhys(); const int num_quadrature_points = this->field->GetTotPoints(); - Array d_global_physvals(num_quadrature_points); - this->field->PhysDeriv(0, global_physvals, d_global_physvals); - this->bary_evaluate_base->evaluate(this->particle_group, sym, 0, - d_global_physvals); - this->field->PhysDeriv(1, global_physvals, d_global_physvals); - this->bary_evaluate_base->evaluate(this->particle_group, sym, 1, - d_global_physvals); + + std::vector> deriv_physvals(ndim); + for (int dx = 0; dx < ndim; dx++) { + deriv_physvals.at(dx) = Array(num_quadrature_points); + } + for (int dx = 0; dx < ndim; dx++) { + this->field->PhysDeriv(dx, global_physvals, deriv_physvals.at(dx)); + } + + std::vector> syms(ndim); + std::vector components(ndim); + for (int dx = 0; dx < ndim; dx++) { + syms.at(dx) = sym; + components.at(dx) = dx; + } + + this->bary_evaluate_base->evaluate(this->particle_group, syms, components, + deriv_physvals); + } else { auto global_coeffs = this->field->GetCoeffs(); this->function_evaluate_basis->evaluate(this->particle_group, sym, 0, From a14a6d8226070292f74ff52518f8cdc658ae991d Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Thu, 7 Nov 2024 16:55:30 +0000 Subject: [PATCH 34/66] multiple function Bary evaluation passes existing derivative test --- include/nektar_interface/function_bary_evaluation.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 5e0500cf..ab0db5be 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -173,6 +173,9 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { std::is_same::value == true, "This implementation assumes that NekDouble and REAL are the same."); for (std::size_t fx = 0; fx < num_functions; fx++) { + NESOASSERT(num_physvals_per_function == global_physvals.at(fx).size(), + "Missmatch in number of physvals between functions."); + es.push(this->sycl_target->queue.memcpy( k_global_physvals + fx * num_physvals_per_function, global_physvals.at(fx).data(), @@ -269,7 +272,8 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { // Get pointer to the start of the quadrature point values for // this cell const auto physvals = - &k_global_physvals[cell_info.phys_offset * num_functions]; + &k_global_physvals_interlaced[cell_info.phys_offset * + num_functions]; Bary::compute_dir_10_interlaced( num_functions, num_phys0, num_phys1, physvals, div_space0, From c6c95b4693f149f6eb8822c9669b7c7c646f3a50 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Thu, 7 Nov 2024 18:38:19 +0000 Subject: [PATCH 35/66] fixed bad test (calling wrong function) and replaced bad nektar call (tet collapsed to local) --- .../test_particle_function_evaluation_3d.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index 49724589..9a0e308a 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -229,6 +229,7 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, for (int ex = 0; ex < num_elts; ex++) { auto exp = field->GetExp(ex); auto geom = exp->GetGeom(); + const int shape_type_int = static_cast(geom->GetShapeType()); auto base = exp->GetBase(); const auto &z0 = base[0]->GetZ(); const auto &bw0 = base[0]->GetBaryWeights(); @@ -275,7 +276,8 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, coord[0] = x0; coord[1] = x1; coord[2] = x2; - exp->LocCollapsedToLocCoord(coord, Lcoord); + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, coord, + Lcoord); const REAL correct = exp->StdPhysEvaluate(Lcoord, physvals); const REAL to_test = Bary::evaluate_3d( x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), @@ -305,7 +307,8 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, coord[0] = x0; coord[1] = x1; coord[2] = x2; - exp->LocCollapsedToLocCoord(coord, Lcoord); + GeometryInterface::loc_collapsed_to_loc_coord(shape_type_int, coord, + Lcoord); const REAL correct = exp->StdPhysEvaluate(Lcoord, physvals); const REAL to_test = Bary::evaluate_3d( x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), @@ -339,17 +342,17 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, } TEST(BaryInterpolation, Evaluation3DContField) { - evaluation_wrapper_3d( + bary_wrapper_3d( "reference_all_types_cube/conditions_cg.xml", "reference_all_types_cube/mixed_ref_cube_0.5_perturbed.xml", 1.0e-7); } TEST(BaryInterpolation, Evaluation3DDisContFieldHex) { - evaluation_wrapper_3d( + bary_wrapper_3d( "reference_hex_cube/conditions.xml", "reference_hex_cube/hex_cube_0.3_perturbed.xml", 1.0e-7); } TEST(BaryInterpolation, Evaluation3DDisContFieldPrismTet) { - evaluation_wrapper_3d( + bary_wrapper_3d( "reference_prism_tet_cube/conditions.xml", "reference_prism_tet_cube/prism_tet_cube_0.5_perturbed.xml", 1.0e-7); } From cd5cf7233f718590dafbf1dc65b6f4be1df8b811 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Fri, 8 Nov 2024 16:40:00 +0000 Subject: [PATCH 36/66] Derivatives in 3D passing evaluation tests --- .../function_bary_evaluation.hpp | 301 +++++++++--------- .../nektar_interface/function_evaluation.hpp | 12 +- include/nektar_interface/utilities.hpp | 78 +++++ .../test_particle_function_evaluation_3d.cpp | 47 ++- 4 files changed, 274 insertions(+), 164 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index ab0db5be..32a9c0b3 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -52,44 +52,26 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { /// types. std::size_t max_num_phys; - template - inline void evaluate_inner_2d(ParticleGroupSharedPtr particle_group, - Sym sym, const int component, - Array &global_physvals) { - - // copy the quadrature point values over to the device - const int num_global_physvals = global_physvals.size(); - this->d_global_physvals.realloc_no_copy(num_global_physvals); - NekDouble *k_global_physvals = this->d_global_physvals.ptr; - auto copy_event = this->sycl_target->queue.memcpy( - k_global_physvals, global_physvals.data(), - num_global_physvals * sizeof(NekDouble)); - - // output and particle position dats - auto k_output = (*particle_group)[sym]->cell_dat.device_ptr(); - const auto k_ref_positions = - (*particle_group)[Sym("NESO_REFERENCE_POSITIONS")] - ->cell_dat.device_ptr(); - const int k_component = component; - - // values required to evaluate the field - auto k_cell_info = this->d_cell_info->ptr; - - // iteration set specification for the particle loop - auto mpi_rank_dat = particle_group->mpi_rank_dat; + template + static inline void + dispatch_2d(SYCLTargetSharedPtr sycl_target, EventStack &es, + const std::size_t num_functions, const int k_max_num_phys, + const NekDouble *const RESTRICT k_global_physvals_interlaced, + const CellInfo *const RESTRICT k_cell_info, + ParticleDatSharedPtr mpi_rank_dat, + ParticleDatSharedPtr ref_positions_dat, U ****k_syms_ptrs, + int *k_components) { + constexpr int ndim = 2; ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat}; const std::size_t local_size = - this->sycl_target->parameters - ->template get("LOOP_LOCAL_SIZE") + sycl_target->parameters->template get("LOOP_LOCAL_SIZE") ->value; const std::size_t local_num_reals = - static_cast(this->ndim * this->max_num_phys); + static_cast(ndim * k_max_num_phys) + num_functions; const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); - - EventStack es; auto is = ish.get_all_cells(local_size, num_bytes_local); - copy_event.wait_and_throw(); - ProfileRegion pr("BaryEvaluateBase", "evaluate_2d"); + const auto k_ref_positions = ref_positions_dat->cell_dat.device_ptr(); + for (auto &blockx : is) { const auto block_device = blockx.block_device; const std::size_t local_size = blockx.local_size; @@ -106,7 +88,11 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { block_device.get_cell_layer(idx, &cell, &layer); if (block_device.work_item_required(cell, layer)) { // offset by the local index for the striding to work - REAL *div_space0 = &local_mem[idx_local]; + REAL *evaluations = &local_mem[0] + idx_local * num_functions; + REAL *div_start = &local_mem[local_size * num_functions]; + REAL *div_space0 = div_start + idx_local; + REAL *div_space1 = div_space0 + k_max_num_phys * local_size; + const auto cell_info = k_cell_info[cell]; const REAL xi0 = k_ref_positions[cell][0][layer]; @@ -125,106 +111,52 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { const auto bw0 = cell_info.d_bw[0]; const auto bw1 = cell_info.d_bw[1]; + Bary::preprocess_weights(num_phys0, eta0, z0, bw0, div_space0, + local_size); + Bary::preprocess_weights(num_phys1, eta1, z1, bw1, div_space1, + local_size); + // Get pointer to the start of the quadrature point values for // this cell - const auto physvals = &k_global_physvals[cell_info.phys_offset]; + const auto physvals = + &k_global_physvals_interlaced[cell_info.phys_offset * + num_functions]; - const REAL evaluation = Bary::evaluate_2d( - eta0, eta1, num_phys0, num_phys1, physvals, div_space0, z0, - z1, bw0, bw1, local_size); + Bary::compute_dir_10_interlaced( + num_functions, num_phys0, num_phys1, physvals, div_space0, + div_space1, evaluations, local_size); - k_output[cell][k_component][layer] = evaluation; + for (std::size_t fx = 0; fx < num_functions; fx++) { + auto ptr = k_syms_ptrs[fx]; + auto component = k_components[fx]; + ptr[cell][component][layer] = evaluations[fx]; + } } }); })); } - const auto nphys = this->max_num_phys; - const auto npart = particle_group->get_npart_local(); - const auto nflop_prepare = this->ndim * nphys * 5; - const auto nflop_loop = nphys * nphys * 3; - pr.num_flops = (nflop_loop + nflop_prepare) * npart; - es.wait(); - pr.end(); - this->sycl_target->profile_map.add_region(pr); } template - inline void - evaluate_inner_2d(ParticleGroupSharedPtr particle_group, - std::vector> syms, const std::vector components, - std::vector> &global_physvals) { - - EventStack es; - NESOASSERT(syms.size() == components.size(), "Input size missmatch"); - NESOASSERT(global_physvals.size() == components.size(), - "Input size missmatch"); - const std::size_t num_functions = static_cast(syms.size()); - const std::size_t num_physvals_per_function = global_physvals.at(0).size(); - - // copy the quadrature point values over to the device - const std::size_t num_global_physvals = - syms.size() * global_physvals.at(0).size(); - this->d_global_physvals.realloc_no_copy(2 * num_global_physvals); - NekDouble *k_global_physvals = this->d_global_physvals.ptr; - NekDouble *k_global_physvals_interlaced = - k_global_physvals + num_global_physvals; - - static_assert( - std::is_same::value == true, - "This implementation assumes that NekDouble and REAL are the same."); - for (std::size_t fx = 0; fx < num_functions; fx++) { - NESOASSERT(num_physvals_per_function == global_physvals.at(fx).size(), - "Missmatch in number of physvals between functions."); - - es.push(this->sycl_target->queue.memcpy( - k_global_physvals + fx * num_physvals_per_function, - global_physvals.at(fx).data(), - num_physvals_per_function * sizeof(NekDouble))); - } - // wait for the copies - es.wait(); - - // interlaced the values for the bary evaluation function - matrix_transpose(this->sycl_target, num_functions, - num_physvals_per_function, k_global_physvals, - k_global_physvals_interlaced) - .wait_and_throw(); - - std::vector h_sym_ptrs(num_functions); - for (std::size_t fx = 0; fx < num_functions; fx++) { - h_sym_ptrs.at(fx) = - particle_group->get_dat(syms.at(fx))->cell_dat.device_ptr(); - } - - BufferDevice d_syms_ptrs(this->sycl_target, h_sym_ptrs); - BufferDevice d_components(this->sycl_target, components); - U ****k_syms_ptrs = d_syms_ptrs.ptr; - int *k_components = d_components.ptr; - - const auto k_ref_positions = - particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")) - ->cell_dat.device_ptr(); - - // values required to evaluate the field - auto k_cell_info = this->d_cell_info->ptr; - - // iteration set specification for the particle loop - auto mpi_rank_dat = particle_group->mpi_rank_dat; + static inline void + dispatch_3d(SYCLTargetSharedPtr sycl_target, EventStack &es, + const std::size_t num_functions, const int k_max_num_phys, + const NekDouble *const RESTRICT k_global_physvals_interlaced, + const CellInfo *const RESTRICT k_cell_info, + ParticleDatSharedPtr mpi_rank_dat, + ParticleDatSharedPtr ref_positions_dat, U ****k_syms_ptrs, + int *k_components) { + constexpr int ndim = 3; ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat}; const std::size_t local_size = - this->sycl_target->parameters - ->template get("LOOP_LOCAL_SIZE") + sycl_target->parameters->template get("LOOP_LOCAL_SIZE") ->value; const std::size_t local_num_reals = - static_cast(this->ndim * this->max_num_phys) + - num_functions; + static_cast(ndim * k_max_num_phys) + num_functions; const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); - const auto k_max_num_phys = this->max_num_phys; - auto is = ish.get_all_cells(local_size, num_bytes_local); + const auto k_ref_positions = ref_positions_dat->cell_dat.device_ptr(); - ProfileRegion pr("BaryEvaluateBase", - "evaluate_2d_" + std::to_string(num_functions)); for (auto &blockx : is) { const auto block_device = blockx.block_device; const std::size_t local_size = blockx.local_size; @@ -245,29 +177,35 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { REAL *div_start = &local_mem[local_size * num_functions]; REAL *div_space0 = div_start + idx_local; REAL *div_space1 = div_space0 + k_max_num_phys * local_size; + REAL *div_space2 = div_space1 + k_max_num_phys * local_size; const auto cell_info = k_cell_info[cell]; const REAL xi0 = k_ref_positions[cell][0][layer]; const REAL xi1 = k_ref_positions[cell][1][layer]; - // If this cell is a triangle then we need to map to the - // collapsed coordinates. - REAL eta0, eta1; + const REAL xi2 = k_ref_positions[cell][2][layer]; + REAL eta0, eta1, eta2; - GeometryInterface::loc_coord_to_loc_collapsed_2d( - cell_info.shape_type_int, xi0, xi1, &eta0, &eta1); + GeometryInterface::loc_coord_to_loc_collapsed_3d( + cell_info.shape_type_int, xi0, xi1, xi2, &eta0, &eta1, + &eta2); const auto num_phys0 = cell_info.num_phys[0]; const auto num_phys1 = cell_info.num_phys[1]; + const auto num_phys2 = cell_info.num_phys[2]; const auto z0 = cell_info.d_z[0]; const auto z1 = cell_info.d_z[1]; + const auto z2 = cell_info.d_z[2]; const auto bw0 = cell_info.d_bw[0]; const auto bw1 = cell_info.d_bw[1]; + const auto bw2 = cell_info.d_bw[2]; Bary::preprocess_weights(num_phys0, eta0, z0, bw0, div_space0, local_size); Bary::preprocess_weights(num_phys1, eta1, z1, bw1, div_space1, local_size); + Bary::preprocess_weights(num_phys2, eta2, z2, bw2, div_space2, + local_size); // Get pointer to the start of the quadrature point values for // this cell @@ -275,9 +213,10 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { &k_global_physvals_interlaced[cell_info.phys_offset * num_functions]; - Bary::compute_dir_10_interlaced( - num_functions, num_phys0, num_phys1, physvals, div_space0, - div_space1, evaluations, local_size); + Bary::compute_dir_210_interlaced( + num_functions, num_phys0, num_phys1, num_phys2, physvals, + div_space0, div_space1, div_space2, evaluations, + local_size); for (std::size_t fx = 0; fx < num_functions; fx++) { auto ptr = k_syms_ptrs[fx]; @@ -288,11 +227,93 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { }); })); } + } + + template + inline void + evaluate_inner(ParticleGroupSharedPtr particle_group, + std::vector> syms, const std::vector components, + std::vector *> &global_physvals) { + + EventStack es; + NESOASSERT(syms.size() == components.size(), "Input size missmatch"); + NESOASSERT(global_physvals.size() == components.size(), + "Input size missmatch"); + const std::size_t num_functions = static_cast(syms.size()); + const std::size_t num_physvals_per_function = global_physvals.at(0)->size(); + + // copy the quadrature point values over to the device + const std::size_t num_global_physvals = + num_functions * num_physvals_per_function; + + const std::size_t factor = (num_functions > 1) ? 2 : 1; + this->d_global_physvals.realloc_no_copy(factor * num_global_physvals); + NekDouble *k_global_physvals = this->d_global_physvals.ptr; + NekDouble *k_global_physvals_interlaced = + (num_functions > 1) ? k_global_physvals + num_global_physvals + : k_global_physvals; + + static_assert( + std::is_same::value == true, + "This implementation assumes that NekDouble and REAL are the same."); + for (std::size_t fx = 0; fx < num_functions; fx++) { + NESOASSERT(num_physvals_per_function == global_physvals.at(fx)->size(), + "Missmatch in number of physvals between functions."); + + es.push(this->sycl_target->queue.memcpy( + k_global_physvals + fx * num_physvals_per_function, + global_physvals.at(fx)->data(), + num_physvals_per_function * sizeof(NekDouble))); + } + // wait for the copies + es.wait(); + + // interlaced the values for the bary evaluation function + if (num_functions > 1) { + matrix_transpose(this->sycl_target, num_functions, + num_physvals_per_function, k_global_physvals, + k_global_physvals_interlaced) + .wait_and_throw(); + } + + std::vector h_sym_ptrs(num_functions); + for (std::size_t fx = 0; fx < num_functions; fx++) { + h_sym_ptrs.at(fx) = + particle_group->get_dat(syms.at(fx))->cell_dat.device_ptr(); + } + BufferDevice d_syms_ptrs(this->sycl_target, h_sym_ptrs); + BufferDevice d_components(this->sycl_target, components); + + ProfileRegion pr("BaryEvaluateBase", "evaluate_" + + std::to_string(this->ndim) + "d_" + + std::to_string(num_functions)); + + if (this->ndim == 2) { + this->dispatch_2d( + this->sycl_target, es, num_functions, this->max_num_phys, + k_global_physvals_interlaced, this->d_cell_info->ptr, + particle_group->mpi_rank_dat, + particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")), + d_syms_ptrs.ptr, d_components.ptr); + } else { + this->dispatch_3d( + this->sycl_target, es, num_functions, this->max_num_phys, + k_global_physvals_interlaced, this->d_cell_info->ptr, + particle_group->mpi_rank_dat, + particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")), + d_syms_ptrs.ptr, d_components.ptr); + } + const auto nphys = this->max_num_phys; const auto npart = particle_group->get_npart_local(); const auto nflop_prepare = this->ndim * nphys * 5; - const auto nflop_loop = nphys * nphys * 3; + const auto nflop_loop = (this->ndim == 2) + ? nphys * nphys * 3 + : nphys * nphys + nphys * nphys * nphys * 3; pr.num_flops = (nflop_loop + nflop_prepare) * npart; + pr.num_bytes = sizeof(REAL) * (npart * ((this->ndim + num_functions)) + + num_global_physvals); + // wait for the loop to complete es.wait(); pr.end(); this->sycl_target->profile_map.add_region(pr); @@ -394,28 +415,6 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { this->sycl_target, v_cell_info); } - /** - * Evaluate a Nektar++ field at particle locations using the provided - * quadrature point values and Bary Interpolation. - * - * @param particle_group ParticleGroup containing the particles. - * @param sym Symbol that corresponds to a ParticleDat in the ParticleGroup. - * @param component Component in the ParticleDat in which to place the - * output. - * @param global_physvals Field values at quadrature points to evaluate. - */ - template - inline void evaluate(ParticleGroupSharedPtr particle_group, Sym sym, - const int component, - Array &global_physvals) { - if (this->ndim == 2) { - return this->evaluate_inner_2d(particle_group, sym, component, - global_physvals); - } else { - NESOASSERT(false, "Error not implemented"); - } - } - /** * Evaluate Nektar++ fields at particle locations using the provided * quadrature point values and Bary Interpolation. @@ -429,12 +428,12 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { inline void evaluate(ParticleGroupSharedPtr particle_group, std::vector> syms, const std::vector components, - std::vector> &global_physvals) { - if (this->ndim == 2) { - return this->evaluate_inner_2d(particle_group, syms, components, - global_physvals); + std::vector *> &global_physvals) { + if ((this->ndim == 2) || (this->ndim == 3)) { + return this->evaluate_inner(particle_group, syms, components, + global_physvals); } else { - NESOASSERT(false, "Error not implemented"); + NESOASSERT(false, "Not implemented in this number of dimensions."); } } }; diff --git a/include/nektar_interface/function_evaluation.hpp b/include/nektar_interface/function_evaluation.hpp index 85cb2337..49a75415 100644 --- a/include/nektar_interface/function_evaluation.hpp +++ b/include/nektar_interface/function_evaluation.hpp @@ -66,8 +66,9 @@ template class FieldEvaluate { auto particle_mesh_interface = std::dynamic_pointer_cast( particle_group->domain->mesh); - NESOASSERT(particle_mesh_interface->ndim == 2, - "Derivative evaluation supported in 2D only."); + NESOASSERT((particle_mesh_interface->ndim == 2) || + (particle_mesh_interface->ndim == 3), + "Derivative evaluation supported in 2D and 3D only."); this->bary_evaluate_base = std::make_shared>( field, particle_mesh_interface, cell_id_translation); } else { @@ -94,6 +95,9 @@ template class FieldEvaluate { if (this->derivative) { const auto ndim = this->particle_group->domain->mesh->get_ndim(); + const auto ncomp = this->particle_group->get_dat(sym)->ncomp; + NESOASSERT(ncomp >= ndim, "Output ParticleDat does not have a sufficient " + "number of components."); auto global_physvals = this->field->GetPhys(); const int num_quadrature_points = this->field->GetTotPoints(); @@ -108,13 +112,15 @@ template class FieldEvaluate { std::vector> syms(ndim); std::vector components(ndim); + std::vector *> deriv_physvals_ptrs(ndim); for (int dx = 0; dx < ndim; dx++) { syms.at(dx) = sym; components.at(dx) = dx; + deriv_physvals_ptrs.at(dx) = &deriv_physvals.at(dx); } this->bary_evaluate_base->evaluate(this->particle_group, syms, components, - deriv_physvals); + deriv_physvals_ptrs); } else { auto global_coeffs = this->field->GetCoeffs(); diff --git a/include/nektar_interface/utilities.hpp b/include/nektar_interface/utilities.hpp index 8bc2ac7e..5f5109d6 100644 --- a/include/nektar_interface/utilities.hpp +++ b/include/nektar_interface/utilities.hpp @@ -271,6 +271,84 @@ inline double evaluate_scalar_derivative_2d(std::shared_ptr field, return eval; } +/** + * Evaluate the derivative of scalar valued Nektar++ function at a point. + * Avoids assertion issue. + * + * @param field Nektar++ field. + * @param x X coordinate. + * @param y Y coordinate. + * @param z Z coordinate. + * @param direction Direction for derivative. + * @param element_id Optionally specifiy the element ID for the expansion. + * @returns Output du/d(direction). + */ +template +inline double evaluate_scalar_derivative_3d( + std::shared_ptr field, const double x, const double y, const double z, + const int direction, std::optional element_id = std::nullopt) { + Array xi(3); + Array coords(3); + + coords[0] = x; + coords[1] = y; + coords[2] = z; + int elmtIdx; + + if (element_id == std::nullopt) { + elmtIdx = field->GetExpIndex(coords, xi); + } else { + elmtIdx = element_id.value(); + field->GetExp(elmtIdx)->GetGeom()->GetLocCoords(coords, xi); + } + + auto elmtPhys = field->GetPhys() + field->GetPhys_Offset(elmtIdx); + auto expansion = field->GetExp(elmtIdx); + + const int num_quadrature_points = expansion->GetTotPoints(); + auto du = Array(num_quadrature_points); + + expansion->PhysDeriv(direction, elmtPhys, du); + + const double eval = expansion->StdPhysEvaluate(xi, du); + return eval; +} + +/** + * Evaluate the derivative of scalar valued Nektar++ function at a point. + * Avoids assertion issue. Uses local coordinates. + * + * @param field Nektar++ field. + * @param xi0 X local coordinate. + * @param xi1 Y local coordinate. + * @param xi2 Z local coordinate. + * @param direction Direction for derivative. + * @param element_id Specifiy the element ID for the expansion. + * @returns Output du/d(direction). + */ +template +inline double +evaluate_scalar_derivative_local_3d(std::shared_ptr field, const double xi0, + const double xi1, const double xi2, + const int direction, const int element_id) { + + Array xi(3); + xi[0] = xi0; + xi[1] = xi1; + xi[2] = xi2; + + auto elmtPhys = field->GetPhys() + field->GetPhys_Offset(element_id); + auto expansion = field->GetExp(element_id); + + const int num_quadrature_points = expansion->GetTotPoints(); + auto du = Array(num_quadrature_points); + + expansion->PhysDeriv(direction, elmtPhys, du); + + const double eval = expansion->StdPhysEvaluate(xi, du); + return eval; +} + /** * Globally find the nektar++ geometry object that owns a point. * diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index 9a0e308a..b1bca673 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -72,6 +72,7 @@ static inline void evaluation_wrapper_3d(std::string condtions_file_s, ParticleSpec particle_spec{ParticleProp(Sym("P"), ndim, true), ParticleProp(Sym("CELL_ID"), 1, true), ParticleProp(Sym("E"), 1), + ParticleProp(Sym("DEDX"), ndim), ParticleProp(Sym("ID"), 1)}; auto A = std::make_shared(domain, particle_spec, sycl_target); @@ -120,38 +121,64 @@ static inline void evaluation_wrapper_3d(std::string condtions_file_s, (z - 1.0), 4); }; + interpolate_onto_nektar_field_3d(lambda_f, field); NESOCellsToNektarExp map_cells_to_exp(field, cell_id_translation); auto field_evaluate = std::make_shared>( field, A, cell_id_translation); field_evaluate->evaluate(Sym("E")); + auto field_deriv_evaluate = std::make_shared>( + field, A, cell_id_translation, true); + field_deriv_evaluate->evaluate(Sym("DEDX")); - Array local_coord(3); - + Array xi(3); for (int cellx = 0; cellx < cell_count; cellx++) { auto cell_ids = A->cell_id_dat->cell_dat.get_cell(cellx); auto reference_positions = - (*A)[Sym("NESO_REFERENCE_POSITIONS")]->cell_dat.get_cell(cellx); - auto E = (*A)[Sym("E")]->cell_dat.get_cell(cellx); + A->get_cell(Sym("NESO_REFERENCE_POSITIONS"), cellx); + auto E = A->get_cell(Sym("E"), cellx); + auto DEDX = A->get_cell(Sym("DEDX"), cellx); + auto P = A->get_cell(Sym("P"), cellx); const int exp_id = map_cells_to_exp.get_exp_id(cellx); const auto exp = map_cells_to_exp.get_exp(cellx); const auto exp_phys = field->GetPhys() + field->GetPhys_Offset(exp_id); + auto geom = field->GetExp(exp_id)->GetGeom(); for (int rowx = 0; rowx < cell_ids->nrow; rowx++) { + xi[0] = reference_positions->at(rowx, 0); + xi[1] = reference_positions->at(rowx, 1); + xi[2] = reference_positions->at(rowx, 2); - local_coord[0] = (*reference_positions)[0][rowx]; - local_coord[1] = (*reference_positions)[1][rowx]; - local_coord[2] = (*reference_positions)[2][rowx]; - - const REAL to_test = (*E)[0][rowx]; - const REAL correct = exp->StdPhysEvaluate(local_coord, exp_phys); + // Test the scalar function evaluation + const REAL to_test = E->at(rowx, 0); + const REAL correct = exp->StdPhysEvaluate(xi, exp_phys); const double err = relative_error(correct, to_test); const double err_abs = std::abs(correct - to_test); EXPECT_TRUE(err < tol || err_abs < tol); + + // Test the derivative evaluation + for (int dx = 0; dx < ndim; dx++) { + Array eta(3); + field->GetExp(exp_id)->LocCoordToLocCollapsed(xi, eta); + REAL eta0, eta1, eta2; + GeometryInterface::loc_coord_to_loc_collapsed_3d( + geom->GetShapeType(), xi[0], xi[1], xi[2], &eta0, &eta1, &eta2); + + EXPECT_NEAR(eta[0], eta0, 1.0e-14); + EXPECT_NEAR(eta[1], eta1, 1.0e-14); + EXPECT_NEAR(eta[2], eta2, 1.0e-14); + + const auto correctm = evaluate_scalar_derivative_local_3d( + field, xi[0], xi[1], xi[2], dx, exp_id); + const auto to_test = DEDX->at(rowx, dx); + const double err = relative_error(correctm, to_test); + const double err_abs = std::abs(correctm - to_test); + EXPECT_TRUE(err < tol || err_abs < tol); + } } } From 7ac67034de31ef9eb90e2648abaa9ca7db5fbfa8 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 11 Nov 2024 12:09:58 +0000 Subject: [PATCH 37/66] updated NP submodule commit --- neso-particles | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neso-particles b/neso-particles index e32da6ce..2f097290 160000 --- a/neso-particles +++ b/neso-particles @@ -1 +1 @@ -Subproject commit e32da6ceb0e454489ab9172d1c23aba142700ff8 +Subproject commit 2f097290a46ba8fb4b76579bf8edd8970d55998f From 70a25fad419c936f15de2157316ce0ea2bc7f716 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 11 Nov 2024 13:57:05 +0000 Subject: [PATCH 38/66] added 3D test mesh of order 2 --- .../mixed_ref_cube_0.5_perturbed_order_2.xml | 4771 +++++++++++++++++ ..._particle_geometry_interface_3d_curved.cpp | 64 +- 2 files changed, 4777 insertions(+), 58 deletions(-) create mode 100644 test/test_resources/reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml diff --git a/test/test_resources/reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml b/test/test_resources/reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml new file mode 100644 index 00000000..8219335a --- /dev/null +++ b/test/test_resources/reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml @@ -0,0 +1,4771 @@ + + + + + -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 + -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 + -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 + -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 + -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 + -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 + -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + -5.00000000e-01 1.37639899e-12 -1.00000000e+00 + -1.00000000e+00 2.75279799e-12 -1.00000000e+00 + -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 + -1.00000000e+00 2.75279799e-12 -8.00000000e-01 + -5.00312350e-01 3.13724879e-02 -5.99415152e-01 + -1.00000000e+00 2.75279799e-12 -6.00000000e-01 + -5.00000000e-01 5.00000000e-01 -1.00000000e+00 + -1.00000000e+00 5.00000000e-01 -1.00000000e+00 + -4.72256518e-01 4.55448912e-01 -8.33711630e-01 + -1.00000000e+00 5.00000000e-01 -8.00000000e-01 + -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + -1.00000000e+00 5.00000000e-01 -6.00000000e-01 + -5.00000000e-01 1.00000000e+00 -1.00000000e+00 + -1.00000000e+00 1.00000000e+00 -1.00000000e+00 + -5.00000000e-01 1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 1.00000000e+00 -8.00000000e-01 + -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 1.00000000e+00 -6.00000000e-01 + -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 + -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 + -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 + 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 + -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 + 0.00000000e+00 0.00000000e+00 -1.00000000e+00 + -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 + -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + 1.37639899e-12 5.00000000e-01 -1.00000000e+00 + 2.81216416e-02 5.47228351e-01 -7.57921741e-01 + 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + 2.75279799e-12 1.00000000e+00 -1.00000000e+00 + 2.75279799e-12 1.00000000e+00 -8.00000000e-01 + 2.75279799e-12 1.00000000e+00 -6.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 + 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 + 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 + 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 + 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 + 5.09344874e-01 3.09144506e-02 -8.04652537e-01 + 5.23944619e-01 1.85747848e-02 -5.96055755e-01 + 5.00000000e-01 5.00000000e-01 -1.00000000e+00 + 4.76425748e-01 5.49663539e-01 -7.93911671e-01 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 + 5.00000000e-01 1.00000000e+00 -1.00000000e+00 + 5.00000000e-01 1.00000000e+00 -8.00000000e-01 + 5.00000000e-01 1.00000000e+00 -6.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 + 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 + 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 + 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 + 1.00000000e+00 5.00000000e-01 -1.00000000e+00 + 1.00000000e+00 5.00000000e-01 -8.00000000e-01 + 1.00000000e+00 5.00000000e-01 -6.00000000e-01 + 1.00000000e+00 1.00000000e+00 -1.00000000e+00 + 1.00000000e+00 1.00000000e+00 -8.00000000e-01 + 1.00000000e+00 1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 + -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 + 5.00000000e-01 1.00000000e+00 -2.00000000e-01 + 1.00000000e+00 1.00000000e+00 -2.00000000e-01 + 1.00000000e+00 7.50000000e-01 -4.00000000e-01 + 7.50000000e-01 1.00000000e+00 -4.00000000e-01 + 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + -2.53076790e-01 7.99260743e-01 -4.64658113e-01 + 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 + 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 7.31572411e-01 2.07606548e-01 -4.59504821e-01 + -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 + 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 + -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -7.60981297e-01 2.83096054e-01 -4.53794791e-01 + -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + -2.69993006e-01 2.24633383e-01 -3.42712104e-01 + 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 + -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 + 2.75226154e-01 2.62309674e-01 -3.04722194e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 + -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -1.00000000e+00 1.00000000e+00 -2.00000000e-01 + -7.50000000e-01 1.00000000e+00 -4.00000000e-01 + -1.00000000e+00 7.50000000e-01 -4.00000000e-01 + -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 + -7.71303906e-01 7.42798488e-01 -4.51592940e-01 + 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 7.58754489e-01 7.58424515e-01 -4.31851638e-01 + 2.75279799e-12 1.00000000e+00 -2.00000000e-01 + -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + 1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 2.50000000e-01 -4.00000000e-01 + -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 + 2.50000000e-01 1.00000000e+00 -4.00000000e-01 + -1.00000000e+00 2.50000000e-01 -4.00000000e-01 + 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 + 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 + -2.50000000e-01 1.00000000e+00 -4.00000000e-01 + 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 + -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 + 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 + -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 + -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 + -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 + -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 + -1.00000000e+00 -1.00000000e+00 2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 + -1.00000000e+00 -5.00000000e-01 2.00000000e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 + -1.00000000e+00 2.75282575e-12 -5.31227839e-13 + -5.00266360e-01 -1.67846048e-02 4.37459152e-02 + -1.00000000e+00 2.75279799e-12 2.00000000e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 + -1.00000000e+00 5.00000000e-01 -5.31227839e-13 + -4.54327930e-01 4.86669001e-01 -4.97810569e-02 + -1.00000000e+00 5.00000000e-01 2.00000000e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 + -1.00000000e+00 1.00000000e+00 -5.31241717e-13 + -5.00000000e-01 1.00000000e+00 -5.31241717e-13 + -1.00000000e+00 1.00000000e+00 2.00000000e-01 + -5.00000000e-01 1.00000000e+00 2.00000000e-01 + -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 + -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 + -1.34542997e-02 5.28119076e-03 -4.78164736e-02 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 + -2.11337044e-02 5.20175598e-01 1.44520351e-02 + -5.74150632e-03 4.80713344e-01 2.07813459e-01 + 2.75282575e-12 1.00000000e+00 -5.31227839e-13 + 2.75279799e-12 1.00000000e+00 2.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 + 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + 5.00000000e-01 -1.00000000e+00 2.00000000e-01 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 + 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 + 4.74690996e-01 4.58616508e-01 1.67721786e-02 + 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 5.00000000e-01 1.00000000e+00 -5.31227839e-13 + 5.00000000e-01 1.00000000e+00 2.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 + 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 + 1.00000000e+00 -1.00000000e+00 2.00000000e-01 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 + 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 + 1.00000000e+00 5.00000000e-01 -5.31241717e-13 + 1.00000000e+00 5.00000000e-01 2.00000000e-01 + 1.00000000e+00 1.00000000e+00 -5.31241717e-13 + 1.00000000e+00 1.00000000e+00 2.00000000e-01 + -7.50000000e-01 -1.00000000e+00 4.00000000e-01 + -1.00000000e+00 -7.50000000e-01 4.00000000e-01 + 1.00000000e+00 7.50000000e-01 4.00000000e-01 + 7.50000000e-01 1.00000000e+00 4.00000000e-01 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 + -1.11217671e-02 4.85990029e-01 5.72847359e-01 + -2.53733289e-01 7.78555773e-01 5.11047110e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 + 2.50599317e-01 -7.83894535e-01 5.11804036e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 + 7.04885116e-01 2.42741400e-01 4.57337152e-01 + -4.54143370e-01 -4.71697648e-01 6.06228169e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 + -7.69033054e-01 -2.83268701e-01 5.03354564e-01 + -7.63437341e-01 2.29532918e-01 4.45102704e-01 + -2.95099817e-01 -7.31729472e-01 4.69924715e-01 + 7.73208263e-01 -2.59692901e-01 4.77175444e-01 + 2.31960145e-01 7.26079517e-01 4.47497104e-01 + -2.58094392e-01 2.82537068e-01 3.64273615e-01 + 2.25942245e-01 -2.63270065e-01 3.92407990e-01 + -2.32508956e-01 -2.34291873e-01 3.74551790e-01 + 2.70125392e-01 2.53421154e-01 3.09013047e-01 + -4.84577644e-02 4.06855736e-02 5.60664410e-01 + 7.50000000e-01 -1.00000000e+00 4.00000000e-01 + 1.00000000e+00 -7.50000000e-01 4.00000000e-01 + 1.00000000e+00 -5.00000000e-01 6.00000000e-01 + 7.89872088e-01 -7.06620648e-01 4.93373476e-01 + -1.00000000e+00 5.00000000e-01 6.00000000e-01 + -7.42991857e-01 7.43456068e-01 4.63979586e-01 + 5.00000000e-01 1.00000000e+00 6.00000000e-01 + 7.30868887e-01 7.76702907e-01 5.01983983e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 + -7.43450159e-01 -7.74711926e-01 4.35008075e-01 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 + -2.75279799e-12 -1.00000000e+00 6.00000000e-01 + 1.00000000e+00 -2.75279799e-12 6.00000000e-01 + -1.00000000e+00 2.75279799e-12 6.00000000e-01 + -5.00000000e-01 1.00000000e+00 6.00000000e-01 + 5.00000000e-01 -1.00000000e+00 6.00000000e-01 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 + -1.00000000e+00 -5.00000000e-01 6.00000000e-01 + 1.00000000e+00 -2.50000000e-01 4.00000000e-01 + -2.50000000e-01 -1.00000000e+00 4.00000000e-01 + -1.00000000e+00 2.50000000e-01 4.00000000e-01 + 2.50000000e-01 -1.00000000e+00 4.00000000e-01 + -2.50000000e-01 1.00000000e+00 4.00000000e-01 + -1.00000000e+00 7.50000000e-01 4.00000000e-01 + -1.00000000e+00 -2.50000000e-01 4.00000000e-01 + 1.00000000e+00 2.50000000e-01 4.00000000e-01 + -7.50000000e-01 1.00000000e+00 4.00000000e-01 + 2.50000000e-01 1.00000000e+00 4.00000000e-01 + -1.00000000e+00 -1.00000000e+00 6.00000000e-01 + 1.00000000e+00 1.00000000e+00 6.00000000e-01 + 1.00000000e+00 -1.00000000e+00 6.00000000e-01 + -1.00000000e+00 1.00000000e+00 6.00000000e-01 + -1.00000000e+00 -1.00000000e+00 8.00000000e-01 + -5.00000000e-01 -1.00000000e+00 8.00000000e-01 + -5.18510442e-01 -4.61975434e-01 7.65918784e-01 + -1.00000000e+00 -5.00000000e-01 8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 1.00000000e+00 + -5.00000000e-01 -5.00000000e-01 1.00000000e+00 + -1.00000000e+00 -5.00000000e-01 1.00000000e+00 + -4.96184639e-01 -3.41758945e-02 7.94093507e-01 + -1.00000000e+00 2.75282575e-12 8.00000000e-01 + -5.00000000e-01 1.37639899e-12 1.00000000e+00 + -1.00000000e+00 2.75279799e-12 1.00000000e+00 + -4.90548406e-01 5.30132674e-01 8.30068751e-01 + -1.00000000e+00 5.00000000e-01 8.00000000e-01 + -5.00000000e-01 5.00000000e-01 1.00000000e+00 + -1.00000000e+00 5.00000000e-01 1.00000000e+00 + -5.00000000e-01 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 1.00000000e+00 8.00000000e-01 + -5.00000000e-01 1.00000000e+00 1.00000000e+00 + -1.00000000e+00 1.00000000e+00 1.00000000e+00 + -2.75282575e-12 -1.00000000e+00 8.00000000e-01 + 4.47838296e-02 -5.46141782e-01 8.07112459e-01 + -2.75279799e-12 -1.00000000e+00 1.00000000e+00 + -1.37639899e-12 -5.00000000e-01 1.00000000e+00 + -3.53396575e-02 -3.65929367e-02 8.03489850e-01 + 0.00000000e+00 0.00000000e+00 1.00000000e+00 + 4.04523035e-02 5.23334239e-01 7.85315811e-01 + 1.37639899e-12 5.00000000e-01 1.00000000e+00 + 2.75282575e-12 1.00000000e+00 8.00000000e-01 + 2.75279799e-12 1.00000000e+00 1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 8.00000000e-01 + 5.12293954e-01 -5.47020830e-01 8.46585454e-01 + 5.00000000e-01 -1.00000000e+00 1.00000000e+00 + 5.00000000e-01 -5.00000000e-01 1.00000000e+00 + 5.08559128e-01 4.68350764e-02 8.47523900e-01 + 5.00000000e-01 -1.37645451e-12 1.00000000e+00 + 5.36295327e-01 5.28286707e-01 7.83714183e-01 + 5.00000000e-01 5.00000000e-01 1.00000000e+00 + 5.00000000e-01 1.00000000e+00 8.00000000e-01 + 5.00000000e-01 1.00000000e+00 1.00000000e+00 + 1.00000000e+00 -1.00000000e+00 8.00000000e-01 + 1.00000000e+00 -5.00000000e-01 8.00000000e-01 + 1.00000000e+00 -1.00000000e+00 1.00000000e+00 + 1.00000000e+00 -5.00000000e-01 1.00000000e+00 + 1.00000000e+00 -2.75282575e-12 8.00000000e-01 + 1.00000000e+00 -2.75279799e-12 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 8.00000000e-01 + 1.00000000e+00 5.00000000e-01 1.00000000e+00 + 1.00000000e+00 1.00000000e+00 8.00000000e-01 + 1.00000000e+00 1.00000000e+00 1.00000000e+00 + + + 0 1 + 1 2 + 2 3 + 3 0 + 0 4 + 1 5 + 2 6 + 3 7 + 4 5 + 5 6 + 6 7 + 7 4 + 4 8 + 5 9 + 6 10 + 7 11 + 8 9 + 9 10 + 10 11 + 11 8 + 2 12 + 12 13 + 13 3 + 12 14 + 13 15 + 6 14 + 14 15 + 15 7 + 14 16 + 15 17 + 10 16 + 16 17 + 17 11 + 12 18 + 18 19 + 19 13 + 18 20 + 19 21 + 14 20 + 20 21 + 21 15 + 20 22 + 21 23 + 16 22 + 22 23 + 23 17 + 18 24 + 24 25 + 25 19 + 24 26 + 25 27 + 20 26 + 26 27 + 27 21 + 26 28 + 27 29 + 22 28 + 28 29 + 29 23 + 1 30 + 30 31 + 31 2 + 30 32 + 31 33 + 5 32 + 32 33 + 33 6 + 32 34 + 33 35 + 9 34 + 34 35 + 35 10 + 31 36 + 36 12 + 36 37 + 33 37 + 37 14 + 37 38 + 35 38 + 38 16 + 36 39 + 39 18 + 39 40 + 37 40 + 40 20 + 40 41 + 38 41 + 41 22 + 39 42 + 42 24 + 42 43 + 40 43 + 43 26 + 43 44 + 41 44 + 44 28 + 30 45 + 45 46 + 46 31 + 45 47 + 46 48 + 32 47 + 47 48 + 48 33 + 47 49 + 48 50 + 34 49 + 49 50 + 50 35 + 46 51 + 51 36 + 51 52 + 48 52 + 52 37 + 52 53 + 50 53 + 53 38 + 51 54 + 54 39 + 54 55 + 52 55 + 55 40 + 55 56 + 53 56 + 56 41 + 54 57 + 57 42 + 57 58 + 55 58 + 58 43 + 58 59 + 56 59 + 59 44 + 45 60 + 60 61 + 61 46 + 60 62 + 61 63 + 47 62 + 62 63 + 63 48 + 62 64 + 63 65 + 49 64 + 64 65 + 65 50 + 61 66 + 66 51 + 66 67 + 63 67 + 67 52 + 67 68 + 65 68 + 68 53 + 66 69 + 69 54 + 69 70 + 67 70 + 70 55 + 70 71 + 68 71 + 71 56 + 69 72 + 72 57 + 72 73 + 70 73 + 73 58 + 73 74 + 71 74 + 74 59 + 76 75 + 76 77 + 75 77 + 78 75 + 78 76 + 78 77 + 80 79 + 80 81 + 79 81 + 79 82 + 80 82 + 82 81 + 22 83 + 83 41 + 84 41 + 22 84 + 84 83 + 50 85 + 35 85 + 35 86 + 50 86 + 85 86 + 56 87 + 53 87 + 53 88 + 56 88 + 87 88 + 10 89 + 16 89 + 16 90 + 10 90 + 89 90 + 53 85 + 50 91 + 53 91 + 85 91 + 16 92 + 22 92 + 93 22 + 93 16 + 93 92 + 35 94 + 10 94 + 95 10 + 95 35 + 95 94 + 41 96 + 56 96 + 56 97 + 41 97 + 96 97 + 98 22 + 98 41 + 83 98 + 50 99 + 35 99 + 85 99 + 10 100 + 16 100 + 89 100 + 56 101 + 53 101 + 87 101 + 102 16 + 102 38 + 98 38 + 16 98 + 102 98 + 102 53 + 101 38 + 101 102 + 100 38 + 102 100 + 35 102 + 35 100 + 38 99 + 99 53 + 102 99 + 38 83 + 41 101 + 83 101 + 98 92 + 100 94 + 96 101 + 104 103 + 105 104 + 105 103 + 106 103 + 104 106 + 105 106 + 9 76 + 10 76 + 9 107 + 76 107 + 10 107 + 92 23 + 108 22 + 23 108 + 92 108 + 65 109 + 50 109 + 65 110 + 109 110 + 50 110 + 76 95 + 9 95 + 23 93 + 109 91 + 65 91 + 59 96 + 56 111 + 59 111 + 96 111 + 59 97 + 44 112 + 41 112 + 112 84 + 44 84 + 113 34 + 35 113 + 113 86 + 34 86 + 44 97 + 112 97 + 95 34 + 113 95 + 87 68 + 88 68 + 17 89 + 17 90 + 93 17 + 93 89 + 68 91 + 91 87 + 28 114 + 22 114 + 108 114 + 108 28 + 49 115 + 50 115 + 115 110 + 49 110 + 28 84 + 84 114 + 86 49 + 86 115 + 11 94 + 11 107 + 94 107 + 71 96 + 71 111 + 71 88 + 96 88 + 11 90 + 94 90 + 116 80 + 79 116 + 116 81 + 117 75 + 117 76 + 117 78 + 96 87 + 96 118 + 118 87 + 88 118 + 76 119 + 9 119 + 119 95 + 59 79 + 120 79 + 120 59 + 79 97 + 120 97 + 23 103 + 121 103 + 23 121 + 93 103 + 121 93 + 122 109 + 122 65 + 122 91 + 77 9 + 77 107 + 82 59 + 79 111 + 82 111 + 123 113 + 123 34 + 123 86 + 124 112 + 124 44 + 84 124 + 106 23 + 108 103 + 106 108 + 65 125 + 109 125 + 125 110 + 17 126 + 127 126 + 127 17 + 90 126 + 127 90 + 105 114 + 105 28 + 105 108 + 128 115 + 128 49 + 128 110 + 116 71 + 81 71 + 111 116 + 111 81 + 117 11 + 78 11 + 107 117 + 107 78 + 119 34 + 119 113 + 44 120 + 120 112 + 124 28 + 124 114 + 123 49 + 123 115 + 11 127 + 127 117 + 117 90 + 121 17 + 121 126 + 93 126 + 78 8 + 107 8 + 29 105 + 108 29 + 128 64 + 64 110 + 74 81 + 111 74 + 118 68 + 71 118 + 29 106 + 64 125 + 8 77 + 82 74 + 68 122 + 109 85 + 85 110 + 129 35 + 85 129 + 129 86 + 92 83 + 84 92 + 76 94 + 112 83 + 113 129 + 89 94 + 95 129 + 83 97 + 114 92 + 115 85 + 85 87 + 89 92 + 129 94 + 96 83 + 129 99 + 102 129 + 100 129 + 102 87 + 99 87 + 102 89 + 98 89 + 102 83 + 105 92 + 128 85 + 130 87 + 130 96 + 130 118 + 130 116 + 96 116 + 118 116 + 131 115 + 85 131 + 131 128 + 104 114 + 104 92 + 92 103 + 109 130 + 87 109 + 122 130 + 87 122 + 92 102 + 85 102 + 83 87 + 89 129 + 96 79 + 89 126 + 117 94 + 125 128 + 75 8 + 74 80 + 29 104 + 131 64 + 131 125 + 109 128 + 131 109 + 103 89 + 94 113 + 112 96 + 76 113 + 79 112 + 126 94 + 68 130 + 83 114 + 115 129 + 126 103 + 117 126 + 112 114 + 113 115 + 132 133 + 133 76 + 132 75 + 132 134 + 133 134 + 134 117 + 135 134 + 135 133 + 135 94 + 136 137 + 137 133 + 136 132 + 136 138 + 137 138 + 138 134 + 139 138 + 139 137 + 139 135 + 134 140 + 140 126 + 135 140 + 141 140 + 141 135 + 141 89 + 138 142 + 142 140 + 139 142 + 143 142 + 143 139 + 143 141 + 140 144 + 144 103 + 141 144 + 145 144 + 145 141 + 145 92 + 142 146 + 146 144 + 143 146 + 147 146 + 147 143 + 147 145 + 144 148 + 148 104 + 145 148 + 149 148 + 149 114 + 149 145 + 146 150 + 150 148 + 147 150 + 151 150 + 151 149 + 151 147 + 133 152 + 152 113 + 152 135 + 153 135 + 153 152 + 153 129 + 137 154 + 154 152 + 154 139 + 155 139 + 155 154 + 155 153 + 153 141 + 156 141 + 156 153 + 156 102 + 155 143 + 157 143 + 157 155 + 157 156 + 156 145 + 158 145 + 158 156 + 158 83 + 157 147 + 159 147 + 159 157 + 159 158 + 158 149 + 160 149 + 160 112 + 160 158 + 159 151 + 161 151 + 161 160 + 161 159 + 152 162 + 162 115 + 162 153 + 163 153 + 163 162 + 163 85 + 154 164 + 164 162 + 164 155 + 165 155 + 165 164 + 165 163 + 163 156 + 166 156 + 166 163 + 166 87 + 165 157 + 167 157 + 167 165 + 167 166 + 166 158 + 168 158 + 168 166 + 168 96 + 167 159 + 169 159 + 169 167 + 169 168 + 168 160 + 170 160 + 170 79 + 170 168 + 169 161 + 171 161 + 171 170 + 171 169 + 162 172 + 172 131 + 172 163 + 173 172 + 173 109 + 173 163 + 164 174 + 174 172 + 174 165 + 175 174 + 175 173 + 175 165 + 173 166 + 176 173 + 176 130 + 176 166 + 175 167 + 177 175 + 177 176 + 177 167 + 176 168 + 178 176 + 178 116 + 178 168 + 177 169 + 179 177 + 179 178 + 179 169 + 178 170 + 180 178 + 180 80 + 180 170 + 179 171 + 181 179 + 181 180 + 181 171 + 182 136 + 137 182 + 183 137 + 183 136 + 183 182 + 184 171 + 181 184 + 185 181 + 185 171 + 185 184 + 147 186 + 186 187 + 147 187 + 147 188 + 188 186 + 188 187 + 189 165 + 190 165 + 189 190 + 189 191 + 191 165 + 190 191 + 192 167 + 193 167 + 193 192 + 192 194 + 167 194 + 193 194 + 143 195 + 196 195 + 143 196 + 197 143 + 197 195 + 197 196 + 196 147 + 196 186 + 147 198 + 196 198 + 186 198 + 155 195 + 189 155 + 189 195 + 199 195 + 155 199 + 189 199 + 190 167 + 192 190 + 190 200 + 167 200 + 192 200 + 187 169 + 193 187 + 193 169 + 201 169 + 201 187 + 201 193 + 202 186 + 202 147 + 202 187 + 165 203 + 189 203 + 190 203 + 195 204 + 143 204 + 196 204 + 167 205 + 192 205 + 193 205 + 196 157 + 196 206 + 206 157 + 202 157 + 196 202 + 202 206 + 204 157 + 204 206 + 189 157 + 206 189 + 189 204 + 192 157 + 192 206 + 206 203 + 157 203 + 192 203 + 206 187 + 157 187 + 205 206 + 205 157 + 205 187 + 155 204 + 167 203 + 205 169 + 175 207 + 174 207 + 208 174 + 208 175 + 208 207 + 209 165 + 209 190 + 165 210 + 209 210 + 190 210 + 146 211 + 186 211 + 186 146 + 212 146 + 212 211 + 186 212 + 209 200 + 165 200 + 198 211 + 198 146 + 213 169 + 193 213 + 214 169 + 214 213 + 214 193 + 215 139 + 195 215 + 195 139 + 216 139 + 215 216 + 195 216 + 215 199 + 139 199 + 213 201 + 217 161 + 187 161 + 217 187 + 217 188 + 188 161 + 218 154 + 189 154 + 189 218 + 218 191 + 154 191 + 201 161 + 217 201 + 199 154 + 199 218 + 219 167 + 192 219 + 219 194 + 220 143 + 196 220 + 220 197 + 143 198 + 220 198 + 219 200 + 221 151 + 151 186 + 221 186 + 221 212 + 212 151 + 222 164 + 190 164 + 190 222 + 222 210 + 164 210 + 191 164 + 222 191 + 188 151 + 188 221 + 223 169 + 223 193 + 214 223 + 224 139 + 224 195 + 224 216 + 194 169 + 223 194 + 139 197 + 197 224 + 138 183 + 179 184 + 165 225 + 167 225 + 200 225 + 215 137 + 215 226 + 226 137 + 137 199 + 226 199 + 227 211 + 227 146 + 227 198 + 213 171 + 185 213 + 214 171 + 185 214 + 182 215 + 137 216 + 216 182 + 218 228 + 154 228 + 191 228 + 229 217 + 229 161 + 188 229 + 230 146 + 230 211 + 212 230 + 175 209 + 208 209 + 210 175 + 210 208 + 142 220 + 231 220 + 231 142 + 142 197 + 231 197 + 177 219 + 219 232 + 177 232 + 177 194 + 232 194 + 233 221 + 151 233 + 233 212 + 207 222 + 207 164 + 207 210 + 223 179 + 223 184 + 214 179 + 214 184 + 154 226 + 226 218 + 234 161 + 217 234 + 201 234 + 229 151 + 229 221 + 228 164 + 222 228 + 232 179 + 223 232 + 194 179 + 235 224 + 235 183 + 224 183 + 216 235 + 216 183 + 236 223 + 236 184 + 214 236 + 222 237 + 207 237 + 237 210 + 238 221 + 233 238 + 212 238 + 220 224 + 231 224 + 218 222 + 219 223 + 221 217 + 235 215 + 182 235 + 238 211 + 238 230 + 237 209 + 237 208 + 213 236 + 236 185 + 209 219 + 225 219 + 225 209 + 217 213 + 234 213 + 215 218 + 211 220 + 227 220 + 147 212 + 187 159 + 188 159 + 191 155 + 201 159 + 203 155 + 202 159 + 139 204 + 205 159 + 143 202 + 147 233 + 207 165 + 231 138 + 139 231 + 175 225 + 150 233 + 139 183 + 225 177 + 227 142 + 143 227 + 171 234 + 234 169 + 230 233 + 136 235 + 236 181 + 174 237 + 238 150 + 150 230 + 146 233 + 224 138 + 235 239 + 215 240 + 195 241 + 224 242 + 239 240 + 240 241 + 241 242 + 242 239 + 239 243 + 240 244 + 241 245 + 242 246 + 243 244 + 244 245 + 245 246 + 246 243 + 196 247 + 220 248 + 241 247 + 247 248 + 248 242 + 247 249 + 248 250 + 245 249 + 249 250 + 250 246 + 186 251 + 211 252 + 247 251 + 251 252 + 252 248 + 251 253 + 252 254 + 249 253 + 253 254 + 254 250 + 221 255 + 238 256 + 251 255 + 255 256 + 256 252 + 255 257 + 256 258 + 253 257 + 257 258 + 258 254 + 218 259 + 189 260 + 240 259 + 259 260 + 260 241 + 259 261 + 260 262 + 244 261 + 261 262 + 262 245 + 206 263 + 260 263 + 263 247 + 263 264 + 262 264 + 264 249 + 187 265 + 263 265 + 265 251 + 265 266 + 264 266 + 266 253 + 217 267 + 265 267 + 267 255 + 267 268 + 266 268 + 268 257 + 222 269 + 190 270 + 259 269 + 269 270 + 270 260 + 269 271 + 270 272 + 261 271 + 271 272 + 272 262 + 192 273 + 270 273 + 273 263 + 273 274 + 272 274 + 274 264 + 193 275 + 273 275 + 275 265 + 275 276 + 274 276 + 276 266 + 213 277 + 275 277 + 277 267 + 277 278 + 276 278 + 278 268 + 237 279 + 209 280 + 269 279 + 279 280 + 280 270 + 279 281 + 280 282 + 271 281 + 281 282 + 282 272 + 219 283 + 280 283 + 283 273 + 283 284 + 282 284 + 284 274 + 223 285 + 283 285 + 285 275 + 285 286 + 284 286 + 286 276 + 236 287 + 285 287 + 287 277 + 287 288 + 286 288 + 288 278 + + + 170 171 172 + 170 174 173 + 171 175 174 + 172 175 173 + 176 177 178 + 176 180 179 + 177 181 180 + 178 181 179 + 87 182 183 + 87 185 184 + 182 186 185 + 183 186 184 + 108 187 188 + 108 190 189 + 187 191 190 + 188 191 189 + 123 192 193 + 123 195 194 + 192 196 195 + 193 196 194 + 30 197 198 + 30 200 199 + 197 201 200 + 198 201 199 + 115 202 187 + 115 204 203 + 202 205 204 + 187 205 203 + 43 206 207 + 43 209 208 + 206 210 209 + 207 210 208 + 71 211 212 + 71 214 213 + 211 215 214 + 212 215 213 + 124 216 217 + 124 219 218 + 216 220 219 + 217 220 218 + 87 222 221 + 183 223 222 + 182 223 221 + 108 225 224 + 188 226 225 + 187 226 224 + 30 228 227 + 198 229 228 + 197 229 227 + 123 231 230 + 193 232 231 + 192 232 230 + 79 233 234 + 79 236 235 + 233 237 236 + 234 237 235 + 116 234 238 + 116 239 231 + 234 240 239 + 238 240 231 + 79 241 228 + 234 242 241 + 233 242 228 + 78 243 234 + 78 244 241 + 243 242 244 + 116 246 245 + 238 247 246 + 234 247 245 + 86 183 248 + 86 249 239 + 183 250 249 + 248 250 239 + 86 235 222 + 248 223 235 + 78 245 225 + 243 247 225 + 43 221 236 + 207 251 221 + 206 251 236 + 115 224 246 + 202 226 246 + 71 227 244 + 212 252 227 + 211 252 244 + 124 230 249 + 217 253 230 + 216 253 249 + 254 255 256 + 254 258 257 + 255 259 258 + 256 259 257 + 260 261 17 + 260 263 262 + 261 264 263 + 17 264 262 + 44 265 207 + 44 267 266 + 265 268 267 + 207 268 266 + 269 270 145 + 269 272 271 + 270 273 272 + 145 273 271 + 260 275 274 + 17 213 275 + 261 213 274 + 44 208 276 + 265 210 276 + 269 278 277 + 145 203 278 + 270 203 277 + 131 279 217 + 131 281 280 + 279 282 281 + 217 282 280 + 131 218 283 + 279 220 283 + 284 94 285 + 284 287 286 + 94 184 287 + 285 184 286 + 288 70 289 + 288 291 290 + 70 189 291 + 289 189 290 + 284 293 292 + 285 219 293 + 94 219 292 + 288 295 294 + 289 214 295 + 70 214 294 + 153 193 296 + 153 194 297 + 296 196 297 + 31 198 298 + 31 199 299 + 298 201 299 + 31 300 209 + 298 301 300 + 198 301 209 + 153 302 204 + 296 303 302 + 193 303 204 + 304 56 305 + 304 307 306 + 56 266 307 + 305 266 306 + 308 107 309 + 308 311 310 + 107 273 311 + 309 273 310 + 304 313 312 + 305 185 313 + 56 185 312 + 308 315 314 + 309 190 315 + 107 190 314 + 18 212 316 + 18 264 317 + 212 318 264 + 316 318 317 + 161 217 319 + 161 280 320 + 319 282 320 + 161 321 195 + 319 322 321 + 217 322 195 + 18 323 200 + 316 324 323 + 212 324 200 + 325 326 176 + 325 327 177 + 326 178 327 + 170 328 329 + 328 330 173 + 329 330 174 + 331 332 333 + 331 322 196 + 332 334 322 + 333 334 196 + 260 335 336 + 335 337 274 + 336 337 275 + 338 339 340 + 338 341 283 + 339 342 341 + 340 342 283 + 343 344 345 + 343 346 276 + 344 347 346 + 345 347 276 + 269 348 349 + 348 350 277 + 349 350 278 + 260 351 171 + 351 352 262 + 171 352 263 + 338 353 179 + 338 281 354 + 353 355 281 + 179 355 354 + 288 356 357 + 356 358 290 + 357 358 291 + 284 359 360 + 359 361 286 + 360 361 287 + 343 362 257 + 343 267 363 + 362 364 267 + 257 364 363 + 269 365 366 + 365 367 271 + 366 367 272 + 368 369 370 + 368 371 299 + 369 372 371 + 370 372 299 + 304 373 374 + 373 375 306 + 374 375 307 + 308 376 377 + 376 378 310 + 377 378 311 + 379 327 380 + 379 381 320 + 327 382 381 + 380 382 320 + 383 330 384 + 383 385 317 + 330 386 385 + 384 386 317 + 288 387 388 + 387 337 294 + 388 337 295 + 284 389 390 + 389 342 292 + 390 342 293 + 304 391 392 + 391 361 312 + 392 361 313 + 308 393 394 + 393 358 314 + 394 358 315 + 383 395 396 + 383 323 397 + 395 372 323 + 396 372 397 + 368 398 399 + 368 300 400 + 398 347 300 + 399 347 400 + 19 384 401 + 19 317 402 + 401 386 402 + 57 374 403 + 57 307 404 + 403 375 404 + 143 377 405 + 143 311 406 + 405 378 406 + 168 380 407 + 168 320 408 + 407 382 408 + 95 360 391 + 95 287 312 + 160 409 410 + 160 297 321 + 409 334 297 + 410 334 321 + 32 370 395 + 32 299 323 + 106 357 393 + 106 291 314 + 58 411 362 + 58 404 267 + 411 364 404 + 144 412 365 + 144 406 271 + 412 367 406 + 16 413 351 + 16 402 262 + 413 352 402 + 169 414 353 + 169 408 281 + 414 355 408 + 152 349 415 + 152 278 302 + 415 350 302 + 69 336 387 + 69 275 294 + 45 345 398 + 45 276 300 + 132 340 389 + 132 283 292 + 270 416 187 + 416 417 272 + 187 417 273 + 418 188 419 + 418 189 420 + 419 191 420 + 207 421 182 + 207 422 185 + 421 186 422 + 416 205 277 + 261 423 212 + 423 318 263 + 285 183 424 + 424 186 286 + 289 418 425 + 425 420 290 + 192 217 331 + 212 426 197 + 426 201 324 + 425 427 295 + 418 427 214 + 424 428 293 + 183 428 219 + 423 215 274 + 305 207 429 + 429 268 306 + 309 187 430 + 430 417 310 + 429 422 313 + 430 191 315 + 202 193 431 + 431 303 205 + 198 432 206 + 432 210 301 + 211 418 433 + 433 427 215 + 183 434 216 + 434 220 428 + 418 435 225 + 419 226 435 + 421 223 251 + 426 229 252 + 331 253 232 + 418 436 243 + 418 437 244 + 436 242 437 + 436 247 435 + 238 193 438 + 193 439 246 + 438 439 247 + 438 232 240 + 198 440 233 + 198 441 236 + 440 237 441 + 440 242 229 + 234 442 248 + 442 223 237 + 442 250 240 + 431 439 226 + 432 251 441 + 433 437 252 + 434 253 250 + 429 443 373 + 443 375 268 + 430 444 376 + 444 378 417 + 445 331 446 + 445 333 447 + 446 332 447 + 448 446 449 + 448 447 450 + 449 332 450 + 451 430 452 + 451 376 453 + 452 444 453 + 454 429 455 + 454 373 255 + 455 443 255 + 254 455 456 + 456 443 256 + 457 458 445 + 457 348 459 + 458 460 348 + 445 460 459 + 461 421 442 + 461 251 237 + 436 462 419 + 462 226 247 + 442 463 438 + 463 232 250 + 464 440 436 + 464 229 437 + 462 438 431 + 432 461 440 + 426 464 433 + 463 434 331 + 343 456 265 + 456 268 363 + 456 210 346 + 338 465 279 + 465 282 354 + 465 220 341 + 368 298 466 + 466 201 371 + 466 301 400 + 383 316 467 + 467 318 385 + 379 319 449 + 449 282 381 + 467 324 397 + 405 468 412 + 468 367 378 + 413 401 175 + 175 386 352 + 403 259 411 + 259 364 375 + 407 181 414 + 181 355 382 + 469 172 413 + 469 173 401 + 470 407 177 + 470 414 180 + 471 403 255 + 471 411 258 + 472 405 453 + 472 412 473 + 453 468 473 + 256 375 363 + 178 354 382 + 174 386 263 + 474 366 468 + 474 272 378 + 416 474 444 + 475 453 474 + 475 473 366 + 475 452 416 + 476 456 432 + 476 346 301 + 458 303 277 + 460 350 303 + 416 431 458 + 477 433 425 + 477 215 295 + 424 478 434 + 478 220 293 + 479 388 335 + 479 295 274 + 479 423 477 + 480 390 339 + 480 293 341 + 480 465 478 + 481 466 426 + 481 371 324 + 482 296 445 + 482 409 447 + 296 333 409 + 429 483 421 + 483 186 313 + 484 419 430 + 484 420 315 + 485 399 344 + 485 400 346 + 485 476 466 + 296 415 460 + 482 459 415 + 329 263 385 + 329 467 423 + 326 449 465 + 326 381 354 + 379 450 410 + 319 332 410 + 486 481 467 + 486 371 397 + 486 396 369 + 487 424 483 + 487 286 313 + 487 392 359 + 488 394 356 + 488 315 290 + 488 425 484 + 489 493 492 + 493 496 495 + 498 502 501 + 502 505 504 + 507 495 509 + 509 511 510 + 513 504 515 + 515 517 516 + 519 510 521 + 521 523 522 + 525 516 527 + 527 529 528 + 531 522 533 + 534 533 536 + 537 528 539 + 540 539 542 + 543 545 496 + 545 547 546 + 549 551 505 + 551 553 552 + 511 546 555 + 555 557 556 + 517 552 559 + 559 561 560 + 523 556 563 + 563 565 564 + 529 560 567 + 567 569 568 + 536 564 571 + 572 571 574 + 542 568 575 + 576 575 578 + 579 581 547 + 581 583 582 + 585 587 553 + 587 589 588 + 557 582 591 + 591 593 592 + 561 588 595 + 595 597 596 + 565 592 599 + 599 601 600 + 569 596 603 + 603 605 604 + 574 600 607 + 608 607 610 + 578 604 611 + 612 611 614 + 615 617 583 + 618 620 617 + 621 623 589 + 624 626 623 + 620 627 593 + 628 630 627 + 626 631 597 + 632 634 631 + 630 635 601 + 636 638 635 + 634 639 605 + 640 642 639 + 643 610 638 + 644 646 643 + 647 614 642 + 648 650 647 + 498 651 652 + 498 654 653 + 651 655 654 + 652 655 653 + 650 656 657 + 650 659 658 + 656 660 659 + 657 660 658 + 661 662 663 + 661 665 664 + 662 666 665 + 663 666 664 + 667 668 669 + 667 671 670 + 668 672 671 + 669 672 670 + 673 674 675 + 673 677 676 + 674 678 677 + 675 678 676 + 679 680 681 + 679 683 682 + 680 684 683 + 681 684 682 + 685 686 661 + 685 688 687 + 686 689 688 + 661 689 687 + 690 691 692 + 690 694 693 + 691 695 694 + 692 695 693 + 696 673 697 + 696 699 698 + 673 700 699 + 697 700 698 + 701 702 703 + 701 705 704 + 702 706 705 + 703 706 704 + 661 708 707 + 663 709 708 + 662 709 707 + 667 711 710 + 669 712 711 + 668 712 710 + 679 714 713 + 681 715 714 + 680 715 713 + 673 717 716 + 675 718 717 + 674 718 716 + 719 720 721 + 719 723 722 + 720 724 723 + 721 724 722 + 719 725 715 + 721 726 725 + 720 726 715 + 727 728 721 + 727 729 725 + 728 726 729 + 721 730 731 + 721 733 732 + 730 734 733 + 731 734 732 + 721 735 736 + 735 709 724 + 736 709 722 + 721 738 737 + 736 739 738 + 735 739 737 + 731 717 737 + 730 717 738 + 727 733 711 + 728 732 711 + 685 708 723 + 686 707 723 + 690 713 740 + 692 729 713 + 691 729 740 + 696 712 741 + 697 734 712 + 673 734 741 + 701 742 739 + 703 718 742 + 702 718 739 + 624 743 744 + 624 746 745 + 743 747 746 + 744 747 745 + 748 749 668 + 748 751 750 + 749 752 751 + 668 752 750 + 753 754 755 + 753 757 756 + 754 758 757 + 755 758 756 + 748 760 759 + 668 698 760 + 749 698 759 + 753 762 761 + 755 689 762 + 754 689 761 + 763 764 703 + 763 766 765 + 764 767 766 + 703 767 765 + 768 769 770 + 768 772 771 + 769 773 772 + 770 773 771 + 768 775 774 + 770 693 775 + 769 693 774 + 763 704 776 + 764 706 776 + 777 778 779 + 777 781 780 + 778 666 781 + 779 666 780 + 782 783 784 + 782 786 785 + 783 670 786 + 784 670 785 + 777 788 787 + 779 705 788 + 778 705 787 + 782 790 789 + 784 695 790 + 783 695 789 + 791 673 792 + 791 677 793 + 792 676 793 + 794 681 795 + 794 682 796 + 795 684 796 + 794 798 797 + 795 688 798 + 681 688 797 + 791 799 699 + 792 700 799 + 800 801 802 + 800 804 803 + 801 758 804 + 802 758 803 + 805 806 807 + 805 809 808 + 806 752 809 + 807 752 808 + 805 811 810 + 807 672 811 + 806 672 810 + 800 813 812 + 802 665 813 + 801 665 812 + 814 703 815 + 814 765 816 + 815 767 816 + 817 770 818 + 817 771 819 + 818 773 819 + 814 821 820 + 815 678 821 + 703 678 820 + 817 823 822 + 818 683 823 + 770 683 822 + 502 824 653 + 501 824 654 + 648 657 825 + 647 656 825 + 597 826 827 + 597 760 699 + 826 828 760 + 827 828 699 + 829 830 831 + 829 774 832 + 830 833 774 + 831 833 832 + 753 834 835 + 834 836 761 + 835 836 762 + 837 659 838 + 837 839 766 + 659 840 839 + 838 840 766 + 829 652 841 + 829 842 772 + 652 843 842 + 841 843 772 + 782 844 845 + 844 846 785 + 845 846 786 + 777 847 848 + 847 849 780 + 848 849 781 + 753 850 851 + 850 852 756 + 851 852 757 + 853 746 854 + 853 855 751 + 746 856 855 + 854 856 751 + 857 858 859 + 857 796 860 + 858 861 796 + 859 861 860 + 862 863 864 + 862 793 865 + 863 866 793 + 864 866 865 + 800 867 868 + 867 869 803 + 868 869 804 + 805 870 871 + 870 872 808 + 871 872 809 + 873 874 825 + 873 816 875 + 874 876 816 + 825 876 875 + 782 877 878 + 877 833 789 + 878 833 790 + 777 879 880 + 879 881 787 + 880 881 788 + 800 882 883 + 882 849 812 + 883 849 813 + 805 884 885 + 884 846 810 + 885 846 811 + 873 886 887 + 873 888 821 + 886 866 888 + 887 866 821 + 889 890 891 + 889 892 819 + 890 893 892 + 891 893 819 + 894 895 874 + 894 896 816 + 895 876 896 + 897 898 870 + 897 899 808 + 898 872 899 + 900 901 867 + 900 902 803 + 901 869 902 + 903 904 858 + 903 823 796 + 904 861 823 + 905 885 844 + 905 811 785 + 906 887 863 + 906 821 793 + 907 883 847 + 907 813 780 + 908 841 909 + 908 772 892 + 909 843 892 + 910 851 911 + 910 757 902 + 911 852 902 + 912 854 913 + 912 751 899 + 913 856 899 + 914 838 915 + 914 766 896 + 915 840 896 + 916 917 918 + 916 799 759 + 917 828 799 + 918 828 759 + 919 880 920 + 919 788 776 + 920 881 776 + 921 878 830 + 921 790 774 + 922 923 834 + 922 798 761 + 923 836 798 + 528 755 661 + 528 756 924 + 661 758 924 + 568 663 925 + 568 664 926 + 925 666 926 + 588 667 691 + 588 671 927 + 691 670 927 + 528 687 762 + 578 925 778 + 578 926 781 + 553 691 783 + 553 927 786 + 605 703 674 + 605 820 677 + 517 770 679 + 517 822 682 + 578 787 928 + 925 705 928 + 553 789 694 + 542 661 801 + 542 924 804 + 589 668 806 + 589 750 809 + 589 810 671 + 542 812 664 + 529 681 685 + 529 797 687 + 597 696 668 + 604 925 701 + 604 928 704 + 552 690 770 + 552 694 775 + 588 929 710 + 691 711 929 + 568 930 708 + 925 709 930 + 517 714 931 + 770 713 931 + 605 716 742 + 561 691 727 + 561 740 725 + 561 733 929 + 569 925 736 + 569 932 738 + 925 739 932 + 569 722 930 + 560 681 719 + 560 933 722 + 681 723 933 + 560 725 714 + 596 673 730 + 596 741 733 + 596 738 716 + 529 708 933 + 597 710 741 + 604 742 932 + 552 931 740 + 542 868 934 + 934 869 924 + 589 871 935 + 935 872 750 + 513 936 859 + 504 937 936 + 515 937 859 + 626 938 826 + 631 827 938 + 540 939 868 + 539 934 939 + 621 744 871 + 623 935 744 + 626 935 743 + 505 940 653 + 504 940 824 + 632 941 938 + 634 827 941 + 525 942 835 + 516 943 942 + 527 943 835 + 612 879 944 + 611 945 879 + 614 945 944 + 595 710 733 + 567 722 708 + 559 740 714 + 603 716 932 + 853 748 626 + 626 750 855 + 829 768 505 + 505 771 842 + 837 763 614 + 614 765 839 + 505 775 832 + 857 516 794 + 516 682 860 + 862 634 791 + 634 677 865 + 873 642 814 + 642 765 875 + 642 820 888 + 898 913 747 + 747 856 872 + 909 655 890 + 655 893 843 + 901 911 946 + 946 852 869 + 895 915 660 + 660 840 876 + 947 909 651 + 947 890 654 + 948 657 895 + 948 658 915 + 949 744 898 + 949 745 913 + 950 939 901 + 950 951 911 + 939 946 951 + 743 872 855 + 940 893 771 + 653 893 842 + 656 876 839 + 952 946 850 + 952 869 756 + 528 934 952 + 537 952 939 + 537 850 951 + 748 918 826 + 853 938 918 + 527 797 762 + 943 836 797 + 551 789 775 + 611 704 787 + 945 881 704 + 549 831 877 + 549 832 789 + 763 920 945 + 837 944 920 + 639 820 865 + 515 822 860 + 937 861 822 + 575 926 812 + 587 810 927 + 794 943 923 + 857 923 942 + 862 917 941 + 791 827 917 + 647 839 875 + 953 504 817 + 953 824 891 + 817 940 891 + 817 937 904 + 953 904 936 + 640 888 865 + 640 864 886 + 585 810 786 + 585 845 884 + 576 848 882 + 576 781 812 + 0 1 2 3 + 0 5 8 4 + 1 6 9 5 + 2 6 10 7 + 3 7 11 4 + 8 9 10 11 + 8 13 16 12 + 9 14 17 13 + 10 14 18 15 + 11 15 19 12 + 16 17 18 19 + 2 20 21 22 + 20 23 25 6 + 21 23 26 24 + 22 24 27 7 + 10 25 26 27 + 25 28 30 14 + 26 28 31 29 + 27 29 32 15 + 18 30 31 32 + 21 33 34 35 + 33 36 38 23 + 34 36 39 37 + 35 37 40 24 + 26 38 39 40 + 38 41 43 28 + 39 41 44 42 + 40 42 45 29 + 31 43 44 45 + 34 46 47 48 + 46 49 51 36 + 47 49 52 50 + 48 50 53 37 + 39 51 52 53 + 51 54 56 41 + 52 54 57 55 + 53 55 58 42 + 44 56 57 58 + 59 60 61 1 + 59 62 64 5 + 60 63 65 62 + 61 63 66 6 + 64 65 66 9 + 64 67 69 13 + 65 68 70 67 + 66 68 71 14 + 69 70 71 17 + 61 72 73 20 + 72 74 75 63 + 73 74 76 23 + 66 75 76 25 + 75 77 78 68 + 76 77 79 28 + 71 78 79 30 + 73 80 81 33 + 80 82 83 74 + 81 82 84 36 + 76 83 84 38 + 83 85 86 77 + 84 85 87 41 + 79 86 87 43 + 81 88 89 46 + 88 90 91 82 + 89 90 92 49 + 84 91 92 51 + 91 93 94 85 + 92 93 95 54 + 87 94 95 56 + 96 97 98 60 + 96 99 101 62 + 97 100 102 99 + 98 100 103 63 + 101 102 103 65 + 101 104 106 67 + 102 105 107 104 + 103 105 108 68 + 106 107 108 70 + 98 109 110 72 + 109 111 112 100 + 110 111 113 74 + 103 112 113 75 + 112 114 115 105 + 113 114 116 77 + 108 115 116 78 + 110 117 118 80 + 117 119 120 111 + 118 119 121 82 + 113 120 121 83 + 120 122 123 114 + 121 122 124 85 + 116 123 124 86 + 118 125 126 88 + 125 127 128 119 + 126 127 129 90 + 121 128 129 91 + 128 130 131 122 + 129 130 132 93 + 124 131 132 94 + 133 134 135 97 + 133 136 138 99 + 134 137 139 136 + 135 137 140 100 + 138 139 140 102 + 138 141 143 104 + 139 142 144 141 + 140 142 145 105 + 143 144 145 107 + 135 146 147 109 + 146 148 149 137 + 147 148 150 111 + 140 149 150 112 + 149 151 152 142 + 150 151 153 114 + 145 152 153 115 + 147 154 155 117 + 154 156 157 148 + 155 156 158 119 + 150 157 158 120 + 157 159 160 151 + 158 159 161 122 + 153 160 161 123 + 155 162 163 125 + 162 164 165 156 + 163 164 166 127 + 158 165 166 128 + 165 167 168 159 + 166 167 169 130 + 161 168 169 131 + 489 490 170 491 + 490 329 494 493 + 491 328 494 492 + 490 423 497 496 + 494 467 497 495 + 498 499 489 500 + 499 493 503 502 + 500 492 503 501 + 499 496 506 505 + 503 495 506 504 + 507 494 486 508 + 508 481 497 509 + 497 426 512 511 + 508 466 512 510 + 513 503 507 514 + 514 509 506 515 + 506 511 518 517 + 514 510 518 516 + 519 508 485 520 + 520 476 512 521 + 512 432 524 523 + 520 456 524 522 + 525 514 519 526 + 526 521 518 527 + 518 523 530 529 + 526 522 530 528 + 531 520 254 532 + 532 455 524 533 + 534 532 454 535 + 535 429 524 536 + 537 526 531 538 + 538 533 530 539 + 540 538 534 541 + 541 536 530 542 + 543 544 479 490 + 544 477 497 545 + 544 425 548 547 + 497 433 548 546 + 549 550 543 499 + 550 545 506 551 + 550 547 554 553 + 506 546 554 552 + 512 464 548 555 + 548 436 558 557 + 512 440 558 556 + 518 555 554 559 + 554 557 562 561 + 518 556 562 560 + 524 461 558 563 + 558 442 566 565 + 524 421 566 564 + 530 563 562 567 + 562 565 570 569 + 530 564 570 568 + 535 483 566 571 + 572 535 487 573 + 573 424 566 574 + 541 571 570 575 + 576 541 572 577 + 577 574 570 578 + 579 580 488 544 + 580 484 548 581 + 580 430 584 583 + 548 419 584 582 + 585 586 579 550 + 586 581 554 587 + 586 583 590 589 + 554 582 590 588 + 558 462 584 591 + 584 431 594 593 + 558 438 594 592 + 562 591 590 595 + 590 593 598 597 + 562 592 598 596 + 566 463 594 599 + 594 331 602 601 + 566 434 602 600 + 570 599 598 603 + 598 601 606 605 + 570 600 606 604 + 573 478 602 607 + 608 573 480 609 + 609 465 602 610 + 577 607 606 611 + 612 577 608 613 + 613 610 606 614 + 615 616 451 580 + 616 452 584 617 + 618 619 475 616 + 619 416 584 620 + 621 622 615 586 + 622 617 590 623 + 624 625 618 622 + 625 620 590 626 + 619 458 594 627 + 628 629 457 619 + 629 445 594 630 + 625 627 598 631 + 632 633 628 625 + 633 630 598 634 + 629 446 602 635 + 636 637 448 629 + 637 449 602 638 + 633 635 606 639 + 640 641 636 633 + 641 638 606 642 + 643 609 326 637 + 644 645 325 637 + 645 176 609 646 + 647 613 643 641 + 648 649 644 641 + 649 646 613 650 + 769 908 889 818 + 680 818 903 795 + 686 795 922 754 + 802 754 910 900 + 784 921 769 692 + 728 692 680 720 + 735 720 686 662 + 779 662 802 907 + 807 905 784 669 + 697 669 728 731 + 675 731 735 702 + 764 702 779 919 + 912 897 807 749 + 916 749 697 792 + 906 792 675 815 + 894 815 764 914 + 908 955 958 954 + 769 956 959 955 + 818 956 960 957 + 889 957 961 954 + 958 959 960 961 + 958 963 966 962 + 959 964 967 963 + 960 964 968 965 + 961 965 969 962 + 966 967 968 969 + 680 970 972 956 + 795 970 973 971 + 903 971 974 957 + 960 972 973 974 + 972 975 977 964 + 973 975 978 976 + 974 976 979 965 + 968 977 978 979 + 686 980 982 970 + 754 980 983 981 + 922 981 984 971 + 973 982 983 984 + 982 985 987 975 + 983 985 988 986 + 984 986 989 976 + 978 987 988 989 + 802 990 992 980 + 900 990 993 991 + 910 991 994 981 + 983 992 993 994 + 992 995 997 985 + 993 995 998 996 + 994 996 999 986 + 988 997 998 999 + 921 1000 1002 955 + 784 1001 1003 1000 + 692 1001 1004 956 + 1002 1003 1004 959 + 1002 1005 1007 963 + 1003 1006 1008 1005 + 1004 1006 1009 964 + 1007 1008 1009 967 + 728 1010 1011 1001 + 720 1010 1012 970 + 1004 1011 1012 972 + 1011 1013 1014 1006 + 1012 1013 1015 975 + 1009 1014 1015 977 + 735 1016 1017 1010 + 662 1016 1018 980 + 1012 1017 1018 982 + 1017 1019 1020 1013 + 1018 1019 1021 985 + 1015 1020 1021 987 + 779 1022 1023 1016 + 907 1022 1024 990 + 1018 1023 1024 992 + 1023 1025 1026 1019 + 1024 1025 1027 995 + 1021 1026 1027 997 + 905 1028 1030 1000 + 807 1029 1031 1028 + 669 1029 1032 1001 + 1030 1031 1032 1003 + 1030 1033 1035 1005 + 1031 1034 1036 1033 + 1032 1034 1037 1006 + 1035 1036 1037 1008 + 697 1038 1039 1029 + 731 1038 1040 1010 + 1032 1039 1040 1011 + 1039 1041 1042 1034 + 1040 1041 1043 1013 + 1037 1042 1043 1014 + 675 1044 1045 1038 + 702 1044 1046 1016 + 1040 1045 1046 1017 + 1045 1047 1048 1041 + 1046 1047 1049 1019 + 1043 1048 1049 1020 + 764 1050 1051 1044 + 919 1050 1052 1022 + 1046 1051 1052 1023 + 1051 1053 1054 1047 + 1052 1053 1055 1025 + 1049 1054 1055 1026 + 897 1056 1058 1028 + 912 1057 1059 1056 + 749 1057 1060 1029 + 1058 1059 1060 1031 + 1058 1061 1063 1033 + 1059 1062 1064 1061 + 1060 1062 1065 1034 + 1063 1064 1065 1036 + 916 1066 1067 1057 + 792 1066 1068 1038 + 1060 1067 1068 1039 + 1067 1069 1070 1062 + 1068 1069 1071 1041 + 1065 1070 1071 1042 + 906 1072 1073 1066 + 815 1072 1074 1044 + 1068 1073 1074 1045 + 1073 1075 1076 1069 + 1074 1075 1077 1047 + 1071 1076 1077 1048 + 894 1078 1079 1072 + 914 1078 1080 1050 + 1074 1079 1080 1051 + 1079 1081 1082 1075 + 1080 1081 1083 1053 + 1077 1082 1083 1054 + + + 0 1 2 3 4 5 + 5 6 7 8 9 10 + 11 3 12 13 14 15 + 15 8 16 17 18 19 + 20 13 21 22 23 24 + 24 17 25 26 27 28 + 29 22 30 31 32 33 + 33 26 34 35 36 37 + 38 39 40 41 2 42 + 42 43 44 45 7 46 + 47 41 48 49 12 50 + 50 45 51 52 16 53 + 54 49 55 56 21 57 + 57 52 58 59 25 60 + 61 56 62 63 30 64 + 64 59 65 66 34 67 + 68 69 70 71 40 72 + 72 73 74 75 44 76 + 77 71 78 79 48 80 + 80 75 81 82 51 83 + 84 79 85 86 55 87 + 87 82 88 89 58 90 + 91 86 92 93 62 94 + 94 89 95 96 65 97 + 98 99 100 101 70 102 + 102 103 104 105 74 106 + 107 101 108 109 78 110 + 110 105 111 112 81 113 + 114 109 115 116 85 117 + 117 112 118 119 88 120 + 121 116 122 123 92 124 + 124 119 125 126 95 127 + 1224 1240 1241 1242 1243 1244 + 1244 1245 1246 1247 1248 1249 + 1225 1242 1250 1251 1252 1253 + 1253 1247 1254 1255 1256 1257 + 1226 1251 1258 1259 1260 1261 + 1261 1255 1262 1263 1264 1265 + 1227 1259 1266 1267 1268 1269 + 1269 1263 1270 1271 1272 1273 + 1228 1274 1275 1276 1241 1277 + 1277 1278 1279 1280 1246 1281 + 1229 1276 1282 1283 1250 1284 + 1284 1280 1285 1286 1254 1287 + 1230 1283 1288 1289 1258 1290 + 1290 1286 1291 1292 1262 1293 + 1231 1289 1294 1295 1266 1296 + 1296 1292 1297 1298 1270 1299 + 1232 1300 1301 1302 1275 1303 + 1303 1304 1305 1306 1279 1307 + 1233 1302 1308 1309 1282 1310 + 1310 1306 1311 1312 1285 1313 + 1234 1309 1314 1315 1288 1316 + 1316 1312 1317 1318 1291 1319 + 1235 1315 1320 1321 1294 1322 + 1322 1318 1323 1324 1297 1325 + 1236 1326 1327 1328 1301 1329 + 1329 1330 1331 1332 1305 1333 + 1237 1328 1334 1335 1308 1336 + 1336 1332 1337 1338 1311 1339 + 1238 1335 1340 1341 1314 1342 + 1342 1338 1343 1344 1317 1345 + 1239 1341 1346 1347 1320 1348 + 1348 1344 1349 1350 1323 1351 +

10 410 223 287 382

+

19 296 149 264 400

+

28 266 157 235 421

+

37 225 274 385 404

+

46 419 259 161 233

+

53 210 192 188 174

+

60 181 201 168 205

+

67 137 248 394 282

+

76 402 285 141 252

+

83 171 208 194 203

+

90 185 177 213 198

+

97 165 244 423 256

+

106 388 407 231 278

+

113 238 416 269 153

+

120 261 396 293 145

+

127 291 391 413 241

+

1224 891 1042 1020 942

+

1225 802 947 1033 917

+

1226 806 919 1063 884

+

1227 926 877 1045 1030

+

1228 910 1061 895 811

+

1229 841 859 828 838

+

1230 847 834 857 822

+

1231 901 790 935 1040

+

1232 932 1036 905 795

+

1233 862 824 855 845

+

1234 830 852 851 866

+

1235 897 818 907 1058

+

1236 1048 1027 930 873

+

1237 1054 881 815 922

+

1238 1038 914 799 944

+

1239 1024 939 887 1051

+ 604 605 606 302 607 + 606 608 609 590 610 + 611 612 613 605 614 + 613 615 616 608 617 + 618 619 610 595 620 + 620 621 622 575 623 + 624 625 617 619 626 + 626 627 628 621 629 + 630 631 623 586 632 + 632 633 634 560 635 + 636 637 629 631 638 + 638 639 640 633 641 + 642 643 635 502 644 + 645 646 644 499 647 + 648 649 641 643 650 + 651 652 650 646 653 + 654 655 656 571 609 + 656 657 658 565 659 + 660 661 662 655 616 + 662 663 664 657 665 + 622 666 659 518 667 + 667 668 669 514 670 + 628 671 665 666 672 + 672 673 674 668 675 + 634 676 670 517 677 + 677 678 679 508 680 + 640 681 675 676 682 + 682 683 684 678 685 + 647 686 680 580 687 + 688 689 687 598 690 + 653 691 685 686 692 + 693 694 692 689 695 + 696 697 698 603 658 + 698 699 700 582 701 + 702 703 704 697 664 + 704 705 706 699 707 + 669 708 701 510 709 + 709 710 711 516 712 + 674 713 707 708 714 + 714 715 716 710 717 + 679 718 712 512 719 + 719 720 721 519 722 + 684 723 717 718 724 + 724 725 726 720 727 + 690 728 722 567 729 + 730 731 729 574 732 + 695 733 727 728 734 + 735 736 734 731 737 + 738 739 740 496 700 + 741 742 743 559 740 + 744 745 746 739 706 + 747 748 749 742 746 + 743 750 751 564 711 + 752 753 754 504 751 + 749 755 756 750 716 + 757 758 759 753 756 + 754 760 761 490 721 + 762 763 764 493 761 + 759 765 766 760 726 + 767 768 769 763 766 + 770 771 732 591 764 + 772 773 774 299 770 + 775 776 737 771 769 + 777 778 779 773 775 + 128 129 130 131 + 132 133 134 135 + 136 137 138 139 + 140 141 142 143 + 144 145 146 147 + 148 149 150 151 + 152 153 154 155 + 156 157 158 159 + 160 161 162 163 + 164 165 166 167 + 136 168 169 170 + 140 171 172 173 + 148 174 175 176 + 144 177 178 179 + 180 181 182 183 + 184 185 186 187 + 180 188 189 190 + 191 192 193 189 + 184 194 195 196 + 197 198 199 200 + 197 201 202 169 + 191 203 196 204 + 156 205 206 207 + 152 208 173 209 + 160 210 211 212 + 164 213 214 215 + 216 217 218 219 + 220 221 222 223 + 224 225 226 227 + 228 229 230 231 + 220 232 233 234 + 224 235 159 236 + 228 237 238 239 + 240 241 242 243 + 240 244 167 245 + 246 247 248 249 + 250 251 252 253 + 246 254 255 256 + 250 257 258 259 + 260 261 147 262 + 263 264 151 265 + 263 266 267 268 + 260 269 270 271 + 272 273 274 275 + 276 277 278 279 + 272 280 281 282 + 276 283 284 285 + 286 287 288 289 + 290 291 243 292 + 290 293 294 295 + 286 296 297 298 + 299 300 301 132 + 302 129 303 304 + 305 306 307 308 + 309 232 310 311 + 312 313 314 315 + 316 317 318 319 + 320 237 321 322 + 323 221 324 325 + 326 327 328 329 + 330 251 331 332 + 333 247 334 335 + 336 337 338 339 + 340 229 341 342 + 343 344 345 346 + 347 273 348 349 + 350 277 351 352 + 353 354 355 356 + 357 358 359 360 + 361 257 362 363 + 364 254 365 366 + 367 280 368 369 + 370 283 371 372 + 373 374 375 376 + 377 378 379 380 + 381 382 360 383 + 384 385 349 386 + 387 388 352 389 + 390 391 356 392 + 393 394 335 368 + 395 396 397 398 + 399 400 346 375 + 401 402 332 371 + 403 404 405 338 + 406 407 408 341 + 409 410 411 324 + 412 413 414 328 + 415 416 322 417 + 418 419 311 362 + 420 421 319 379 + 422 423 315 365 + 424 230 425 426 + 427 428 143 429 + 430 431 432 138 + 424 239 155 433 + 434 222 435 288 + 436 249 139 437 + 438 253 428 439 + 440 146 295 306 + 441 298 442 150 + 438 258 443 444 + 436 255 445 446 + 434 234 163 447 + 448 275 227 449 + 450 279 426 451 + 448 281 452 431 + 450 284 453 142 + 454 154 271 455 + 456 268 457 158 + 458 162 444 459 + 460 446 461 166 + 427 462 463 172 + 430 206 170 464 + 441 211 176 465 + 440 179 466 214 + 467 468 469 193 + 467 462 204 470 + 471 195 472 473 + 471 187 474 178 + 475 476 477 182 + 475 175 190 478 + 479 183 480 202 + 479 186 200 481 + 454 209 482 472 + 456 476 207 483 + 458 212 484 468 + 460 199 215 485 + 486 449 487 348 + 488 451 489 351 + 490 491 305 492 + 493 494 492 495 + 496 497 488 498 + 499 500 486 501 + 502 216 501 503 + 504 505 506 507 + 508 509 464 480 + 510 470 511 463 + 512 481 513 474 + 514 515 478 469 + 516 511 473 482 + 517 483 509 477 + 518 465 515 484 + 519 513 485 466 + 520 337 521 226 + 520 317 236 522 + 523 327 524 242 + 523 313 245 525 + 526 344 265 527 + 526 378 528 267 + 529 358 289 530 + 531 354 292 532 + 529 374 533 297 + 534 389 535 408 + 536 411 383 537 + 538 386 539 405 + 540 392 541 414 + 542 543 131 536 + 544 545 540 134 + 546 547 538 218 + 548 549 534 550 + 503 521 551 487 + 219 551 339 539 + 135 552 329 541 + 130 325 537 553 + 554 555 342 535 + 556 425 555 489 + 557 558 550 554 + 559 557 498 556 + 560 561 522 457 + 506 562 563 321 + 564 433 455 562 + 565 566 459 443 + 567 445 568 461 + 569 570 363 310 + 571 570 447 566 + 572 573 366 314 + 574 573 525 568 + 575 576 527 442 + 577 578 579 491 + 579 262 308 397 + 580 452 581 432 + 582 583 429 453 + 584 585 380 318 + 586 585 561 528 + 587 270 417 563 + 577 588 507 587 + 304 589 553 359 + 590 589 530 435 + 591 592 532 524 + 301 592 552 355 + 531 593 495 594 + 594 294 398 307 + 595 596 576 533 + 597 596 376 345 + 598 599 437 581 + 600 599 369 334 + 601 602 372 331 + 603 602 439 583 + 780 781 782 783 + 784 785 786 787 + 788 789 790 791 + 792 793 794 795 + 796 797 798 799 + 800 801 802 803 + 804 805 806 807 + 808 809 810 811 + 812 813 814 815 + 816 817 818 819 + 788 820 821 822 + 792 823 824 825 + 800 826 827 828 + 796 829 830 831 + 832 833 834 835 + 832 836 837 838 + 839 840 841 837 + 842 843 844 845 + 846 835 847 848 + 846 849 850 851 + 842 849 852 853 + 839 854 843 855 + 804 856 820 857 + 808 858 859 860 + 812 861 862 863 + 816 864 865 866 + 867 868 869 870 + 871 872 873 874 + 875 876 877 878 + 871 879 880 881 + 875 882 883 884 + 885 886 887 888 + 889 890 891 892 + 889 893 894 895 + 885 896 819 897 + 898 899 900 901 + 902 903 904 905 + 898 906 907 908 + 902 909 910 911 + 912 913 797 914 + 915 916 803 917 + 915 918 919 920 + 912 921 922 814 + 923 924 925 926 + 927 928 929 930 + 927 931 932 933 + 923 934 935 936 + 937 938 888 939 + 940 941 892 942 + 937 943 944 945 + 940 946 947 948 + 612 781 949 950 + 778 951 784 952 + 953 954 955 956 + 957 958 959 960 + 961 882 962 963 + 964 965 966 967 + 968 969 970 971 + 972 903 973 974 + 975 899 976 977 + 978 876 979 980 + 981 982 983 984 + 985 986 987 988 + 989 990 991 992 + 993 924 994 995 + 996 928 997 998 + 999 1000 1001 1002 + 1003 909 1004 1005 + 1006 906 1007 1008 + 1009 934 1010 1011 + 1012 931 1013 1014 + 1015 1016 1017 1018 + 1019 1020 1021 1022 + 1023 1024 1025 1001 + 1026 1027 1028 997 + 1029 1030 1031 994 + 1032 1033 1034 987 + 1035 1036 1014 973 + 1037 1038 1018 991 + 1039 1040 1011 976 + 1041 1042 971 1043 + 1044 1045 980 1046 + 1047 1048 984 1049 + 1050 1051 967 1052 + 1053 1054 1055 1056 + 1057 1058 1008 1059 + 1060 1061 1005 959 + 1062 1063 1064 962 + 1065 1066 878 1067 + 1068 1069 791 1070 + 1071 1072 793 1073 + 1065 1074 807 883 + 1075 1076 1070 900 + 1077 1078 1073 904 + 1079 1080 945 798 + 1081 1082 948 801 + 1075 1083 908 1084 + 1077 1085 911 810 + 1086 1087 1067 925 + 1088 1089 874 929 + 1088 1090 933 794 + 1086 1091 936 789 + 1092 1093 920 805 + 1094 954 813 880 + 1095 1096 1084 817 + 1097 1098 809 894 + 1071 1099 1100 823 + 1068 1101 1102 821 + 1081 1103 826 1104 + 1079 1105 831 865 + 1106 1107 860 840 + 1106 1108 854 1100 + 1109 1110 1111 850 + 1109 1112 848 1102 + 1113 1114 1115 833 + 1113 1116 836 827 + 1117 1118 863 844 + 1117 1119 853 829 + 1092 1120 856 1115 + 1094 1121 825 861 + 1095 1122 864 1111 + 1097 1123 1104 858 + 1124 1087 995 1125 + 1126 1089 998 1127 + 625 1128 1129 1130 + 755 1131 1132 953 + 652 1133 1134 1124 + 745 1135 1136 1126 + 748 867 1137 1136 + 615 949 1138 1139 + 758 1140 1141 1132 + 637 1142 1143 1144 + 736 1145 1146 1147 + 713 1108 1099 1148 + 683 1149 1112 1101 + 715 1148 1121 1118 + 673 1150 1107 1116 + 681 1120 1114 1149 + 723 1110 1119 1151 + 671 1103 1123 1150 + 725 1151 1105 1122 + 1152 982 872 1153 + 1154 969 890 1155 + 1156 965 886 1157 + 1154 958 1158 893 + 1159 986 1160 916 + 1161 990 1162 913 + 1163 1000 1164 938 + 1163 1016 943 1165 + 1166 1028 1049 1167 + 1168 1043 1169 1021 + 1170 1031 1046 1171 + 1172 1025 1052 1173 + 1174 1175 1168 782 + 1176 1177 787 1172 + 1178 1179 870 1166 + 1180 1181 1182 1170 + 1137 1153 1127 1183 + 869 1183 1167 983 + 1138 1155 1184 1185 + 783 970 1185 1169 + 786 1186 1173 966 + 1187 1188 1171 979 + 1189 1066 1125 1188 + 1190 1191 1187 1182 + 649 1190 1189 1134 + 1192 879 1056 955 + 1152 1193 1131 1192 + 639 1194 1093 1074 + 1144 1194 963 1195 + 663 1196 1085 1098 + 1146 1197 1198 1007 + 733 1083 1096 1197 + 1199 1200 960 1004 + 661 1200 1196 1158 + 1201 896 1059 1198 + 1156 1202 1147 1201 + 765 1162 1203 1080 + 627 1204 1082 1160 + 1130 1204 988 1205 + 691 1091 1069 1206 + 705 1207 1090 1072 + 1208 918 1195 1064 + 1159 1209 1208 1143 + 1161 1210 1211 1141 + 1211 921 956 1055 + 776 1212 1157 1164 + 952 1212 1002 1186 + 1213 1214 1139 1215 + 1215 941 1022 1184 + 1216 946 1205 1034 + 1213 1217 1216 1129 + 768 1218 1165 1203 + 1219 1218 992 1017 + 703 1220 1207 1078 + 1221 1220 974 1013 + 1222 1223 977 1010 + 694 1223 1206 1076 +
+ + -5.00000000e-01 1.00000000e+00 2.00000000e-01 -7.50000000e-01 1.00000000e+00 2.00000000e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 + -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 + -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.09737465e-01 7.67979309e-01 2.14852365e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -7.78681422e-01 7.97121596e-01 1.57212989e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 + -1.00000000e+00 1.00000000e+00 2.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 + -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 7.50000000e-01 2.00000000e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 + -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -4.84513376e-01 7.88613759e-01 -2.47734269e-02 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 + -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -7.50000000e-01 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 + -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -7.30225254e-01 7.83182848e-01 -4.97444001e-02 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 + -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -1.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 7.50000000e-01 -5.31234778e-13 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -5.49002019e-01 2.94878361e-01 2.22905724e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -7.11589479e-01 4.73335261e-01 2.49885800e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -7.81530511e-01 2.79380115e-01 2.11246802e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 + -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 + -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.50000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 + -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.71056834e-01 2.61828242e-01 -6.29466438e-03 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 + -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -7.83353594e-01 5.17147107e-01 -3.99209592e-02 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 + -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -7.67432407e-01 2.08191458e-01 2.61816764e-03 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 + -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 2.50000000e-01 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.39119198e-01 -2.18069642e-01 1.93502074e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -7.08701747e-01 4.85548346e-02 1.58550948e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -7.83341325e-01 -2.60070362e-01 1.68185936e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 + -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 + -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -2.50000000e-01 2.00000000e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 + -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -4.78043847e-01 -2.07629733e-01 4.50886922e-02 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 + -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -7.40704078e-01 3.39288150e-02 -3.48449259e-02 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 + -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -7.98649990e-01 -2.91977690e-01 3.76771938e-02 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 + -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -2.50000000e-01 -5.31234778e-13 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.98466940e-01 -7.73475031e-01 1.66920868e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -7.56224055e-01 -4.89237272e-01 2.39317721e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 + -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -7.32136997e-01 -7.68847575e-01 2.25254060e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 + -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -7.50000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 + -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 + -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -7.50000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 + -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.79675664e-01 -7.95380719e-01 -4.19450610e-02 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 + -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -7.39628005e-01 -5.05700884e-01 1.87812797e-02 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 + -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -7.38622456e-01 -7.20629057e-01 2.58153547e-02 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 + -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -1.00000000e+00 -7.50000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 + -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -1.00000000e+00 -1.00000000e+00 -1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -7.50000000e-01 -1.00000000e+00 -5.31234778e-13 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 + -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 -1.00000000e+00 -1.00000000e+00 -4.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -7.50000000e-01 -2.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -8.75000000e-01 -3.00000000e-01 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -1.00000000e+00 -4.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 8.75000000e-01 -1.00000000e+00 -3.00000000e-01 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 + 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 7.56483320e-01 -7.26132381e-01 -2.14701945e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 7.50000000e-01 -1.00000000e+00 -2.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 1.00000000e+00 -2.75279799e-12 -4.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 + 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 1.00000000e+00 -1.25000000e-01 -3.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 1.00000000e+00 -2.50000000e-01 -2.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 1.00000000e+00 2.50000000e-01 -2.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 1.00000000e+00 1.25000000e-01 -3.00000000e-01 1.00000000e+00 2.50000000e-01 -4.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 7.94944168e-01 2.92358944e-01 -1.63669585e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 7.39298995e-01 1.55739606e-02 -2.39746917e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 2.65193359e-01 -7.92393562e-01 -1.72384452e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -2.21100213e-01 -2.43016960e-01 -1.67879521e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 -1.04563744e-01 -3.61871620e-01 -2.40774353e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -3.13512953e-02 -2.10861610e-01 -2.14981457e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 1.73721039e-01 -4.08463583e-01 -2.45647782e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 + -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 -2.22977063e-01 -5.36870853e-01 -1.64641576e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -1.45052688e-01 -6.47041747e-01 -3.04023342e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 -9.44557460e-03 -7.85213296e-01 -1.62867646e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 1.55742707e-01 -6.61512446e-01 -3.85684693e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 + 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 2.18684050e-01 -4.94833636e-01 -2.33971621e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 2.21203398e-02 -5.21803958e-01 -3.94111106e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 + 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 9.08318818e-01 -7.87317970e-01 -2.91492849e-01 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 + 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 8.66567845e-01 -9.10133041e-01 -4.03891725e-01 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 + 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 6.43275542e-01 -7.40778770e-01 -3.05336119e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 8.75000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 7.37605445e-01 -8.93310935e-01 -4.14129112e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 6.25000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 6.25000000e-01 -1.00000000e+00 -3.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 -1.00000000e+00 -3.75000000e-01 -3.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -1.00000000e+00 -3.75000000e-01 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 + -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 -9.05637358e-01 -2.98827051e-01 -4.64781721e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 + -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 -1.00000000e+00 -1.25000000e-01 -5.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 + -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 -1.00000000e+00 -1.25000000e-01 -3.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -1.00000000e+00 -2.50000000e-01 -2.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -1.00000000e+00 2.50000000e-01 -2.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -7.94536143e-01 -2.68885321e-01 -1.66434791e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -7.12930596e-01 3.88167636e-02 -1.73466694e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -8.44982441e-01 1.39476319e-01 -3.57473627e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + -1.00000000e+00 2.50000000e-01 -4.00000000e-01 -1.00000000e+00 1.25000000e-01 -3.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 -8.99788703e-01 -1.51290305e-01 -3.62214191e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -1.00000000e+00 2.75279799e-12 -4.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -8.75000000e-01 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 + 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 8.70128598e-01 -7.71109545e-01 -4.56909981e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 1.00000000e+00 -6.25000000e-01 -3.00000000e-01 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 1.00000000e+00 -6.25000000e-01 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 + -2.50000000e-01 1.00000000e+00 -4.00000000e-01 -3.75000000e-01 1.00000000e+00 -3.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -2.50000000e-01 1.00000000e+00 -4.00000000e-01 -3.75000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -2.07202930e-01 8.40581579e-01 -4.63741255e-01 -2.50000000e-01 1.00000000e+00 -4.00000000e-01 + -2.50000000e-01 1.00000000e+00 -4.00000000e-01 -1.25000000e-01 1.00000000e+00 -5.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 + -2.50000000e-01 1.00000000e+00 -4.00000000e-01 -1.25000000e-01 1.00000000e+00 -3.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 + 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 3.75000000e-01 -1.00000000e+00 -3.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 3.75000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 2.05405232e-01 -9.05212150e-01 -4.22345879e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 + 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 1.25000000e-01 -1.00000000e+00 -5.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 + 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 1.25000000e-01 -1.00000000e+00 -3.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 + 4.93990198e-01 1.96586961e-02 -2.00936210e-01 7.78082039e-01 -8.69006607e-02 -2.85786131e-01 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 1.00000000e+00 -1.25000000e-01 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 + 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 8.86034502e-01 -2.57631946e-01 -4.45623957e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 + 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 1.00000000e+00 -3.75000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 1.00000000e+00 -3.75000000e-01 -3.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + -1.00000000e+00 2.50000000e-01 -4.00000000e-01 -1.00000000e+00 1.25000000e-01 -5.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 + -1.00000000e+00 2.50000000e-01 -4.00000000e-01 -8.60143449e-01 2.47528095e-01 -4.30263532e-01 -7.60981297e-01 2.83096054e-01 -4.53794791e-01 + -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -1.00000000e+00 3.75000000e-01 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -4.00000000e-01 + -1.00000000e+00 2.50000000e-01 -4.00000000e-01 -1.00000000e+00 3.75000000e-01 -3.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -1.00000000e+00 5.00000000e-01 -2.00000000e-01 -7.24152013e-01 2.00649807e-01 -2.38729769e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -7.04899767e-01 4.70385201e-01 -2.10375257e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -9.03785662e-01 3.42062288e-01 -3.77438268e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -1.00000000e+00 5.00000000e-01 -4.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 2.50000000e-01 1.00000000e+00 -4.00000000e-01 1.25000000e-01 1.00000000e+00 -3.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 + 2.75279799e-12 1.00000000e+00 -6.00000000e-01 1.25000000e-01 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -4.00000000e-01 + 2.50000000e-01 1.00000000e+00 -4.00000000e-01 2.43877563e-01 8.78312717e-01 -4.42839711e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + 2.50000000e-01 1.00000000e+00 -4.00000000e-01 3.75000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 + 2.50000000e-01 1.00000000e+00 -4.00000000e-01 3.75000000e-01 1.00000000e+00 -3.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 + 5.00000000e-01 1.00000000e+00 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -4.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 -1.25000000e-01 -1.00000000e+00 -3.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 + -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 -1.25000000e-01 -1.00000000e+00 -5.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 + -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 -2.33586216e-01 -8.51377197e-01 -4.03355688e-01 -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 + -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -3.75000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -3.75000000e-01 -1.00000000e+00 -3.00000000e-01 -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 + 1.00000000e+00 2.50000000e-01 -4.00000000e-01 1.00000000e+00 3.75000000e-01 -3.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 5.00000000e-01 -6.00000000e-01 1.00000000e+00 3.75000000e-01 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -4.00000000e-01 + 1.00000000e+00 2.50000000e-01 -4.00000000e-01 1.00000000e+00 1.25000000e-01 -5.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 + 7.31572411e-01 2.07606548e-01 -4.59504821e-01 9.19150190e-01 2.37216883e-01 -4.57497205e-01 1.00000000e+00 2.50000000e-01 -4.00000000e-01 + 1.00000000e+00 2.50000000e-01 -4.00000000e-01 7.13524808e-01 1.53850957e-01 -2.82017554e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 7.74866743e-01 4.08288751e-01 -2.65520525e-01 1.00000000e+00 2.50000000e-01 -4.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -7.23830262e-01 -5.10947776e-01 -2.04324878e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -8.29703929e-01 -3.57328299e-01 -3.67601505e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 + -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 -8.30652517e-01 -6.73877375e-01 -3.51562377e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -1.00000000e+00 -5.00000000e-01 -4.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -1.00000000e+00 -6.25000000e-01 -3.00000000e-01 -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -7.19737040e-01 -7.37267268e-01 -1.68057480e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -1.00000000e+00 -7.50000000e-01 -2.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 7.94545669e-01 5.15331880e-01 -1.50795761e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 7.58754489e-01 7.58424515e-01 -4.31851638e-01 8.96911794e-01 6.11353850e-01 -3.79780400e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 5.00000000e-01 -2.00000000e-01 1.00000000e+00 5.00000000e-01 -4.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 + 1.00000000e+00 5.00000000e-01 -2.00000000e-01 1.00000000e+00 6.25000000e-01 -3.00000000e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 + 5.00000000e-01 1.00000000e+00 -2.00000000e-01 7.34916653e-01 7.05552036e-01 -1.88958584e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 5.00000000e-01 -2.00000000e-01 1.00000000e+00 7.50000000e-01 -2.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 + -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 2.50000000e-01 -1.00000000e+00 -2.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 5.36834601e-01 -7.39180893e-01 -1.78471564e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 4.03247957e-01 -9.16347904e-01 -3.51621441e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 6.01817794e-01 -9.13994419e-01 -3.43508256e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.65647435e-01 -7.30484621e-01 -4.00470720e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 5.00000000e-01 -1.00000000e+00 -4.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -2.50000000e-01 1.00000000e+00 -2.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + 3.63854332e-02 4.76218270e-01 -2.16523681e-01 -2.00554723e-01 7.20919671e-01 -2.28707058e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -7.50000000e-01 1.00000000e+00 -2.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 1.00000000e+00 -2.00000000e-01 -4.70185252e-01 7.09785934e-01 -1.98354831e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -6.25000000e-01 1.00000000e+00 -3.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -3.76962693e-01 9.22628987e-01 -3.76756448e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -6.22734218e-01 8.83360200e-01 -3.46947745e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -4.63100770e-01 7.49540541e-01 -3.68403048e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -5.00000000e-01 1.00000000e+00 -4.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -2.50000000e-01 -1.00000000e+00 -2.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 + -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -2.07140846e-01 -7.92509484e-01 -2.24986267e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 + -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 -1.51612638e-01 -8.33618654e-01 -2.96406331e-01 -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 + -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 1.12582796e-01 -9.07068655e-01 -3.83335460e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 3.17309013e-02 -7.26225246e-01 -4.48857860e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 + -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 -2.75279799e-12 -1.00000000e+00 -4.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 + 5.00000000e-01 1.00000000e+00 -2.00000000e-01 2.50000000e-01 1.00000000e+00 -2.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 + 2.75279799e-12 1.00000000e+00 -2.00000000e-01 2.63252585e-01 7.40363202e-01 -1.92816815e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -3.15411016e-02 7.00464728e-01 -2.42853436e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + 2.75279799e-12 1.00000000e+00 -2.00000000e-01 1.74323728e-01 8.47666699e-01 -3.38918361e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -1.09576225e-01 8.98602596e-01 -3.83046413e-01 -2.53076790e-01 7.99260743e-01 -4.64658113e-01 + 1.59455851e-02 5.49948037e-01 -5.66649946e-01 4.09179074e-02 7.34033466e-01 -3.89217812e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 + 2.75279799e-12 1.00000000e+00 -6.00000000e-01 2.75279799e-12 1.00000000e+00 -4.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 + 7.58754489e-01 7.58424515e-01 -4.31851638e-01 8.66469562e-01 8.33333553e-01 -5.67628657e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 + 7.58754489e-01 7.58424515e-01 -4.31851638e-01 8.26309332e-01 7.28272187e-01 -4.26994277e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 + 7.50000000e-01 1.00000000e+00 -4.00000000e-01 7.60932375e-01 8.57917254e-01 -4.48442345e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 + 5.00000000e-01 1.00000000e+00 -2.00000000e-01 6.38458620e-01 8.77424281e-01 -3.75363581e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 + 1.00000000e+00 5.00000000e-01 -6.00000000e-01 8.91997301e-01 6.72697925e-01 -5.70240818e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 5.97689296e-01 6.23848639e-01 -3.47379551e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 + 5.00000000e-01 1.00000000e+00 -6.00000000e-01 6.11466951e-01 8.62675785e-01 -5.08680422e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 6.02929102e-01 5.91969048e-01 -5.41059259e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 + 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 5.83215727e-01 -5.80510263e-01 -3.27258795e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 8.47446355e-01 -8.68127316e-01 -4.89338687e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 5.76214501e-01 -8.49709837e-01 -5.72623137e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 6.08478501e-01 -6.18463179e-01 -5.70984505e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 9.07355102e-01 -6.37739277e-01 -3.07551473e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 8.44892315e-01 -6.23693327e-01 -5.71356441e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 + 4.93990198e-01 1.96586961e-02 -2.00936210e-01 7.33312257e-01 -2.43305887e-01 -1.54892254e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 7.62093252e-01 -5.48127444e-01 -1.80394090e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 9.18423791e-01 -3.51878331e-01 -3.82257230e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 7.89917875e-01 -5.11889809e-01 -3.58706330e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 1.00000000e+00 -5.00000000e-01 -4.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -8.90362310e-01 8.76352267e-01 -5.62154587e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 + -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -7.72171732e-01 8.92062587e-01 -4.14980355e-01 -7.71303906e-01 7.42798488e-01 -4.51592940e-01 + -1.00000000e+00 7.50000000e-01 -4.00000000e-01 -8.60654884e-01 7.72599795e-01 -4.33254900e-01 -7.71303906e-01 7.42798488e-01 -4.51592940e-01 + -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -8.86786132e-01 6.11211898e-01 -3.52673915e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -6.26849364e-01 8.72135665e-01 -4.92576183e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -5.89758562e-01 6.60541039e-01 -3.77661077e-01 -7.71303906e-01 7.42798488e-01 -4.51592940e-01 + -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -8.65257067e-01 6.39677674e-01 -5.61111799e-01 -7.71303906e-01 7.42798488e-01 -4.51592940e-01 + -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -6.28794794e-01 5.78824049e-01 -5.84488135e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 -8.94054158e-01 -8.65974221e-01 -5.24246714e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 -9.03521683e-01 -7.28651092e-01 -4.34081915e-01 -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 + -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 -7.58274396e-01 -8.48907235e-01 -3.90686694e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 + -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -6.54407863e-01 -6.25883342e-01 -3.00696336e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 + -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -8.67891179e-01 -6.17673148e-01 -5.66040699e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -6.23060881e-01 -6.50874641e-01 -5.44710045e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 + -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -6.44770531e-01 -9.24447618e-01 -2.87707904e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 + -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -6.29625945e-01 -9.03171291e-01 -5.37345742e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 + -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -1.00000000e+00 8.75000000e-01 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -4.00000000e-01 + -1.00000000e+00 7.50000000e-01 -4.00000000e-01 -1.00000000e+00 6.25000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 + -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -8.98693484e-01 9.06455438e-01 -4.29923885e-01 -1.00000000e+00 7.50000000e-01 -4.00000000e-01 + -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -1.00000000e+00 8.75000000e-01 -3.00000000e-01 -1.00000000e+00 7.50000000e-01 -4.00000000e-01 + -1.00000000e+00 7.50000000e-01 -4.00000000e-01 -1.00000000e+00 6.25000000e-01 -3.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 5.00000000e-01 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 + 5.00000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 7.50000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 2.88127504e-01 4.80366421e-01 -6.27498998e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.58568070e-01 2.90475700e-01 -5.61771941e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 + 4.76425748e-01 5.49663539e-01 -7.93911671e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 + 4.76425748e-01 5.49663539e-01 -7.93911671e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 + 5.09344874e-01 3.09144506e-02 -8.04652537e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 + 5.00000000e-01 5.00000000e-01 -1.00000000e+00 4.70494256e-01 5.00918977e-01 -8.78265196e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 + 5.00000000e-01 5.00000000e-01 -1.00000000e+00 2.50000000e-01 5.00000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 + 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 + 5.23944619e-01 1.85747848e-02 -5.96055755e-01 2.02005392e-01 1.35088691e-02 -5.71704179e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.74472946e-01 -2.55527072e-01 -6.17101064e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 + 5.09344874e-01 3.09144506e-02 -8.04652537e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 + 5.09344874e-01 3.09144506e-02 -8.04652537e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 + 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 + 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 + 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 2.50000000e-01 -6.88227253e-13 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 + 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 2.27888915e-01 -5.48643075e-01 -6.08178478e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 + 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 4.51723141e-01 -7.12445778e-01 -6.31796976e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 + 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 + -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 2.50000000e-01 -1.00000000e+00 -6.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -7.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 + 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 + 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 + -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 2.50000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -9.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 + 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -7.50000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 + -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 + 2.75279799e-12 1.00000000e+00 -6.00000000e-01 -2.50000000e-01 1.00000000e+00 -6.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + 1.59455851e-02 5.49948037e-01 -5.66649946e-01 -3.85304003e-02 7.30500373e-01 -6.37788061e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 + 2.75279799e-12 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -7.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 + 2.75279799e-12 1.00000000e+00 -8.00000000e-01 -2.50000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 + 2.81216416e-02 5.47228351e-01 -7.57921741e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 + 2.75279799e-12 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -9.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 + 2.75279799e-12 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 + 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.06459849e-12 7.50000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 + 1.59455851e-02 5.49948037e-01 -5.66649946e-01 -2.28613183e-01 5.45106914e-01 -6.46579701e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 4.76975638e-03 2.22747039e-01 -5.54198113e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 + -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 + 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 + 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -2.50000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 + 0.00000000e+00 0.00000000e+00 -1.00000000e+00 6.88199497e-13 2.50000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 + -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 -2.27518950e-01 -3.08139637e-02 -6.49633469e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 1.11083696e-02 -2.30119466e-01 -6.11745165e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 + 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 + 0.00000000e+00 0.00000000e+00 -1.00000000e+00 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 + 0.00000000e+00 0.00000000e+00 -1.00000000e+00 -2.50000000e-01 6.88199497e-13 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 + -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -6.88199497e-13 -2.50000000e-01 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 -2.63857307e-01 -5.34652399e-01 -6.28666006e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 + -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 3.60248665e-02 -7.15736638e-01 -5.56900182e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 + 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 + -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -2.50000000e-01 -1.00000000e+00 -6.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 + -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -7.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 + 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 + -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 + -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 + -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.50000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 + -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -9.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 + -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 + -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -2.06459849e-12 -7.50000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 + -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -5.37458717e-01 -2.20855384e-01 -6.15373185e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 + -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 -2.50000000e-01 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 + -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -9.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 + -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 + -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 + -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 + -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -7.50000000e-01 2.06459849e-12 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -1.00000000e+00 + -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 + -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -1.00000000e+00 -7.50000000e-01 -6.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -7.61949822e-01 -4.83182440e-01 -6.13761349e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -7.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -5.19284749e-01 -7.83778037e-01 -5.82806477e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 + -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 + -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -7.50000000e-01 -1.00000000e+00 -6.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 + -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 + -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 + -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -9.00000000e-01 -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -7.50000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 + -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 + -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 + -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -9.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -7.50000000e-01 -8.00000000e-01 -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -1.00000000e+00 -7.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -7.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 + -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -7.26284734e-01 -3.76036267e-02 -5.64749763e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 + -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -1.00000000e+00 -2.50000000e-01 -6.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -5.00000000e-01 2.50000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 + -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 + -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -1.00000000e+00 + -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 + -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 + -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -9.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 + -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 + -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 2.50000000e-01 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 + -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -5.26541160e-01 2.33288068e-01 -5.82433991e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -7.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 + -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -7.12353132e-01 4.56004138e-01 -5.52765752e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 + -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -1.00000000e+00 2.50000000e-01 -6.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 + -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 + -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 + -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 + -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -9.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 + -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -9.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 + -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -7.50000000e-01 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 7.50000000e-01 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 + -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -7.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -4.72348517e-01 7.55363920e-01 -5.93158920e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -7.00000000e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 + -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -7.50000000e-01 1.00000000e+00 -6.00000000e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -1.00000000e+00 7.50000000e-01 -6.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 + 5.00000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -9.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 + 4.76425748e-01 5.49663539e-01 -7.93911671e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 + 5.00000000e-01 1.00000000e+00 -8.00000000e-01 2.50000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 + 5.00000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -7.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 4.67519964e-01 7.42183049e-01 -6.00421251e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 + 5.00000000e-01 1.00000000e+00 -6.00000000e-01 2.50000000e-01 1.00000000e+00 -6.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 + 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 + 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 + 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -9.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 7.50000000e-01 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -9.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -7.50000000e-01 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 + 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 7.50000000e-01 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -7.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -7.50000000e-01 -6.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 7.71083683e-01 -4.83737049e-01 -6.24197292e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 + 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 + 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 7.50000000e-01 -2.06462625e-12 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 + 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -9.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -2.50000000e-01 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 + 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -7.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 1.00000000e+00 -2.50000000e-01 -6.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 7.75733836e-01 -1.61799598e-03 -6.49360986e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 + 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 + 1.00000000e+00 5.00000000e-01 -1.00000000e+00 7.50000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 + 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -9.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 2.50000000e-01 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 + 1.00000000e+00 5.00000000e-01 -8.00000000e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 + 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -7.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 + 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 1.00000000e+00 2.50000000e-01 -6.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 + 1.00000000e+00 5.00000000e-01 -6.00000000e-01 7.52729016e-01 4.70095302e-01 -6.25440659e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 + 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 + 1.00000000e+00 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 + 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -9.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 + 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 7.50000000e-01 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 + 1.00000000e+00 1.00000000e+00 -8.00000000e-01 7.50000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 + 1.00000000e+00 1.00000000e+00 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -7.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 + 1.00000000e+00 5.00000000e-01 -6.00000000e-01 1.00000000e+00 7.50000000e-01 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 + 1.00000000e+00 1.00000000e+00 -6.00000000e-01 7.50000000e-01 1.00000000e+00 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -4.61962375e-01 -7.75769656e-01 -4.18986981e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -5.00000000e-01 -1.00000000e+00 -4.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -7.50000000e-01 -1.00000000e+00 -2.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -8.75000000e-01 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 + -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 -6.25000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -6.25000000e-01 -1.00000000e+00 -3.00000000e-01 -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 -8.75000000e-01 -1.00000000e+00 -3.00000000e-01 -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 + -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -1.00000000e+00 -8.75000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -1.00000000e+00 -6.25000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -1.00000000e+00 -8.75000000e-01 -3.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -7.07395522e-01 -8.61682414e-01 -2.65465214e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -8.54654207e-01 -8.60096890e-01 -4.37860559e-01 -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 + 1.00000000e+00 1.00000000e+00 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -4.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 + 1.00000000e+00 1.00000000e+00 -2.00000000e-01 7.50000000e-01 1.00000000e+00 -2.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 + 1.00000000e+00 1.00000000e+00 -6.00000000e-01 1.00000000e+00 8.75000000e-01 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 + 1.00000000e+00 7.50000000e-01 -4.00000000e-01 1.00000000e+00 6.25000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 + 1.00000000e+00 1.00000000e+00 -2.00000000e-01 1.00000000e+00 8.75000000e-01 -3.00000000e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 + 5.00000000e-01 1.00000000e+00 -2.00000000e-01 7.30476792e-01 8.81397324e-01 -2.96849444e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 + 7.50000000e-01 1.00000000e+00 -4.00000000e-01 8.75000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 + 7.50000000e-01 1.00000000e+00 -4.00000000e-01 6.25000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 + 5.00000000e-01 1.00000000e+00 -2.00000000e-01 6.25000000e-01 1.00000000e+00 -3.00000000e-01 7.50000000e-01 1.00000000e+00 -4.00000000e-01 + 1.00000000e+00 1.00000000e+00 -2.00000000e-01 8.75000000e-01 1.00000000e+00 -3.00000000e-01 7.50000000e-01 1.00000000e+00 -4.00000000e-01 + 7.50000000e-01 1.00000000e+00 -4.00000000e-01 8.52044731e-01 9.16113998e-01 -3.66179284e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 + -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -2.21732964e-01 4.79719971e-01 -3.70076789e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + 3.63854332e-02 4.76218270e-01 -2.16523681e-01 -4.18265360e-02 4.78403270e-01 -3.64136987e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 -4.36853675e-02 2.05847513e-01 -4.06370645e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -3.58354637e-01 8.72163683e-01 -5.14709975e-01 -2.53076790e-01 7.99260743e-01 -4.64658113e-01 + 2.75279799e-12 1.00000000e+00 -6.00000000e-01 -1.22554368e-01 8.60195143e-01 -5.09984662e-01 -2.53076790e-01 7.99260743e-01 -4.64658113e-01 + -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -1.01740213e-01 6.26675241e-01 -5.28118729e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -3.87438698e-01 6.32538659e-01 -4.92653939e-01 -2.53076790e-01 7.99260743e-01 -4.64658113e-01 + -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -1.53421091e-01 6.23691705e-01 -3.37542058e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.72512145e-01 -5.18652177e-01 -4.46006893e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.48473889e-01 -4.79889978e-01 -4.11511494e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.94303478e-01 -2.29205246e-01 -4.32826494e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 3.82340121e-01 -9.09886376e-01 -5.09722733e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 1.11729587e-01 -8.53908847e-01 -5.21916675e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 1.71349433e-01 -6.47101723e-01 -5.08768665e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.04628731e-01 -5.75769142e-01 -5.51630806e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 + 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 3.49729146e-01 -6.26628131e-01 -3.25356150e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 + 3.63854332e-02 4.76218270e-01 -2.16523681e-01 2.36689214e-01 2.40025704e-01 -2.25657165e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 5.01218023e-01 -2.35503536e-01 -2.00080801e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 4.93990198e-01 1.96586961e-02 -2.00936210e-01 7.71110748e-01 -2.12400300e-03 -4.48259950e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 4.65448608e-01 2.57621780e-01 -4.47886277e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.95317763e-01 4.97416036e-02 -4.44792549e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 1.00000000e+00 5.00000000e-01 -6.00000000e-01 8.52871326e-01 3.63196277e-01 -5.61308458e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 + 7.31572411e-01 2.07606548e-01 -4.59504821e-01 8.68047382e-01 1.57342590e-01 -5.85643384e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 + 5.23944619e-01 1.85747848e-02 -5.96055755e-01 6.13341229e-01 1.58255960e-01 -5.70852079e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 6.47129850e-01 3.68352614e-01 -5.63940719e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 + 4.93990198e-01 1.96586961e-02 -2.00936210e-01 6.13790942e-01 1.73918479e-01 -3.71582893e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 + -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -7.35497436e-01 5.29644797e-04 -3.53371882e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -4.90724046e-01 -2.47401221e-01 -4.27818541e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -4.92291921e-01 4.91813276e-02 -4.01279556e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -8.41323825e-01 -4.02355019e-01 -5.66095150e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 + -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -8.83758601e-01 -9.52780134e-02 -5.48469547e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 + -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -6.51400271e-01 -1.04985386e-01 -5.22368777e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -6.17858889e-01 -3.85766434e-01 -5.13467283e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 + -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -5.77826281e-01 -8.80338640e-02 -3.15524267e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 + 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 6.41386307e-01 -1.55676912e-01 -3.01926334e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 8.77298541e-01 -1.21106197e-01 -5.84950026e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 + 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 8.41075069e-01 -4.09959538e-01 -5.73093164e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 6.05627991e-01 -4.22662589e-01 -5.69547875e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 + 5.23944619e-01 1.85747848e-02 -5.96055755e-01 5.88268197e-01 -1.29346803e-01 -4.91054821e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 + 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 6.12081363e-01 -4.03546033e-01 -3.45414629e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 + -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -4.63290913e-01 2.52761197e-01 -2.45700557e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -3.89278698e-01 6.11122280e-01 -3.61705808e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -2.47177004e-01 4.54761404e-01 -1.80487225e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -7.49696034e-01 5.31403850e-01 -4.19059676e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 + -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -5.14501293e-01 2.32691072e-01 -3.87277218e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -5.12924559e-01 4.66132291e-01 -4.04086748e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -6.42489463e-01 1.39517858e-01 -3.53339708e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -8.59570192e-01 1.17494759e-01 -5.77291177e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 + -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -9.00865088e-01 4.19883468e-01 -5.01735616e-01 -7.60981297e-01 2.83096054e-01 -4.53794791e-01 + -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -6.28268794e-01 3.63427986e-01 -5.69176508e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -5.90434958e-01 1.05209211e-01 -4.94318307e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 + -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -6.07884214e-01 3.32235062e-01 -3.27651217e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -5.40207811e-01 -2.89915281e-01 -2.42605818e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -5.35733988e-01 -7.66681895e-01 -2.22966183e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -6.37254587e-01 -3.87881320e-01 -3.18660568e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 + -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -7.48763334e-01 -5.24519933e-01 -3.53187929e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 -2.85046143e-01 -5.08898861e-01 -4.33724396e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -5.39879178e-01 -4.57913858e-01 -3.64817564e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -1.60523234e-01 -9.03030790e-01 -5.52241389e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -3.25882877e-01 -8.93874310e-01 -5.44211013e-01 -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 + -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -4.15119084e-01 -8.64464070e-01 -3.42660405e-01 -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 + -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -3.99971229e-01 -6.54707172e-01 -5.27787480e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 + -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -1.63465651e-01 -6.02378993e-01 -5.65078195e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 + -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -3.92881800e-01 -6.37164714e-01 -3.62944840e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 5.10729093e-01 7.60639709e-01 -2.14082050e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 2.61566778e-01 5.28349093e-01 -1.69349915e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 5.18687756e-01 2.90477718e-01 -2.36412455e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 5.81684558e-01 4.13894330e-01 -3.50593642e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 + 1.00000000e+00 5.00000000e-01 -6.00000000e-01 7.11081851e-01 5.08205256e-01 -4.34076166e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + 5.00000000e-01 1.00000000e+00 -6.00000000e-01 5.34253639e-01 7.63704600e-01 -3.51994597e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + 1.59455851e-02 5.49948037e-01 -5.66649946e-01 2.31884826e-01 5.23940610e-01 -4.42250212e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 5.32716143e-01 4.63867816e-01 -4.41053554e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + 3.63854332e-02 4.76218270e-01 -2.16523681e-01 8.26508586e-02 6.03898517e-01 -3.51040682e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + 5.00000000e-01 1.00000000e+00 -2.00000000e-01 3.28944967e-01 8.36442756e-01 -3.03853796e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + 2.75279799e-12 1.00000000e+00 -6.00000000e-01 1.46957448e-01 8.99894887e-01 -5.81777533e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + 5.00000000e-01 1.00000000e+00 -6.00000000e-01 3.86929530e-01 8.63386221e-01 -5.48717352e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 4.01637094e-01 6.35137167e-01 -5.00494214e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + 1.59455851e-02 5.49948037e-01 -5.66649946e-01 1.66086932e-01 5.90543458e-01 -5.60050136e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 4.23351663e-01 6.42884585e-01 -3.15189248e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 + -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -3.52577489e-01 1.04251494e-01 -2.29259268e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -3.47707757e-01 3.94412343e-01 -4.72794633e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -1.42717862e-01 4.21847282e-01 -4.96961238e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + 3.63854332e-02 4.76218270e-01 -2.16523681e-01 -1.66625271e-01 4.12360051e-01 -2.87743656e-01 -2.69993006e-01 2.24633383e-01 -3.42712104e-01 + -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -1.26913535e-01 1.32065310e-01 -4.98229955e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -4.08133052e-01 1.66032917e-01 -4.73866689e-01 -2.69993006e-01 2.24633383e-01 -3.42712104e-01 + -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -3.77095966e-01 3.71725793e-01 -3.15938363e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 3.64192245e-01 -1.32250109e-01 -2.43099017e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 3.52277623e-01 -3.32582615e-01 -4.35311775e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 1.69460623e-01 -3.52231887e-01 -4.29254709e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 + 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 4.19532876e-01 -3.79741341e-01 -2.64940315e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 + -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 1.26827359e-01 -1.50525201e-01 -4.46318333e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 + 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 3.68082769e-01 -1.74513271e-01 -4.50580273e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -3.68625639e-01 -4.21603349e-01 -4.45233408e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 + -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -4.17714071e-01 -1.03893967e-01 -5.19403635e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 + -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -4.19282025e-01 -1.08627669e-01 -2.69028540e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 + -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 -1.68783680e-01 -1.11087457e-01 -4.96905530e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 -9.73954041e-02 -3.61963022e-01 -5.09124723e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 + -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 -3.86084199e-01 -4.09588910e-01 -2.92066917e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 3.55256023e-01 4.02578442e-01 -4.79479327e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 + 5.23944619e-01 1.85747848e-02 -5.96055755e-01 3.43832702e-01 1.03749380e-01 -4.27391900e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 + 4.93990198e-01 1.96586961e-02 -2.00936210e-01 4.14732122e-01 1.52549679e-01 -2.86597701e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 + 2.75226154e-01 2.62309674e-01 -3.04722194e-01 1.29877154e-01 1.67848848e-01 -5.08209442e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + 1.59455851e-02 5.49948037e-01 -5.66649946e-01 1.42479381e-01 4.14481917e-01 -5.08720597e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 + 3.63854332e-02 4.76218270e-01 -2.16523681e-01 1.51546676e-01 4.07959421e-01 -3.18688777e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 + 4.67506556e-01 4.75925385e-01 -1.86547676e-01 3.69956903e-01 3.31166015e-01 -2.98274695e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 + 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 2.04134141e-01 -2.14922092e-01 -1.63726058e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 + -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -2.65034132e-01 2.49773560e-01 -1.54940107e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -3.44384684e-02 2.18713663e-01 -1.85579955e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -2.80153842e-01 -3.64863794e-02 -1.56716221e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 2.39904708e-01 2.97034161e-02 -2.43450037e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -2.34144442e-01 -3.19940718e-02 -3.50775687e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -4.44830136e-02 2.44659298e-02 -3.83935749e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -7.72852083e-02 1.46619467e-01 -2.95184107e-01 -2.69993006e-01 2.24633383e-01 -3.42712104e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 2.58898766e-01 -3.13537170e-02 -4.39149031e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 + 2.75226154e-01 2.62309674e-01 -3.04722194e-01 1.52740817e-01 1.63706393e-01 -2.82813306e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -7.59225478e-02 -1.05546665e-01 -2.64504503e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.26893288e-02 -2.58742171e-01 -3.76706981e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 + 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 1.26923761e-01 -1.24938144e-01 -2.59447138e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 + -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -1.00000000e+00 1.00000000e+00 -4.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -7.80936772e-01 7.57720448e-01 -1.99463657e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -1.00000000e+00 7.50000000e-01 -2.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -6.46484367e-01 7.29307686e-01 -3.03146543e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -8.75000000e-01 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -4.00000000e-01 + -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -6.25000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -8.75000000e-01 1.00000000e+00 -3.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 + -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -8.90088910e-01 7.20161599e-01 -2.61749028e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 2.50000000e-01 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -2.50000000e-01 -1.00000000e+00 6.00000000e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.75279799e-12 4.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -2.50000000e-01 6.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 + -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.75279799e-12 4.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 + -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 2.50000000e-01 6.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 + -5.00000000e-01 1.00000000e+00 6.00000000e-01 -2.50000000e-01 1.00000000e+00 6.00000000e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 + 7.50000000e-01 -1.00000000e+00 4.00000000e-01 6.25000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 + -2.75279799e-12 -1.00000000e+00 6.00000000e-01 2.50000000e-01 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 4.00000000e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 6.25000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 + 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 2.50000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 + -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -6.25000000e-01 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 + -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 -2.50000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 + -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 4.00000000e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 7.86251314e-01 -1.34708864e-01 2.91552600e-01 1.00000000e+00 -2.50000000e-01 4.00000000e-01 + 7.73208263e-01 -2.59692901e-01 4.77175444e-01 8.78752283e-01 -2.29134588e-01 4.84291793e-01 1.00000000e+00 -2.50000000e-01 4.00000000e-01 + 1.00000000e+00 -2.50000000e-01 4.00000000e-01 1.00000000e+00 -1.25000000e-01 5.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 + 1.00000000e+00 -2.50000000e-01 4.00000000e-01 1.00000000e+00 -3.75000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -3.75000000e-01 3.00000000e-01 1.00000000e+00 -2.50000000e-01 4.00000000e-01 + 1.00000000e+00 -2.50000000e-01 4.00000000e-01 1.00000000e+00 -1.25000000e-01 3.00000000e-01 1.00000000e+00 -2.75279799e-12 2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -3.75000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 4.00000000e-01 + -2.50000000e-01 -1.00000000e+00 4.00000000e-01 -3.75000000e-01 -1.00000000e+00 3.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 + -2.50000000e-01 -1.00000000e+00 4.00000000e-01 -2.65668003e-01 -9.01093151e-01 4.73869320e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -1.25000000e-01 -1.00000000e+00 3.00000000e-01 -2.50000000e-01 -1.00000000e+00 4.00000000e-01 + -2.50000000e-01 -1.00000000e+00 4.00000000e-01 -1.25000000e-01 -1.00000000e+00 5.00000000e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 + -1.00000000e+00 2.50000000e-01 4.00000000e-01 -1.00000000e+00 3.75000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 + -1.00000000e+00 2.50000000e-01 4.00000000e-01 -1.00000000e+00 3.75000000e-01 3.00000000e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 + -1.00000000e+00 2.50000000e-01 4.00000000e-01 -8.48353683e-01 2.23570693e-01 4.29868458e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 + -1.00000000e+00 2.50000000e-01 4.00000000e-01 -1.00000000e+00 1.25000000e-01 5.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 + -1.00000000e+00 2.50000000e-01 4.00000000e-01 -1.00000000e+00 1.25000000e-01 3.00000000e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -7.10706699e-01 1.54516895e-01 3.46583661e-01 -1.00000000e+00 2.50000000e-01 4.00000000e-01 + -2.75279799e-12 -1.00000000e+00 6.00000000e-01 1.25000000e-01 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 4.00000000e-01 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 1.25000000e-01 -1.00000000e+00 3.00000000e-01 2.50000000e-01 -1.00000000e+00 4.00000000e-01 + 2.50599317e-01 -7.83894535e-01 5.11804036e-01 2.22338251e-01 -9.05389135e-01 4.34201650e-01 2.50000000e-01 -1.00000000e+00 4.00000000e-01 + 2.50000000e-01 -1.00000000e+00 4.00000000e-01 3.75000000e-01 -1.00000000e+00 3.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 + 5.00000000e-01 -1.00000000e+00 6.00000000e-01 3.75000000e-01 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 4.00000000e-01 + -2.50000000e-01 1.00000000e+00 4.00000000e-01 -1.25000000e-01 1.00000000e+00 5.00000000e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 + -2.50000000e-01 1.00000000e+00 4.00000000e-01 -1.25000000e-01 1.00000000e+00 3.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 + -2.53733289e-01 7.78555773e-01 5.11047110e-01 -2.43796533e-01 8.40363033e-01 4.65276888e-01 -2.50000000e-01 1.00000000e+00 4.00000000e-01 + -2.50000000e-01 1.00000000e+00 4.00000000e-01 -3.75000000e-01 1.00000000e+00 3.00000000e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 + -2.50000000e-01 1.00000000e+00 4.00000000e-01 -3.75000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 + -1.00000000e+00 7.50000000e-01 4.00000000e-01 -1.00000000e+00 6.25000000e-01 3.00000000e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 + -1.00000000e+00 7.50000000e-01 4.00000000e-01 -1.00000000e+00 6.25000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 + -7.42991857e-01 7.43456068e-01 4.63979586e-01 -8.61517128e-01 7.99768271e-01 4.42435006e-01 -1.00000000e+00 7.50000000e-01 4.00000000e-01 + -1.00000000e+00 1.00000000e+00 2.00000000e-01 -1.00000000e+00 8.75000000e-01 3.00000000e-01 -1.00000000e+00 7.50000000e-01 4.00000000e-01 + -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -1.00000000e+00 -1.25000000e-01 5.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 + -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -1.00000000e+00 -1.25000000e-01 3.00000000e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 + -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -9.00001439e-01 -2.33350512e-01 4.04672585e-01 -7.69033054e-01 -2.83268701e-01 5.03354564e-01 + -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -1.00000000e+00 -3.75000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 + -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -1.00000000e+00 -3.75000000e-01 3.00000000e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -7.90416189e-01 -3.93195918e-01 2.54565942e-01 -1.00000000e+00 -2.50000000e-01 4.00000000e-01 + 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 1.25000000e-01 5.00000000e-01 1.00000000e+00 2.50000000e-01 4.00000000e-01 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 1.25000000e-01 3.00000000e-01 1.00000000e+00 2.50000000e-01 4.00000000e-01 + 1.00000000e+00 2.50000000e-01 4.00000000e-01 8.28723933e-01 2.16743806e-01 3.90057687e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 + 1.00000000e+00 2.50000000e-01 4.00000000e-01 1.00000000e+00 3.75000000e-01 3.00000000e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 3.75000000e-01 5.00000000e-01 1.00000000e+00 2.50000000e-01 4.00000000e-01 + -7.50000000e-01 1.00000000e+00 4.00000000e-01 -6.25000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 + -5.00000000e-01 1.00000000e+00 2.00000000e-01 -6.25000000e-01 1.00000000e+00 3.00000000e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 + -7.50000000e-01 1.00000000e+00 4.00000000e-01 -7.19260786e-01 8.48233429e-01 4.09443061e-01 -7.42991857e-01 7.43456068e-01 4.63979586e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -6.62532395e-01 7.59053144e-01 2.85419897e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 + -1.00000000e+00 1.00000000e+00 2.00000000e-01 -8.75000000e-01 1.00000000e+00 3.00000000e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 + -1.00000000e+00 7.50000000e-01 4.00000000e-01 -8.95213666e-01 9.02822188e-01 4.30630020e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 + -1.00000000e+00 5.00000000e-01 2.00000000e-01 -8.36863156e-01 7.96356027e-01 3.24115978e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 + 2.50000000e-01 1.00000000e+00 4.00000000e-01 1.25000000e-01 1.00000000e+00 3.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 1.25000000e-01 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 4.00000000e-01 + 2.31960145e-01 7.26079517e-01 4.47497104e-01 2.39184350e-01 8.42198596e-01 4.37995568e-01 2.50000000e-01 1.00000000e+00 4.00000000e-01 + 2.50000000e-01 1.00000000e+00 4.00000000e-01 3.75000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 + 5.00000000e-01 1.00000000e+00 2.00000000e-01 3.75000000e-01 1.00000000e+00 3.00000000e-01 2.50000000e-01 1.00000000e+00 4.00000000e-01 + 2.50000000e-01 1.00000000e+00 4.00000000e-01 3.93281510e-01 7.56814089e-01 2.84391635e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -7.50000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 + -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -8.75000000e-01 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 + -7.43450159e-01 -7.74711926e-01 4.35008075e-01 -9.15521026e-01 -9.17783808e-01 5.08382922e-01 -1.00000000e+00 -1.00000000e+00 6.00000000e-01 + -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -7.50000000e-01 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 + -7.50000000e-01 -1.00000000e+00 4.00000000e-01 -8.75000000e-01 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 6.00000000e-01 + -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -1.00000000e+00 4.00000000e-01 -1.00000000e+00 -1.00000000e+00 6.00000000e-01 + 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 7.50000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 + 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 8.75000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 + 7.30868887e-01 7.76702907e-01 5.01983983e-01 8.76503023e-01 9.10407593e-01 5.85986108e-01 1.00000000e+00 1.00000000e+00 6.00000000e-01 + 5.00000000e-01 1.00000000e+00 6.00000000e-01 7.50000000e-01 1.00000000e+00 6.00000000e-01 1.00000000e+00 1.00000000e+00 6.00000000e-01 + 1.00000000e+00 1.00000000e+00 6.00000000e-01 8.75000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 4.00000000e-01 + 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 1.00000000e+00 4.00000000e-01 1.00000000e+00 1.00000000e+00 2.00000000e-01 + 5.00000000e-01 -1.00000000e+00 6.00000000e-01 7.50000000e-01 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 + 7.50000000e-01 -1.00000000e+00 4.00000000e-01 8.75000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 + 1.00000000e+00 -1.00000000e+00 6.00000000e-01 8.90049246e-01 -8.75492183e-01 5.39961626e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 + 1.00000000e+00 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -7.50000000e-01 6.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 + 1.00000000e+00 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -8.75000000e-01 5.00000000e-01 1.00000000e+00 -7.50000000e-01 4.00000000e-01 + 1.00000000e+00 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 4.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 + -1.00000000e+00 1.00000000e+00 6.00000000e-01 -7.50000000e-01 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 + -7.50000000e-01 1.00000000e+00 4.00000000e-01 -8.75000000e-01 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 6.00000000e-01 + -7.42991857e-01 7.43456068e-01 4.63979586e-01 -9.10271126e-01 9.06408677e-01 4.98475433e-01 -1.00000000e+00 1.00000000e+00 6.00000000e-01 + -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 7.50000000e-01 6.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 + -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 8.75000000e-01 5.00000000e-01 -1.00000000e+00 7.50000000e-01 4.00000000e-01 + -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 1.00000000e+00 4.00000000e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 + -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.00000000e-01 -1.00000000e+00 -1.00000000e+00 8.00000000e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -7.50000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 + 2.75282575e-12 1.00000000e+00 8.00000000e-01 2.75281187e-12 1.00000000e+00 9.00000000e-01 2.75279799e-12 1.00000000e+00 1.00000000e+00 + 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.06459849e-12 7.50000000e-01 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 + 2.75279799e-12 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 7.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 + -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.50000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 + 5.00000000e-01 -1.00000000e+00 8.00000000e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 + 5.12293954e-01 -5.47020830e-01 8.46585454e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 + 5.00000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 9.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 + -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 2.75279799e-12 1.00000000e+00 4.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 + 5.12293954e-01 -5.47020830e-01 8.46585454e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 5.00000000e-01 -5.00000000e-01 1.00000000e+00 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 -1.14296843e-02 7.53313489e-01 6.07258766e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -7.50000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 -1.03830914e-01 8.79215444e-01 4.91050145e-01 -2.53733289e-01 7.78555773e-01 5.11047110e-01 + 5.00000000e-01 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 + -2.75279799e-12 -1.00000000e+00 6.00000000e-01 -2.75279799e-12 -1.00000000e+00 4.00000000e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 + 5.12293954e-01 -5.47020830e-01 8.46585454e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 + 5.08559128e-01 4.68350764e-02 8.47523900e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 3.60221343e-02 -7.72494852e-01 6.10765349e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 + 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 5.00000000e-01 -1.37645451e-12 1.00000000e+00 + -2.75279799e-12 -1.00000000e+00 6.00000000e-01 8.31090865e-02 -8.99615409e-01 5.29148086e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 + 5.00000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -2.50000000e-01 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 + 5.00000000e-01 -1.37645451e-12 1.00000000e+00 2.50000000e-01 -6.88227253e-13 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 8.76800840e-02 9.23649917e-01 5.24474789e-01 2.31960145e-01 7.26079517e-01 4.47497104e-01 + 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 + 5.36295327e-01 5.28286707e-01 7.83714183e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 + -2.95099817e-01 -7.31729472e-01 4.69924715e-01 -1.59583432e-01 -9.05275769e-01 5.15861104e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 + 5.36295327e-01 5.28286707e-01 7.83714183e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 5.00000000e-01 5.00000000e-01 1.00000000e+00 + 1.00000000e+00 -2.75279799e-12 6.00000000e-01 7.22088337e-01 1.89298349e-02 3.65398368e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 + 5.00000000e-01 -1.37645451e-12 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 7.17970008e-01 -1.41566063e-02 5.58387791e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 + 5.00000000e-01 5.00000000e-01 1.00000000e+00 2.50000000e-01 5.00000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 + 1.00000000e+00 -2.75279799e-12 6.00000000e-01 8.30963348e-01 1.69906852e-01 5.13209284e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 + 5.00000000e-01 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 7.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 2.75279799e-12 6.00000000e-01 -7.13479476e-01 2.13764413e-02 4.40590378e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 + 5.36295327e-01 5.28286707e-01 7.83714183e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -7.73235639e-01 4.15095151e-02 6.07357715e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 + 5.00000000e-01 1.00000000e+00 8.00000000e-01 2.50000000e-01 1.00000000e+00 8.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 2.75279799e-12 6.00000000e-01 -8.53792461e-01 -9.54357200e-02 5.81805649e-01 -7.69033054e-01 -2.83268701e-01 5.03354564e-01 + 5.00000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 9.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 + 5.00000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 7.52449599e-01 4.50167886e-01 3.95793107e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 1.00000000e+00 -2.75279799e-12 1.00000000e+00 7.50000000e-01 -2.06462625e-12 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 7.23575875e-01 5.10278343e-01 6.17869689e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 7.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 + 7.30868887e-01 7.76702907e-01 5.01983983e-01 8.44891524e-01 6.16309254e-01 4.91464941e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 + 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 2.50000000e-01 8.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 + -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -7.41539722e-01 -4.75425901e-01 3.85859941e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 + 1.00000000e+00 5.00000000e-01 8.00000000e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 + -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -7.59878478e-01 -5.24557688e-01 6.33305260e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 + 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 5.00000000e-01 9.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 + -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -8.91748819e-01 -5.83131968e-01 5.25603037e-01 -7.43450159e-01 -7.74711926e-01 4.35008075e-01 + 1.00000000e+00 -2.75279799e-12 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 1.00000000e+00 7.50000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 8.64191124e-01 4.12913608e-01 5.17872579e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 + 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 1.00000000e+00 7.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 + 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 7.50000000e-01 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 + -7.69033054e-01 -2.83268701e-01 5.03354564e-01 -8.81118061e-01 -4.21240183e-01 5.62746756e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 + 1.00000000e+00 1.00000000e+00 8.00000000e-01 7.50000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 + 1.00000000e+00 1.00000000e+00 8.00000000e-01 1.00000000e+00 1.00000000e+00 9.00000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 7.59075207e-01 -3.72980794e-01 3.49600855e-01 1.00000000e+00 -2.50000000e-01 4.00000000e-01 + 1.00000000e+00 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 + -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 + -2.53733289e-01 7.78555773e-01 5.11047110e-01 -3.81269810e-01 9.00465289e-01 5.07653684e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 + 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 -2.75281187e-12 9.00000000e-01 1.00000000e+00 -2.75279799e-12 1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 6.00000000e-01 3.69097495e-01 -8.89474205e-01 5.38846813e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 + 1.00000000e+00 -2.75282575e-12 8.00000000e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 + 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -2.50000000e-01 8.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 + 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 -2.75281187e-12 7.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 + 5.00000000e-01 -1.00000000e+00 6.00000000e-01 6.15707543e-01 -9.07792186e-01 4.93227974e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 + 1.00000000e+00 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.42189289e-01 -7.20003365e-01 6.43416688e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 + 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 4.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 + 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -5.00000000e-01 9.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 + 1.00000000e+00 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 9.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 + -5.00000000e-01 1.00000000e+00 6.00000000e-01 -6.08997635e-01 8.56646650e-01 5.05176905e-01 -7.42991857e-01 7.43456068e-01 4.63979586e-01 + 1.00000000e+00 -5.00000000e-01 8.00000000e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 + -5.00000000e-01 1.00000000e+00 6.00000000e-01 -4.56240197e-01 7.11292251e-01 5.92377271e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 + 1.00000000e+00 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -7.50000000e-01 8.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 + -5.00000000e-01 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 4.00000000e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 + 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -5.00000000e-01 7.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 + 5.00000000e-01 -1.00000000e+00 8.00000000e-01 7.50000000e-01 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 + 1.00000000e+00 -2.75279799e-12 6.00000000e-01 9.19924110e-01 -1.63903990e-01 5.63448121e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 + 1.00000000e+00 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -1.00000000e+00 7.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 + -1.00000000e+00 2.75279799e-12 6.00000000e-01 -8.51271122e-01 9.63264946e-02 5.72985349e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 + 5.00000000e-01 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 + 2.75282575e-12 1.00000000e+00 8.00000000e-01 -2.50000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 + 4.04523035e-02 5.23334239e-01 7.85315811e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 2.75281187e-12 1.00000000e+00 7.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 + 1.37639899e-12 5.00000000e-01 1.00000000e+00 -2.50000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 + 0.00000000e+00 0.00000000e+00 1.00000000e+00 6.88199497e-13 2.50000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 + 4.04523035e-02 5.23334239e-01 7.85315811e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 1.37639899e-12 5.00000000e-01 1.00000000e+00 + 4.04523035e-02 5.23334239e-01 7.85315811e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 + -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 + -1.11217671e-02 4.85990029e-01 5.72847359e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 + 0.00000000e+00 0.00000000e+00 1.00000000e+00 -2.50000000e-01 6.88199497e-13 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 + -1.37639899e-12 -5.00000000e-01 1.00000000e+00 -6.88199497e-13 -2.50000000e-01 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 + -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 0.00000000e+00 0.00000000e+00 1.00000000e+00 + -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 + 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 + -4.84577644e-02 4.06855736e-02 5.60664410e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 + -1.37639899e-12 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 + -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -2.06459849e-12 -7.50000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 + 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 + -2.75282575e-12 -1.00000000e+00 8.00000000e-01 -2.75281187e-12 -1.00000000e+00 9.00000000e-01 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 + 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 + -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 + -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.50000000e-01 -1.00000000e+00 8.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 + -2.75279799e-12 -1.00000000e+00 6.00000000e-01 -2.75281187e-12 -1.00000000e+00 7.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 + -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 + -5.00000000e-01 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 + -1.00000000e+00 1.00000000e+00 8.00000000e-01 -1.00000000e+00 1.00000000e+00 9.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 + -5.00000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 7.50000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 + -5.00000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 9.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 + -1.00000000e+00 1.00000000e+00 8.00000000e-01 -1.00000000e+00 7.50000000e-01 8.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 + -5.00000000e-01 1.00000000e+00 8.00000000e-01 -7.50000000e-01 1.00000000e+00 8.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 1.00000000e+00 7.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 + -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 + -5.00000000e-01 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 7.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 + -5.00000000e-01 5.00000000e-01 1.00000000e+00 -7.50000000e-01 5.00000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 + -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 5.00000000e-01 9.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 + -5.00000000e-01 1.37639899e-12 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 + -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -5.00000000e-01 5.00000000e-01 1.00000000e+00 + -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 2.50000000e-01 8.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 + -4.90548406e-01 5.30132674e-01 8.30068751e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 + -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 5.00000000e-01 7.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 + -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 + -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 + -5.00000000e-01 1.37639899e-12 1.00000000e+00 -7.50000000e-01 2.06459849e-12 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 + -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 2.75281187e-12 9.00000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 + -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.50000000e-01 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 + -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -5.00000000e-01 1.37639899e-12 1.00000000e+00 + -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 -2.50000000e-01 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 + -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 + -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 2.75281187e-12 7.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 + -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 + -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 + -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 + -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 9.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 + -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 + -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 9.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 + -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -1.00000000e+00 9.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 + -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -7.50000000e-01 8.00000000e-01 -1.00000000e+00 -1.00000000e+00 8.00000000e-01 + -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 + -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 + -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 + -7.43450159e-01 -7.74711926e-01 4.35008075e-01 -8.45346644e-01 -7.26859422e-01 4.13013631e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 + -7.43450159e-01 -7.74711926e-01 4.35008075e-01 -7.86274781e-01 -8.50573849e-01 3.93269387e-01 -7.50000000e-01 -1.00000000e+00 4.00000000e-01 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -6.12836697e-01 -8.35449761e-01 3.36074783e-01 -7.43450159e-01 -7.74711926e-01 4.35008075e-01 + -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -6.67838065e-01 -6.50986987e-01 5.24036197e-01 -7.43450159e-01 -7.74711926e-01 4.35008075e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -6.27913459e-01 -8.67915630e-01 5.86331976e-01 -7.43450159e-01 -7.74711926e-01 4.35008075e-01 + -7.43450159e-01 -7.74711926e-01 4.35008075e-01 -5.93191911e-01 -6.52396380e-01 3.12067422e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 + -7.50000000e-01 -1.00000000e+00 4.00000000e-01 -6.25000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 4.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -3.27751619e-01 -8.85972387e-01 4.95570598e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 + -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.48640676e-01 -7.77286265e-01 6.36669671e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -5.07600161e-01 -7.12490447e-01 3.91725280e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 + 7.30868887e-01 7.76702907e-01 5.01983983e-01 8.80398505e-01 7.35071987e-01 4.02643311e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 + 7.30868887e-01 7.76702907e-01 5.01983983e-01 8.62207738e-01 5.79521087e-01 3.78861936e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 + 7.50000000e-01 1.00000000e+00 4.00000000e-01 7.74266309e-01 8.26607771e-01 4.38987081e-01 7.30868887e-01 7.76702907e-01 5.01983983e-01 + 7.30868887e-01 7.76702907e-01 5.01983983e-01 6.03301128e-01 8.61647280e-01 3.26242036e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 + 7.30868887e-01 7.76702907e-01 5.01983983e-01 6.04373699e-01 6.57695728e-01 5.25342732e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 + 7.30868887e-01 7.76702907e-01 5.01983983e-01 6.27345330e-01 8.95365364e-01 5.23438494e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 + 7.30868887e-01 7.76702907e-01 5.01983983e-01 6.03625973e-01 6.65787715e-01 3.08252079e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 7.50000000e-01 1.00000000e+00 4.00000000e-01 6.25000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 + 5.00000000e-01 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 4.00000000e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 + 5.00000000e-01 1.00000000e+00 6.00000000e-01 4.05187694e-01 9.19116705e-01 5.12301501e-01 2.31960145e-01 7.26079517e-01 4.47497104e-01 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 5.17477952e-01 7.34861266e-01 5.67509897e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 + 5.00000000e-01 1.00000000e+00 6.00000000e-01 4.86665407e-01 7.82107660e-01 3.79119071e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -5.97413999e-01 5.75011831e-01 3.44752746e-01 -7.42991857e-01 7.43456068e-01 4.63979586e-01 + -7.42991857e-01 7.43456068e-01 4.63979586e-01 -6.71913014e-01 9.11727579e-01 3.05236110e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 -6.43149611e-01 6.19218547e-01 4.91951702e-01 -7.42991857e-01 7.43456068e-01 4.63979586e-01 + -7.42991857e-01 7.43456068e-01 4.63979586e-01 -8.84995383e-01 6.32385336e-01 5.73176214e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 + -7.42991857e-01 7.43456068e-01 4.63979586e-01 -9.15005514e-01 6.38336091e-01 3.24843630e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 + -7.63437341e-01 2.29532918e-01 4.45102704e-01 -8.39525224e-01 4.22716168e-01 5.28994619e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 -7.45184141e-01 4.51483100e-01 5.88051785e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 + -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 4.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 + 7.50000000e-01 -1.00000000e+00 4.00000000e-01 7.12431037e-01 -8.84486081e-01 4.61017027e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 + 7.89872088e-01 -7.06620648e-01 4.93373476e-01 8.58793367e-01 -7.13808628e-01 4.40709388e-01 1.00000000e+00 -7.50000000e-01 4.00000000e-01 + 7.89872088e-01 -7.06620648e-01 4.93373476e-01 8.84694395e-01 -5.86961101e-01 3.36779377e-01 1.00000000e+00 -5.00000000e-01 2.00000000e-01 + 5.00000000e-01 -1.00000000e+00 2.00000000e-01 6.54371460e-01 -9.01134752e-01 3.53485877e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.76966254e-01 -5.86807688e-01 5.48429208e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 + 1.00000000e+00 -5.00000000e-01 6.00000000e-01 8.29294769e-01 -5.82408177e-01 5.73194697e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 6.72384965e-01 -6.20513799e-01 3.45890435e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 + 1.00000000e+00 -7.50000000e-01 4.00000000e-01 1.00000000e+00 -6.25000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 4.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 6.00000000e-01 8.73270787e-01 -4.02444866e-01 5.27755700e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 + 1.00000000e+00 -5.00000000e-01 6.00000000e-01 7.11398136e-01 -5.13660148e-01 5.52310014e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 + 1.00000000e+00 -5.00000000e-01 6.00000000e-01 7.52452054e-01 -5.18482006e-01 3.62995040e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 + 1.00000000e+00 -7.50000000e-01 4.00000000e-01 8.49875951e-01 -8.36235032e-01 4.05987207e-01 7.50000000e-01 -1.00000000e+00 4.00000000e-01 + 1.00000000e+00 -7.50000000e-01 4.00000000e-01 1.00000000e+00 -6.25000000e-01 3.00000000e-01 1.00000000e+00 -5.00000000e-01 2.00000000e-01 + 1.00000000e+00 -7.50000000e-01 4.00000000e-01 1.00000000e+00 -8.75000000e-01 3.00000000e-01 1.00000000e+00 -1.00000000e+00 2.00000000e-01 + 7.50000000e-01 -1.00000000e+00 4.00000000e-01 6.23281300e-01 -7.02445288e-01 3.39155900e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 + 7.50000000e-01 -1.00000000e+00 4.00000000e-01 6.25000000e-01 -1.00000000e+00 3.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 + 1.00000000e+00 -1.00000000e+00 2.00000000e-01 8.75000000e-01 -1.00000000e+00 3.00000000e-01 7.50000000e-01 -1.00000000e+00 4.00000000e-01 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 9.11133699e-01 -7.62848934e-01 3.13636356e-01 7.50000000e-01 -1.00000000e+00 4.00000000e-01 + 2.70125392e-01 2.53421154e-01 3.09013047e-01 1.39125846e-01 1.01897721e-01 4.68954444e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 + -4.84577644e-02 4.06855736e-02 5.60664410e-01 -2.39636276e-02 2.31604414e-01 6.19527443e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + -4.84577644e-02 4.06855736e-02 5.60664410e-01 9.18490715e-02 -7.59212279e-02 4.66188765e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 2.01691136e-01 -4.79247863e-02 5.66882667e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 + -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.02499262e-02 -2.79583390e-01 6.39593268e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 + -2.32508956e-01 -2.34291873e-01 3.74551790e-01 -1.14128806e-01 -1.09831503e-01 4.47860812e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 + -2.58094392e-01 2.82537068e-01 3.64273615e-01 -1.43161162e-01 9.94492567e-02 4.29784384e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 + -4.84577644e-02 4.06855736e-02 5.60664410e-01 -2.61163068e-02 2.54994411e-03 3.60328829e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -2.94704534e-01 1.44582572e-02 5.67814283e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 + 2.70125392e-01 2.53421154e-01 3.09013047e-01 8.57349743e-02 4.00586483e-01 2.82372301e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 + 2.70125392e-01 2.53421154e-01 3.09013047e-01 3.97416439e-01 3.51039393e-01 2.49802633e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 2.70125392e-01 2.53421154e-01 3.09013047e-01 1.34492422e-01 4.11104930e-01 4.92640097e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + 2.70125392e-01 2.53421154e-01 3.09013047e-01 1.13838196e-01 1.56109587e-01 3.00622060e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 3.73829324e-01 3.49649613e-01 4.78341518e-01 2.70125392e-01 2.53421154e-01 3.09013047e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 3.27337149e-01 1.33340882e-01 4.96607554e-01 2.70125392e-01 2.53421154e-01 3.09013047e-01 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 3.49452181e-01 1.16803918e-01 3.21844212e-01 2.70125392e-01 2.53421154e-01 3.09013047e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -3.77044721e-01 -3.86221888e-01 2.70332292e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -1.22875598e-01 -3.74472942e-01 2.92983114e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -1.66073691e-01 -3.83755514e-01 4.69294639e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 + -2.32508956e-01 -2.34291873e-01 3.74551790e-01 -1.51879593e-01 -1.13394800e-01 2.51237018e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.04680366e-01 -1.23819144e-01 5.19784144e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -3.42657569e-01 -1.46554825e-01 2.63151534e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 + -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -4.05745810e-01 -3.68923054e-01 4.50956452e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 + 2.25942245e-01 -2.63270065e-01 3.92407990e-01 9.62199016e-02 -3.70130984e-01 2.71639510e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.08644786e-01 -1.52571447e-01 2.65396654e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 3.85671313e-01 -9.68735403e-02 4.37256185e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 1.60008278e-01 -1.46130163e-01 2.33280747e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 3.39512647e-01 -3.37790850e-01 4.98848787e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 8.86874820e-02 -3.37138511e-01 4.69088678e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 3.63091097e-01 -3.99212777e-01 2.46760730e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -4.14379652e-01 1.45410468e-01 2.38242692e-01 -2.58094392e-01 2.82537068e-01 3.64273615e-01 + -2.58094392e-01 2.82537068e-01 3.64273615e-01 -1.28316466e-01 3.77307184e-01 3.19903388e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.04720631e-01 7.85479119e-02 4.35730162e-01 -2.58094392e-01 2.82537068e-01 3.64273615e-01 + -2.58094392e-01 2.82537068e-01 3.64273615e-01 -1.45010052e-01 1.11739271e-01 2.84118197e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + -2.58094392e-01 2.82537068e-01 3.64273615e-01 -1.30889471e-01 3.54143146e-01 4.97335343e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + -2.58094392e-01 2.82537068e-01 3.64273615e-01 -3.60603414e-01 3.70275001e-01 2.71740306e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 + -2.58094392e-01 2.82537068e-01 3.64273615e-01 -3.72824999e-01 4.10631086e-01 4.68741544e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 + 2.31960145e-01 7.26079517e-01 4.47497104e-01 1.55468689e-01 6.50945360e-01 3.45184928e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 + 2.31960145e-01 7.26079517e-01 4.47497104e-01 1.24274401e-01 9.08115886e-01 3.45737243e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 + 2.31960145e-01 7.26079517e-01 4.47497104e-01 4.12336473e-01 6.07010613e-01 5.61283929e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 + 2.31960145e-01 7.26079517e-01 4.47497104e-01 1.59819553e-01 6.03132798e-01 5.76381256e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + 2.31960145e-01 7.26079517e-01 4.47497104e-01 3.26162261e-01 6.18440736e-01 3.41066073e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 6.45236924e-01 -3.37176645e-01 3.11314218e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 6.37565812e-01 -8.99126577e-02 4.94571251e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 5.79787620e-01 -9.93624045e-02 3.49048569e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 6.28022276e-01 -3.66800162e-01 5.00071292e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -3.57653204e-01 -8.99557346e-01 3.73406811e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 + -2.95099817e-01 -7.31729472e-01 4.69924715e-01 -1.28527160e-01 -9.02324432e-01 3.24089902e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -3.42720755e-01 -6.14657542e-01 3.77824468e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -1.66991032e-01 -6.07879220e-01 5.30297600e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -1.68236393e-01 -6.73159091e-01 2.88154228e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 + -2.95099817e-01 -7.31729472e-01 4.69924715e-01 -3.96888182e-01 -5.76030582e-01 5.25991615e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -6.70680402e-01 1.07713535e-01 3.63359994e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 + -7.63437341e-01 2.29532918e-01 4.45102704e-01 -8.86310575e-01 3.89840639e-01 3.22478178e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 -6.42802234e-01 3.74779155e-01 5.09006141e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -6.62585200e-01 1.51780949e-01 5.00128591e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -6.50304469e-01 3.29004953e-01 3.75307981e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 + -1.00000000e+00 2.75279799e-12 2.00000000e-01 -9.23766683e-01 -1.69627151e-01 3.78029105e-01 -7.69033054e-01 -2.83268701e-01 5.03354564e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -5.89570057e-01 -4.09844408e-01 3.67512199e-01 -7.69033054e-01 -2.83268701e-01 5.03354564e-01 + -7.69033054e-01 -2.83268701e-01 5.03354564e-01 -6.03596058e-01 -1.51376554e-01 5.18725201e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 + -7.69033054e-01 -2.83268701e-01 5.03354564e-01 -6.14344994e-01 -3.61691618e-01 5.06517412e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 + -7.69033054e-01 -2.83268701e-01 5.03354564e-01 -6.27377749e-01 -1.10672305e-01 3.45252783e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -2.11700863e-01 4.59103482e-02 4.48800936e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.64893153e-01 2.04810635e-01 5.59668067e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.69076448e-01 2.08350687e-01 3.58358216e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.24385873e-01 3.18962695e-02 3.71925747e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.82020794e-01 -2.00196725e-01 6.17411358e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 + -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.23809598e-01 -4.77716802e-01 4.44678746e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -2.04187698e-01 -5.48263988e-01 6.12094029e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -2.31419986e-01 -4.73379654e-01 3.80609567e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.47963746e-01 -2.53564895e-01 3.98699997e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 + 7.04885116e-01 2.42741400e-01 4.57337152e-01 8.66039813e-01 3.74035083e-01 3.28660329e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 8.90031279e-01 9.60305867e-02 3.28600186e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 + 7.04885116e-01 2.42741400e-01 4.57337152e-01 6.74356276e-01 3.86465119e-01 3.59998841e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 5.99507322e-01 4.04333519e-01 5.58025930e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 6.40342586e-01 9.12920568e-02 3.25759566e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 6.38419739e-01 1.52495860e-01 5.42853807e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 5.02086847e-01 5.36915411e-01 3.91623568e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 2.93080452e-01 4.76318217e-01 6.15661245e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.54102049e-01 2.74010313e-01 5.73290265e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.96008875e-01 2.98719741e-01 3.61220283e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 2.06452153e-01 9.86255939e-03 3.89644671e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 5.17509951e-01 -2.15134087e-01 5.98024945e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 4.74853619e-01 -2.46084080e-02 3.68594431e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 + 2.50599317e-01 -7.83894535e-01 5.11804036e-01 9.82327943e-02 -6.72035342e-01 3.72037181e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 + 2.50599317e-01 -7.83894535e-01 5.11804036e-01 3.28121624e-01 -8.49551321e-01 3.46102016e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 7.66356282e-02 -8.78053588e-01 3.05691362e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 3.29756088e-01 -6.25787358e-01 5.40735350e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 + 2.50599317e-01 -7.83894535e-01 5.11804036e-01 3.88510154e-01 -5.89461586e-01 3.63895231e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 1.13736630e-01 -6.46903042e-01 5.76805303e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.35653026e-01 -7.76819330e-01 4.09917997e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.35932372e-01 -2.58298135e-01 4.22317249e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 2.10835765e-01 -4.82328769e-01 6.19792310e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.35318969e-01 -5.37877144e-01 3.62250274e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -3.89726360e-02 -7.67790024e-01 4.34619372e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -3.59391308e-02 -2.03257689e-01 4.35259277e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 1.02315219e-02 -5.37150482e-01 4.20471829e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 2.61416281e-01 -5.45905843e-01 3.95165042e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 + -2.53733289e-01 7.78555773e-01 5.11047110e-01 -8.25167220e-02 6.73312728e-01 3.67272905e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 + -2.53733289e-01 7.78555773e-01 5.11047110e-01 -4.06390225e-01 8.84851733e-01 3.68513364e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 + -2.53733289e-01 7.78555773e-01 5.11047110e-01 -8.07903092e-02 9.11573619e-01 2.97237482e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 + -2.53733289e-01 7.78555773e-01 5.11047110e-01 -8.58820300e-02 6.50054241e-01 5.67754803e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + -2.53733289e-01 7.78555773e-01 5.11047110e-01 -3.98019160e-01 6.61778683e-01 5.27599653e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -3.83713340e-01 5.79290527e-01 2.90966670e-01 -2.53733289e-01 7.78555773e-01 5.11047110e-01 + -1.11217671e-02 4.85990029e-01 5.72847359e-01 -4.17549435e-02 4.68794929e-01 3.99704026e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 + -1.11217671e-02 4.85990029e-01 5.72847359e-01 -8.62433715e-03 7.68046292e-01 3.62598309e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 4.72603647e-02 2.60598065e-01 3.58691736e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + -1.11217671e-02 4.85990029e-01 5.72847359e-01 2.63667927e-01 5.34896477e-01 4.03972542e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -2.77106172e-01 5.34616959e-01 4.09428800e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 -2.41034104e-01 5.20378300e-01 6.02699285e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.07475027e-01 7.28034881e-01 3.86127502e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 -7.98955491e-01 5.10214676e-01 3.87138041e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.75265423e-01 5.04451697e-01 3.87698574e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 + 7.50000000e-01 1.00000000e+00 4.00000000e-01 8.45475195e-01 8.84627708e-01 3.66595319e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 + 7.50000000e-01 1.00000000e+00 4.00000000e-01 6.25000000e-01 1.00000000e+00 3.00000000e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 + 7.50000000e-01 1.00000000e+00 4.00000000e-01 8.75000000e-01 1.00000000e+00 3.00000000e-01 1.00000000e+00 1.00000000e+00 2.00000000e-01 + 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 6.25000000e-01 3.00000000e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 + 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 8.75000000e-01 3.00000000e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 + 1.00000000e+00 7.50000000e-01 4.00000000e-01 7.26423473e-01 8.47808821e-01 3.23373747e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -7.25894247e-01 -6.33471200e-01 3.05759085e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 + -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -6.25000000e-01 3.00000000e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 + -1.00000000e+00 -7.50000000e-01 4.00000000e-01 -8.41359974e-01 -8.55291732e-01 4.45078619e-01 -7.50000000e-01 -1.00000000e+00 4.00000000e-01 + -1.00000000e+00 -7.50000000e-01 4.00000000e-01 -1.00000000e+00 -8.75000000e-01 3.00000000e-01 -1.00000000e+00 -1.00000000e+00 2.00000000e-01 + -1.00000000e+00 -7.50000000e-01 4.00000000e-01 -7.35636166e-01 -9.14471411e-01 2.96486738e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -6.25000000e-01 -1.00000000e+00 3.00000000e-01 -7.50000000e-01 -1.00000000e+00 4.00000000e-01 + -7.50000000e-01 -1.00000000e+00 4.00000000e-01 -8.75000000e-01 -1.00000000e+00 3.00000000e-01 -1.00000000e+00 -1.00000000e+00 2.00000000e-01 + 1.00000000e+00 1.00000000e+00 2.00000000e-01 7.50000000e-01 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 + 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e-01 1.00000000e+00 1.00000000e+00 -5.31241717e-13 + 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 7.50000000e-01 2.00000000e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 + 1.00000000e+00 1.00000000e+00 -5.31241717e-13 7.50000000e-01 1.00000000e+00 -5.31234778e-13 5.00000000e-01 1.00000000e+00 -5.31227839e-13 + 1.00000000e+00 1.00000000e+00 -5.31241717e-13 1.00000000e+00 1.00000000e+00 -1.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 + 1.00000000e+00 1.00000000e+00 -5.31241717e-13 1.00000000e+00 7.50000000e-01 -5.31241717e-13 1.00000000e+00 5.00000000e-01 -5.31241717e-13 + 1.00000000e+00 5.00000000e-01 2.00000000e-01 7.76674569e-01 7.26859181e-01 1.72211633e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 + 1.00000000e+00 5.00000000e-01 2.00000000e-01 7.09785534e-01 5.22335130e-01 2.05561253e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 1.00000000e+00 5.00000000e-01 -5.31241717e-13 + 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 2.50000000e-01 2.00000000e-01 1.00000000e+00 -2.75279799e-12 2.00000000e-01 + 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.99664140e-01 7.72204924e-01 4.51198643e-03 5.00000000e-01 1.00000000e+00 -5.31227839e-13 + 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.87671700e-01 5.18477684e-01 2.65507873e-02 4.74690996e-01 4.58616508e-01 1.67721786e-02 + 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 5.00000000e-01 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 2.50000000e-01 -5.31234778e-13 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 7.52525595e-01 2.86581382e-01 1.66552045e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 7.25774237e-01 3.88941110e-02 1.75910664e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.50000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 2.00000000e-01 + 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 7.46866862e-01 2.99271142e-01 3.61728318e-02 4.74690996e-01 4.58616508e-01 1.67721786e-02 + 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 7.57978864e-01 -4.51872992e-02 -3.48262680e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 + 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -2.50000000e-01 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 7.47570636e-01 -2.54779531e-01 1.59569447e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 7.78210727e-01 -4.61807554e-01 2.30335534e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -7.50000000e-01 2.00000000e-01 1.00000000e+00 -1.00000000e+00 2.00000000e-01 + 1.00000000e+00 -1.00000000e+00 2.00000000e-01 7.14522757e-01 -7.25196948e-01 2.36606326e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 + 1.00000000e+00 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 + 5.00000000e-01 -1.00000000e+00 2.00000000e-01 7.50000000e-01 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 2.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 7.93299243e-01 -2.90391319e-01 -3.62303831e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 7.54486357e-01 -4.65779570e-01 4.65500115e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -7.50000000e-01 -5.31234778e-13 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 + 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 7.26655468e-01 -7.89341408e-01 -3.68835602e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -1.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 7.50000000e-01 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 + 5.00000000e-01 1.00000000e+00 2.00000000e-01 5.28371569e-01 7.31981280e-01 1.80526485e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 + 5.00000000e-01 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 + 5.00000000e-01 1.00000000e+00 2.00000000e-01 2.50000000e-01 1.00000000e+00 2.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 + 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.35060517e-01 7.11084213e-01 3.07005869e-02 4.74690996e-01 4.58616508e-01 1.67721786e-02 + 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.00000000e-01 1.00000000e+00 -1.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 + 5.00000000e-01 1.00000000e+00 -5.31227839e-13 2.50000000e-01 1.00000000e+00 -5.31227839e-13 2.75282575e-12 1.00000000e+00 -5.31227839e-13 + 4.73613416e-01 4.84779377e-01 2.21525496e-01 2.27310774e-01 7.50367447e-01 1.51428925e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 + 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 + 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.41273947e-01 2.03808786e-01 1.77879250e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 + 4.73613416e-01 4.84779377e-01 2.21525496e-01 2.73566555e-01 4.76029587e-01 1.73172971e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 + 4.74690996e-01 4.58616508e-01 1.67721786e-02 2.25211425e-01 7.87891962e-01 -9.39040992e-03 2.75282575e-12 1.00000000e+00 -5.31227839e-13 + 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.66910018e-01 2.73420339e-01 -3.10515091e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + 4.74690996e-01 4.58616508e-01 1.67721786e-02 2.50541089e-01 4.67220969e-01 2.82588122e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 2.40441268e-01 2.83346403e-01 1.50696662e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 5.43805201e-01 -2.74415027e-01 2.11309501e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 2.23011615e-01 1.94781990e-02 2.06619987e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + 5.26291307e-01 -4.64778992e-02 3.48283959e-02 2.13344831e-01 2.10777877e-01 4.68667057e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 + 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + 5.26291307e-01 -4.64778992e-02 3.48283959e-02 5.30532753e-01 -2.53759366e-01 -1.51549915e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + 5.26291307e-01 -4.64778992e-02 3.48283959e-02 2.14876777e-01 2.66014695e-02 1.95716027e-03 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 2.05807723e-01 -2.92057599e-01 2.49152401e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 5.12062842e-01 -7.55583018e-01 1.82592331e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 2.88915450e-01 -4.61771744e-01 1.74109319e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 + 5.00000000e-01 -1.00000000e+00 2.00000000e-01 2.77497180e-01 -7.19878125e-01 1.95986034e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 + 5.00000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 2.50000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 + 5.46530874e-01 -5.43099550e-01 4.99998474e-02 2.59869475e-01 -2.70162767e-01 4.79134093e-02 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 + 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + 5.46530874e-01 -5.43099550e-01 4.99998474e-02 5.05907645e-01 -7.32869598e-01 2.79303667e-02 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 + 5.46530874e-01 -5.43099550e-01 4.99998474e-02 2.31820423e-01 -4.57386697e-01 -3.55934140e-02 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 + 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 2.23826516e-01 -7.74391768e-01 1.31086499e-02 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 + 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 2.50000000e-01 -1.00000000e+00 -5.31234778e-13 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 + 2.75279799e-12 1.00000000e+00 2.00000000e-01 -3.53943667e-02 7.95048004e-01 1.62037283e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 + 2.75279799e-12 1.00000000e+00 2.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 2.75282575e-12 1.00000000e+00 -5.31227839e-13 + 2.75279799e-12 1.00000000e+00 2.00000000e-01 -2.50000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 + 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -3.45519822e-02 7.37504497e-01 1.05620299e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 + 2.75282575e-12 1.00000000e+00 -5.31227839e-13 2.75281187e-12 1.00000000e+00 -1.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 + 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -2.50000000e-01 1.00000000e+00 -5.31234778e-13 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 + -5.74150632e-03 4.80713344e-01 2.07813459e-01 -2.53227207e-01 7.14537335e-01 2.02758030e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 + -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 + -5.74150632e-03 4.80713344e-01 2.07813459e-01 -2.43345247e-02 2.90903903e-01 2.44414284e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 + -5.74150632e-03 4.80713344e-01 2.07813459e-01 -2.42505771e-01 5.27802195e-01 1.79263697e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 + -2.11337044e-02 5.20175598e-01 1.44520351e-02 -2.28102848e-01 7.22658326e-01 1.37320272e-03 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 + -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + -2.11337044e-02 5.20175598e-01 1.44520351e-02 -4.76026217e-02 2.82276674e-01 3.84082449e-03 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 + -2.11337044e-02 5.20175598e-01 1.44520351e-02 -2.19558957e-01 4.50483189e-01 4.59326437e-02 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 -2.70734059e-01 2.91861282e-01 2.01535922e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 6.10419889e-03 -2.40973228e-01 2.00005720e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 -2.45636086e-01 -6.53486695e-03 1.74146254e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 + -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -2.12499061e-01 2.63559960e-01 2.50309024e-02 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 + -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 + -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -2.58295668e-02 -2.30858335e-01 -3.01243594e-02 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 + -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -2.63967420e-01 3.93850057e-02 3.28850264e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -2.42179029e-01 -2.59704634e-01 1.80899690e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 3.87532026e-02 -7.48895411e-01 2.03633120e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -2.79454677e-01 -5.37813444e-01 2.02229801e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -2.83997912e-01 -7.90354142e-01 2.38104026e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -2.50000000e-01 -1.00000000e+00 2.00000000e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 + -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 -2.03459879e-01 -2.88663342e-01 4.05551003e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 + -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.57478130e-02 -7.19804803e-01 -2.81200514e-02 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 + -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 -2.62569079e-01 -5.25838878e-01 -5.68085725e-03 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 + -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.85273885e-01 -7.11165751e-01 -3.61668105e-02 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 + -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -2.50000000e-01 -1.00000000e+00 -5.31227839e-13 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 + -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -2.12499061e-01 2.63559960e-01 2.50309024e-02 -2.15535591e-01 2.61618867e-01 -7.11489469e-02 -2.65034132e-01 2.49773560e-01 -1.54940107e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 + 0.00000000e+00 0.00000000e+00 1.00000000e+00 2.50000000e-01 -6.88227253e-13 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 6.88199497e-13 2.50000000e-01 1.00000000e+00 2.50000000e-01 2.50000000e-01 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.50000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 + 5.00000000e-01 1.00000000e+00 6.00000000e-01 5.17477952e-01 7.34861266e-01 5.67509897e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 2.50000000e-01 1.00000000e+00 6.00000000e-01 2.64119187e-01 7.55320684e-01 6.30789065e-01 2.93080452e-01 4.76318217e-01 6.15661245e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 -1.14296843e-02 7.53313489e-01 6.07258766e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 + -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.50000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -2.50000000e-01 -1.00000000e+00 -7.00000000e-01 -2.75279799e-12 -1.00000000e+00 -7.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -2.50000000e-01 -1.00000000e+00 -6.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -7.50000000e-01 7.50000000e-01 -1.00000000e+00 -5.00000000e-01 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 + -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -2.50000000e-01 6.88199497e-13 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 -5.00000000e-01 2.50000000e-01 -1.00000000e+00 -2.50000000e-01 2.50000000e-01 -1.00000000e+00 6.88199497e-13 2.50000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.50000000e-01 5.00000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 + -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.50000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 2.77188742e-01 -7.17139646e-01 8.42606338e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 + 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 2.50000000e-01 -5.31234778e-13 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 2.50000000e-01 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -1.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 1.00000000e+00 2.50000000e-01 -2.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 + -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.50000000e-01 5.00000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.50000000e-01 -1.00000000e+00 -2.50000000e-01 7.50000000e-01 -1.00000000e+00 2.06459849e-12 7.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 + -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -5.11181119e-01 -2.33375695e-01 -8.87230609e-01 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 + -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -2.65381497e-01 5.49680483e-01 -7.32924253e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -2.28613183e-01 5.45106914e-01 -6.46579701e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -2.50000000e-01 -1.00000000e+00 6.00000000e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.00000000e-01 -2.50000000e-01 -1.00000000e+00 7.00000000e-01 -2.75281187e-12 -1.00000000e+00 7.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.50000000e-01 -1.00000000e+00 8.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -7.50000000e-01 -7.50000000e-01 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 -2.41034104e-01 5.20378300e-01 6.02699285e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -2.21417312e-01 5.15863828e-01 6.65716957e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 + 5.00000000e-01 -1.00000000e+00 6.00000000e-01 7.50000000e-01 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 7.00000000e-01 7.50000000e-01 -1.00000000e+00 7.00000000e-01 1.00000000e+00 -1.00000000e+00 7.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 7.50000000e-01 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 + -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.06459849e-12 -7.50000000e-01 1.00000000e+00 2.50000000e-01 -7.50000000e-01 1.00000000e+00 5.00000000e-01 -7.50000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 7.52525595e-01 2.86581382e-01 1.66552045e-01 7.76484374e-01 2.65167724e-01 7.90370934e-02 7.46866862e-01 2.99271142e-01 3.61728318e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 + 5.00000000e-01 -1.00000000e+00 8.00000000e-01 7.50000000e-01 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 9.00000000e-01 7.50000000e-01 -1.00000000e+00 9.00000000e-01 1.00000000e+00 -1.00000000e+00 9.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 + 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 7.93299243e-01 -2.90391319e-01 -3.62303831e-02 7.13825550e-01 -2.71445140e-01 -9.50659412e-02 7.33312257e-01 -2.43305887e-01 -1.54892254e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + -4.90548406e-01 5.30132674e-01 8.30068751e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -2.10228799e-01 5.14771634e-01 9.02850414e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -2.50000000e-01 5.00000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 7.50000000e-01 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 1.00000000e+00 5.00000000e-01 9.00000000e-01 1.00000000e+00 7.50000000e-01 9.00000000e-01 1.00000000e+00 1.00000000e+00 9.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 2.50000000e-01 6.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 7.23575875e-01 5.10278343e-01 6.17869689e-01 7.51814598e-01 2.07237914e-01 5.55841417e-01 7.17970008e-01 -1.41566063e-02 5.58387791e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.54102049e-01 2.74010313e-01 5.73290265e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 + -3.53396575e-02 -3.65929367e-02 8.03489850e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 2.96203914e-01 9.27426682e-03 8.57448194e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 0.00000000e+00 0.00000000e+00 1.00000000e+00 2.50000000e-01 -6.88227253e-13 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 + 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 7.50000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 7.50000000e-01 1.00000000e+00 6.00000000e-01 7.97988409e-01 7.05534651e-01 5.64683970e-01 7.23575875e-01 5.10278343e-01 6.17869689e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 5.17477952e-01 7.34861266e-01 5.67509897e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 + 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 2.23826516e-01 -7.74391768e-01 1.31086499e-02 2.66601615e-01 -7.12840748e-01 -1.41352413e-01 2.65193359e-01 -7.92393562e-01 -1.72384452e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -2.19558957e-01 4.50483189e-01 4.59326437e-02 -2.17332325e-01 4.93752718e-01 -7.50413917e-02 -2.47177004e-01 4.54761404e-01 -1.80487225e-01 -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -2.45636086e-01 -6.53486695e-03 1.74146254e-01 -2.64447857e-01 3.82646106e-02 1.30296298e-01 -2.63967420e-01 3.93850057e-02 3.28850264e-02 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 6.10419889e-03 -2.40973228e-01 2.00005720e-01 2.27141394e-02 -2.50202515e-01 1.20344635e-01 -2.58295668e-02 -2.30858335e-01 -3.01243594e-02 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -2.42179029e-01 -2.59704634e-01 1.80899690e-01 -2.55720849e-01 -2.79366609e-01 6.53154231e-02 -2.03459879e-01 -2.88663342e-01 4.05551003e-02 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 + -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 -2.58295668e-02 -2.30858335e-01 -3.01243594e-02 2.28749464e-02 -2.00582028e-01 -8.94271412e-02 -3.13512953e-02 -2.10861610e-01 -2.14981457e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 + -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -2.03459879e-01 -2.88663342e-01 4.05551003e-02 -2.60634612e-01 -2.00063242e-01 -5.06449660e-02 -2.21100213e-01 -2.43016960e-01 -1.67879521e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + 5.00000000e-01 1.00000000e+00 -8.00000000e-01 7.50000000e-01 1.00000000e+00 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -7.00000000e-01 7.50000000e-01 1.00000000e+00 -7.00000000e-01 1.00000000e+00 1.00000000e+00 -7.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 7.50000000e-01 1.00000000e+00 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -2.50000000e-01 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -7.00000000e-01 1.00000000e+00 -2.50000000e-01 -7.00000000e-01 1.00000000e+00 -2.75279799e-12 -7.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 1.00000000e+00 -2.50000000e-01 -6.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 + -5.00000000e-01 5.00000000e-01 1.00000000e+00 -2.50000000e-01 5.00000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 -5.00000000e-01 7.50000000e-01 1.00000000e+00 -2.50000000e-01 7.50000000e-01 1.00000000e+00 2.06459849e-12 7.50000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 + 0.00000000e+00 0.00000000e+00 -1.00000000e+00 6.88199497e-13 2.50000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 1.46127027e-02 2.13359619e-01 -9.04627392e-01 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 + -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 2.14038532e-01 2.32776886e-02 -7.40897761e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 2.02005392e-01 1.35088691e-02 -5.71704179e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 + -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -7.40704078e-01 3.39288150e-02 -3.48449259e-02 -7.44810540e-01 -4.81082601e-02 -6.40258112e-02 -7.12930596e-01 3.88167636e-02 -1.73466694e-01 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 2.50000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -7.00000000e-01 2.50000000e-01 -1.00000000e+00 -7.00000000e-01 5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 2.50000000e-01 -1.00000000e+00 -6.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -1.00000000e+00 -7.50000000e-01 2.00000000e-01 -1.00000000e+00 -7.50000000e-01 1.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 + -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -1.00000000e+00 -5.00000000e-01 -7.00000000e-01 -7.33333943e-01 -5.11203107e-01 -6.84587312e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -7.61949822e-01 -4.83182440e-01 -6.13761349e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 + -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -7.50000000e-01 2.06459849e-12 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -7.50000000e-01 2.50000000e-01 -1.00000000e+00 -5.00000000e-01 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 + -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 2.73566555e-01 4.76029587e-01 1.73172971e-01 2.33840901e-01 5.46422724e-01 1.35620504e-01 2.50541089e-01 4.67220969e-01 2.82588122e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 + -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 7.50000000e-01 6.00000000e-01 -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 5.00000000e-01 7.00000000e-01 -1.00000000e+00 7.50000000e-01 7.00000000e-01 -1.00000000e+00 1.00000000e+00 7.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 7.50000000e-01 8.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -4.79675664e-01 -7.95380719e-01 -4.19450610e-02 -4.50121192e-01 -7.26687887e-01 -1.42389739e-01 -5.35733988e-01 -7.66681895e-01 -2.22966183e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.06459849e-12 -7.50000000e-01 -1.00000000e+00 2.50000000e-01 -7.50000000e-01 -1.00000000e+00 5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 + -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -7.83341325e-01 -2.60070362e-01 1.68185936e-01 -7.66030065e-01 -2.60864541e-01 8.72945236e-02 -7.98649990e-01 -2.91977690e-01 3.76771938e-02 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 + 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 5.49044006e-01 2.77978218e-01 -8.79993852e-01 4.70494256e-01 5.00918977e-01 -8.78265196e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 + -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -1.00000000e+00 7.50000000e-01 -8.00000000e-01 -7.31238138e-01 7.17907070e-01 -8.35056375e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -7.50000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 7.25774237e-01 3.88941110e-02 1.75910664e-01 7.11903967e-01 3.98295768e-02 1.48300894e-01 7.57978864e-01 -4.51872992e-02 -3.48262680e-02 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + -2.75279799e-12 -1.00000000e+00 6.00000000e-01 2.50000000e-01 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 -2.75281187e-12 -1.00000000e+00 7.00000000e-01 2.50000000e-01 -1.00000000e+00 7.00000000e-01 5.00000000e-01 -1.00000000e+00 7.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.50000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -1.00000000e+00 -2.50000000e-01 -8.00000000e-01 -7.88665635e-01 -2.36543542e-01 -7.99934008e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 + 5.39473453e-01 5.08327524e-01 -6.09109168e-01 7.52729016e-01 4.70095302e-01 -6.25440659e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 4.67519964e-01 7.42183049e-01 -6.00421251e-01 7.77636804e-01 7.51214013e-01 -5.66621340e-01 1.00000000e+00 7.50000000e-01 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 7.50000000e-01 1.00000000e+00 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 7.11398136e-01 -5.13660148e-01 5.52310014e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 7.19685954e-01 -5.38092249e-01 6.63105132e-01 1.00000000e+00 -5.00000000e-01 7.00000000e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 + -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 3.57478130e-02 -7.19804803e-01 -2.81200514e-02 4.94908467e-02 -7.93017484e-01 -9.31060979e-02 -9.44557460e-03 -7.85213296e-01 -1.62867646e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 7.31401399e-01 2.09331713e-01 -8.31456581e-01 1.00000000e+00 2.50000000e-01 -8.00000000e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 + 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 7.50000000e-01 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -7.00000000e-01 1.00000000e+00 7.50000000e-01 -7.00000000e-01 1.00000000e+00 1.00000000e+00 -7.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 1.00000000e+00 7.50000000e-01 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -7.50000000e-01 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -1.00000000e+00 -7.00000000e-01 -1.00000000e+00 -7.50000000e-01 -7.00000000e-01 -1.00000000e+00 -5.00000000e-01 -7.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -1.00000000e+00 -7.50000000e-01 -6.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + -1.11217671e-02 4.85990029e-01 5.72847359e-01 -1.14296843e-02 7.53313489e-01 6.07258766e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 3.44545003e-03 7.95524878e-01 6.83364686e-01 2.75281187e-12 1.00000000e+00 7.00000000e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 + 0.00000000e+00 0.00000000e+00 -1.00000000e+00 2.50000000e-01 -6.88227253e-13 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 6.88199497e-13 2.50000000e-01 -1.00000000e+00 2.50000000e-01 2.50000000e-01 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.50000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 + -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -9.00000000e-01 -7.52865847e-01 4.90911941e-01 -9.21916790e-01 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 + -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 -2.50000000e-01 -5.31234778e-13 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 -2.50000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -1.00000000e+00 -2.50000000e-01 -2.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.88199497e-13 -2.50000000e-01 -1.00000000e+00 2.50000000e-01 -2.50000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 2.50000000e-01 -6.88227253e-13 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 + 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 5.41273947e-01 2.03808786e-01 1.77879250e-01 5.31942102e-01 2.25529062e-01 1.08607631e-01 4.66910018e-01 2.73420339e-01 -3.10515091e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 + -1.00000000e+00 1.00000000e+00 6.00000000e-01 -7.50000000e-01 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 -1.00000000e+00 1.00000000e+00 7.00000000e-01 -7.50000000e-01 1.00000000e+00 7.00000000e-01 -5.00000000e-01 1.00000000e+00 7.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 -7.50000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -9.00000000e-01 -1.00000000e+00 -7.50000000e-01 -9.00000000e-01 -1.00000000e+00 -5.00000000e-01 -9.00000000e-01 -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -7.50000000e-01 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 4.66910018e-01 2.73420339e-01 -3.10515091e-02 4.76512299e-01 2.60683528e-01 -1.01929594e-01 5.18687756e-01 2.90477718e-01 -2.36412455e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -5.28111386e-01 2.50109870e-01 9.29992580e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -5.00000000e-01 1.37639899e-12 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 + 5.08559128e-01 4.68350764e-02 8.47523900e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 7.22374108e-01 2.13401107e-01 8.03011000e-01 1.00000000e+00 2.50000000e-01 8.00000000e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 + -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -2.95730476e-01 2.89542210e-01 -7.89646887e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -2.42505771e-01 5.27802195e-01 1.79263697e-01 -2.28095189e-01 5.25336593e-01 1.43546881e-01 -2.19558957e-01 4.50483189e-01 4.59326437e-02 -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 -4.64893153e-01 2.04810635e-01 5.59668067e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -7.45184141e-01 4.51483100e-01 5.88051785e-01 -7.95142974e-01 2.07151268e-01 6.04806799e-01 -7.73235639e-01 4.15095151e-02 6.07357715e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 2.50000000e-01 6.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -2.50000000e-01 -1.00000000e+00 -6.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 -5.19284749e-01 -7.83778037e-01 -5.82806477e-01 -2.65648299e-01 -7.19671602e-01 -6.43801820e-01 3.60248665e-02 -7.15736638e-01 -5.56900182e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -2.63857307e-01 -5.34652399e-01 -6.28666006e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 + 1.00000000e+00 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -7.50000000e-01 8.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -1.00000000e+00 9.00000000e-01 1.00000000e+00 -7.50000000e-01 9.00000000e-01 1.00000000e+00 -5.00000000e-01 9.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 2.00000000e-01 7.76674569e-01 7.26859181e-01 1.72211633e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 7.80609159e-01 7.31793731e-01 5.71881307e-02 5.00000000e-01 1.00000000e+00 1.00000000e-01 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.99664140e-01 7.72204924e-01 4.51198643e-03 5.00000000e-01 1.00000000e+00 -5.31227839e-13 + -3.53396575e-02 -3.65929367e-02 8.03489850e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 2.82274827e-01 2.59654572e-01 8.44964730e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 + -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -9.00000000e-01 -7.50000000e-01 1.00000000e+00 -9.00000000e-01 -5.00000000e-01 1.00000000e+00 -9.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -7.50000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -7.50000000e-01 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.00000000e-01 -7.50000000e-01 -1.00000000e+00 7.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.00000000e-01 -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -7.50000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -2.94704534e-01 1.44582572e-02 5.67814283e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -2.63010629e-01 1.77410633e-02 6.90006841e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 + 5.00000000e-01 5.00000000e-01 -1.00000000e+00 7.50000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 4.70494256e-01 5.00918977e-01 -8.78265196e-01 7.19879855e-01 5.48768452e-01 -8.63196975e-01 1.00000000e+00 5.00000000e-01 -9.00000000e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 + 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.27888915e-01 -5.48643075e-01 -6.08178478e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 1.11083696e-02 -2.30119466e-01 -6.11745165e-01 2.76833698e-01 -2.76905821e-01 -6.16864592e-01 4.74472946e-01 -2.55527072e-01 -6.17101064e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 2.02005392e-01 1.35088691e-02 -5.71704179e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 + -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 -2.50000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 -2.50000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 -2.50000000e-01 -5.31234778e-13 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 + -5.00000000e-01 1.00000000e+00 2.00000000e-01 -7.50000000e-01 1.00000000e+00 2.00000000e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 -7.50000000e-01 1.00000000e+00 1.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -7.50000000e-01 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 + 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 7.25229760e-01 -2.79780535e-01 -8.34290912e-01 1.00000000e+00 -2.50000000e-01 -8.00000000e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 + -1.00000000e+00 5.00000000e-01 6.00000000e-01 -7.45184141e-01 4.51483100e-01 5.88051785e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 -1.00000000e+00 5.00000000e-01 7.00000000e-01 -7.90916359e-01 5.36974005e-01 6.99826891e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 + -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -2.50000000e-01 8.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 9.00000000e-01 -1.00000000e+00 -2.50000000e-01 9.00000000e-01 -1.00000000e+00 2.75281187e-12 9.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 + 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -9.00000000e-01 1.00000000e+00 -2.50000000e-01 -9.00000000e-01 1.00000000e+00 -2.75279799e-12 -9.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -2.50000000e-01 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 + -1.00000000e+00 2.75279799e-12 6.00000000e-01 -7.73235639e-01 4.15095151e-02 6.07357715e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -1.00000000e+00 2.75281187e-12 7.00000000e-01 -7.05885197e-01 2.69974616e-02 6.68893149e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.42189289e-01 -7.20003365e-01 6.43416688e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 2.10835765e-01 -4.82328769e-01 6.19792310e-01 2.31735043e-01 -7.93276305e-01 5.81988803e-01 2.50000000e-01 -1.00000000e+00 6.00000000e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 3.60221343e-02 -7.72494852e-01 6.10765349e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -2.43345247e-02 2.90903903e-01 2.44414284e-01 3.20890140e-02 2.59616396e-01 8.96594471e-02 -4.76026217e-02 2.82276674e-01 3.84082449e-03 -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.82020794e-01 -2.00196725e-01 6.17411358e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -7.73235639e-01 4.15095151e-02 6.07357715e-01 -7.99986121e-01 -2.14028375e-01 5.64064497e-01 -7.59878478e-01 -5.24557688e-01 6.33305260e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 -2.50000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 + 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -2.50000000e-01 1.00000000e+00 -5.31234778e-13 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 2.75281187e-12 1.00000000e+00 -1.00000000e-01 -2.50000000e-01 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -2.50000000e-01 1.00000000e+00 -2.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 + -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.02499262e-02 -2.79583390e-01 6.39593268e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -2.94704534e-01 1.44582572e-02 5.67814283e-01 -2.25709597e-01 -2.33251108e-01 6.46679467e-01 -2.04187698e-01 -5.48263988e-01 6.12094029e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.82020794e-01 -2.00196725e-01 6.17411358e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 + -1.11217671e-02 4.85990029e-01 5.72847359e-01 -2.39636276e-02 2.31604414e-01 6.19527443e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 -2.41034104e-01 5.20378300e-01 6.02699285e-01 -2.15043147e-01 2.05203476e-01 5.68812565e-01 -2.94704534e-01 1.44582572e-02 5.67814283e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 -4.64893153e-01 2.04810635e-01 5.59668067e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 + 2.75282575e-12 1.00000000e+00 -5.31227839e-13 2.75281187e-12 1.00000000e+00 -1.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -3.45519822e-02 7.37504497e-01 1.05620299e-02 3.44552812e-02 7.37574673e-01 -1.38711399e-01 -3.15411016e-02 7.00464728e-01 -2.42853436e-01 -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 -1.14296843e-02 7.53313489e-01 6.07258766e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 -2.50000000e-01 1.00000000e+00 6.00000000e-01 -2.72755360e-01 7.15032247e-01 6.02577623e-01 -2.41034104e-01 5.20378300e-01 6.02699285e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 -4.56240197e-01 7.11292251e-01 5.92377271e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 + -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.64893153e-01 2.04810635e-01 5.59668067e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -4.69492008e-01 2.57976966e-01 6.77767528e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 2.23011615e-01 1.94781990e-02 2.06619987e-01 2.01684799e-01 4.88797843e-02 1.48139293e-01 2.14876777e-01 2.66014695e-02 1.95716027e-03 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -2.53227207e-01 7.14537335e-01 2.02758030e-01 -2.13323976e-01 7.35002433e-01 9.51784736e-02 -2.28102848e-01 7.22658326e-01 1.37320272e-03 -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 5.17509951e-01 -2.15134087e-01 5.98024945e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 2.01691136e-01 -4.79247863e-02 5.66882667e-01 2.94243327e-01 -2.87957389e-01 5.56444701e-01 2.10835765e-01 -4.82328769e-01 6.19792310e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.02499262e-02 -2.79583390e-01 6.39593268e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 + -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 2.50000000e-01 6.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 2.75281187e-12 7.00000000e-01 -1.00000000e+00 2.50000000e-01 7.00000000e-01 -1.00000000e+00 5.00000000e-01 7.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 2.50000000e-01 8.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 + -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 2.13344831e-01 2.10777877e-01 4.68667057e-02 2.22576016e-01 2.04838706e-01 -1.00925875e-01 2.36689214e-01 2.40025704e-01 -2.25657165e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 -7.67432407e-01 2.08191458e-01 2.61816764e-03 -7.08450227e-01 2.38510901e-01 -1.26958943e-01 -7.24152013e-01 2.00649807e-01 -2.38729769e-01 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.50000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 2.06459849e-12 7.50000000e-01 -1.00000000e+00 2.50000000e-01 7.50000000e-01 -1.00000000e+00 5.00000000e-01 7.50000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 + 2.75279799e-12 1.00000000e+00 2.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -3.53943667e-02 7.95048004e-01 1.62037283e-01 -3.49270172e-02 7.63273779e-01 5.91600180e-02 -3.45519822e-02 7.37504497e-01 1.05620299e-02 -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 + 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -7.50000000e-01 6.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 7.11398136e-01 -5.13660148e-01 5.52310014e-01 7.32571339e-01 -7.61216029e-01 6.20459438e-01 7.50000000e-01 -1.00000000e+00 6.00000000e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.42189289e-01 -7.20003365e-01 6.43416688e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 + 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -7.50000000e-01 -1.00000000e+00 7.50000000e-01 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 5.05907645e-01 -7.32869598e-01 2.79303667e-02 4.95446617e-01 -7.29120389e-01 -1.04315842e-01 5.36834601e-01 -7.39180893e-01 -1.78471564e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -5.48640676e-01 -7.77286265e-01 6.36669671e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.00000000e-01 -1.00000000e+00 7.00000000e-01 -5.02370261e-01 -7.91518206e-01 6.60988572e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 + 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 2.50000000e-01 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -7.00000000e-01 1.00000000e+00 2.50000000e-01 -7.00000000e-01 1.00000000e+00 5.00000000e-01 -7.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 1.00000000e+00 2.50000000e-01 -6.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 + -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -2.62569079e-01 -5.25838878e-01 -5.68085725e-03 -2.72291227e-01 -5.32628105e-01 -1.14187988e-01 -2.22977063e-01 -5.36870853e-01 -1.64641576e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 + -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 2.31820423e-01 -4.57386697e-01 -3.55934140e-02 2.37982533e-01 -5.10337522e-01 -1.14207159e-01 2.18684050e-01 -4.94833636e-01 -2.33971621e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -7.59878478e-01 -5.24557688e-01 6.33305260e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -1.00000000e+00 -5.00000000e-01 7.00000000e-01 -7.59472965e-01 -5.02881516e-01 7.38765409e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 2.50000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 2.50000000e-01 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 2.50000000e-01 -1.00000000e+00 -5.31234778e-13 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 + -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -7.50000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.00000000e-01 -1.00000000e+00 -7.50000000e-01 7.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.00000000e-01 -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -7.50000000e-01 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -7.50000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -7.50000000e-01 8.00000000e-01 -7.94077294e-01 -7.29781627e-01 8.17530363e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 + 5.00000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 2.77497180e-01 -7.19878125e-01 1.95986034e-01 2.24704868e-01 -7.88569663e-01 1.13411313e-01 2.23826516e-01 -7.74391768e-01 1.31086499e-02 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 + -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -7.50000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -1.00000000e+00 9.00000000e-01 -7.50000000e-01 -1.00000000e+00 9.00000000e-01 -5.00000000e-01 -1.00000000e+00 9.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 + -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -2.75281187e-12 -1.00000000e+00 9.00000000e-01 -2.28732857e-02 -7.61541694e-01 8.88090565e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -2.06459849e-12 -7.50000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 7.50000000e-01 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 7.50000000e-01 -1.00000000e+00 -1.00000000e-01 1.00000000e+00 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 7.50000000e-01 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 + 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 5.30532753e-01 -2.53759366e-01 -1.51549915e-02 4.90819038e-01 -2.14919321e-01 -1.40540093e-01 5.01218023e-01 -2.35503536e-01 -2.00080801e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -2.50000000e-01 6.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.00000000e-01 -1.00000000e+00 -2.50000000e-01 7.00000000e-01 -1.00000000e+00 2.75281187e-12 7.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -2.50000000e-01 8.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 + -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -5.00000000e-01 -1.00000000e+00 9.00000000e-01 -5.20495037e-01 -7.77704044e-01 8.79566485e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 + 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 7.04226346e-01 -5.33764662e-01 -7.06492701e-01 1.00000000e+00 -5.00000000e-01 -7.00000000e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 7.71083683e-01 -4.83737049e-01 -6.24197292e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 2.88915450e-01 -4.61771744e-01 1.74109319e-01 2.28173133e-01 -5.09392108e-01 1.34063192e-01 2.31820423e-01 -4.57386697e-01 -3.55934140e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -7.50000000e-01 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -1.00000000e+00 9.00000000e-01 -1.00000000e+00 -7.50000000e-01 9.00000000e-01 -1.00000000e+00 -5.00000000e-01 9.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 + -2.75279799e-12 -1.00000000e+00 6.00000000e-01 3.60221343e-02 -7.72494852e-01 6.10765349e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -2.75281187e-12 -1.00000000e+00 7.00000000e-01 1.54198591e-02 -7.86098098e-01 7.05519830e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 + 2.75279799e-12 1.00000000e+00 2.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 2.75282575e-12 1.00000000e+00 -5.31227839e-13 2.27310774e-01 7.50367447e-01 1.51428925e-01 2.35712313e-01 7.34476903e-01 9.71369534e-02 2.25211425e-01 7.87891962e-01 -9.39040992e-03 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 + -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -7.50000000e-01 -7.50000000e-01 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 + -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 2.59869475e-01 -2.70162767e-01 4.79134093e-02 2.85533067e-01 -2.58500990e-01 -6.62226701e-02 2.04134141e-01 -2.14922092e-01 -1.63726058e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -4.82020794e-01 -2.00196725e-01 6.17411358e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -4.91940785e-01 -2.39979097e-01 7.16130302e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 + -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -9.00000000e-01 -1.00000000e+00 2.50000000e-01 -9.00000000e-01 -1.00000000e+00 5.00000000e-01 -9.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 2.50000000e-01 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 + -4.84577644e-02 4.06855736e-02 5.60664410e-01 2.01691136e-01 -4.79247863e-02 5.66882667e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 2.70866450e-01 -4.38531841e-02 6.54144931e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 + -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -1.00000000e+00 2.50000000e-01 -8.00000000e-01 -7.29872639e-01 2.64553952e-01 -7.78492596e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 + 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.09785534e-01 5.22335130e-01 2.05561253e-01 7.95377159e-01 5.22307345e-01 5.89737900e-02 7.87671700e-01 5.18477684e-01 2.65507873e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 + 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 2.59156804e-01 -2.85490835e-01 7.91022691e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 + -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -5.26704500e-01 2.53252518e-01 -7.26842404e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -5.26541160e-01 2.33288068e-01 -5.82433991e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 7.50000000e-01 -5.31241717e-13 1.00000000e+00 1.00000000e+00 -5.31241717e-13 1.00000000e+00 5.00000000e-01 -1.00000000e-01 1.00000000e+00 7.50000000e-01 -1.00000000e-01 1.00000000e+00 1.00000000e+00 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 1.00000000e+00 7.50000000e-01 -2.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 + -1.37639899e-12 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.88199497e-13 -2.50000000e-01 1.00000000e+00 2.50000000e-01 -2.50000000e-01 1.00000000e+00 5.00000000e-01 -2.50000000e-01 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 2.50000000e-01 -6.88227253e-13 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 + -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -7.26284734e-01 -3.76036267e-02 -5.64749763e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -1.00000000e+00 2.50000000e-01 -6.00000000e-01 -7.01047458e-01 2.47221224e-01 -5.89995842e-01 -5.26541160e-01 2.33288068e-01 -5.82433991e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -7.12353132e-01 4.56004138e-01 -5.52765752e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -5.10889643e-01 -2.94528054e-01 8.51977078e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.50000000e-01 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 + -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -4.76026217e-02 2.82276674e-01 3.84082449e-03 4.52336604e-02 2.76361751e-01 -7.78870807e-02 -3.44384684e-02 2.18713663e-01 -1.85579955e-01 -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 4.54102049e-01 2.74010313e-01 5.73290265e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 5.09187334e-01 2.18772295e-01 6.80590123e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 + 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 2.05807723e-01 -2.92057599e-01 2.49152401e-01 2.34302097e-01 -2.75019978e-01 6.06487445e-02 2.59869475e-01 -2.70162767e-01 4.79134093e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + -1.00000000e+00 2.75282575e-12 8.00000000e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -1.00000000e+00 2.75281187e-12 9.00000000e-01 -7.29534696e-01 6.61373956e-03 9.29991955e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -7.50000000e-01 2.06459849e-12 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 + 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e-01 1.00000000e+00 1.00000000e+00 -5.31241717e-13 7.50000000e-01 1.00000000e+00 2.00000000e-01 7.50000000e-01 1.00000000e+00 1.00000000e-01 7.50000000e-01 1.00000000e+00 -5.31234778e-13 5.00000000e-01 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 5.17477952e-01 7.34861266e-01 5.67509897e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 5.05493198e-01 7.94081692e-01 6.67733701e-01 5.00000000e-01 1.00000000e+00 7.00000000e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -7.50000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -7.00000000e-01 -7.50000000e-01 1.00000000e+00 -7.00000000e-01 -5.00000000e-01 1.00000000e+00 -7.00000000e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -7.50000000e-01 1.00000000e+00 -6.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + 2.75282575e-12 1.00000000e+00 8.00000000e-01 2.50000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 2.75281187e-12 1.00000000e+00 9.00000000e-01 2.50000000e-01 1.00000000e+00 9.00000000e-01 5.00000000e-01 1.00000000e+00 9.00000000e-01 2.75279799e-12 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -2.50000000e-01 -1.00000000e+00 -9.00000000e-01 -2.75279799e-12 -1.00000000e+00 -9.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.50000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 + -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 2.40441268e-01 2.83346403e-01 1.50696662e-01 2.38947474e-01 2.95979598e-01 1.31650817e-01 2.13344831e-01 2.10777877e-01 4.68667057e-02 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + -1.00000000e+00 2.75279799e-12 1.00000000e+00 -7.50000000e-01 2.06459849e-12 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -7.50000000e-01 2.50000000e-01 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -7.50000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 + 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.50000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 2.06459849e-12 7.50000000e-01 1.00000000e+00 2.50000000e-01 7.50000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 + -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -2.06459849e-12 -7.50000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -9.00000000e-01 -2.06581389e-02 -7.49278174e-01 -9.41629170e-01 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 + -5.01288867e-01 4.74009546e-01 6.17231993e-01 -4.56240197e-01 7.11292251e-01 5.92377271e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -5.27884453e-01 7.97048020e-01 6.71562856e-01 -5.00000000e-01 1.00000000e+00 7.00000000e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 + 1.00000000e+00 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -7.50000000e-01 6.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -1.00000000e+00 7.00000000e-01 1.00000000e+00 -7.50000000e-01 7.00000000e-01 1.00000000e+00 -5.00000000e-01 7.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -7.50000000e-01 8.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.50000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -2.45742871e-01 -7.52046777e-01 -8.39572117e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 + 5.00000000e-01 -1.00000000e+00 8.00000000e-01 7.50000000e-01 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 7.51069508e-01 -7.07408008e-01 8.39705657e-01 1.00000000e+00 -7.50000000e-01 8.00000000e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 + -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 -2.75279799e-12 -1.00000000e+00 -7.00000000e-01 -2.70961176e-02 -7.37320417e-01 -6.87869549e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 3.60248665e-02 -7.15736638e-01 -5.56900182e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 + 4.04523035e-02 5.23334239e-01 7.85315811e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 2.35000252e-01 7.49957074e-01 7.94740858e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 2.50000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -7.12353132e-01 4.56004138e-01 -5.52765752e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -1.00000000e+00 7.50000000e-01 -6.00000000e-01 -7.67490944e-01 7.75022398e-01 -6.48454342e-01 -4.72348517e-01 7.55363920e-01 -5.93158920e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -7.50000000e-01 1.00000000e+00 -6.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 2.50541089e-01 4.67220969e-01 2.82588122e-02 2.34564795e-01 4.88885339e-01 -7.66427520e-02 2.61566778e-01 5.28349093e-01 -1.69349915e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + -1.00000000e+00 5.00000000e-01 8.00000000e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -1.00000000e+00 5.00000000e-01 9.00000000e-01 -7.42909951e-01 4.51398944e-01 8.58817844e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -7.50000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 + -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.48640676e-01 -7.77286265e-01 6.36669671e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -7.59878478e-01 -5.24557688e-01 6.33305260e-01 -7.03347218e-01 -7.36344433e-01 6.43319627e-01 -7.50000000e-01 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -7.50000000e-01 6.00000000e-01 -1.00000000e+00 -1.00000000e+00 6.00000000e-01 + 5.00000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 7.50000000e-01 7.50000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 + -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -1.00000000e+00 -1.00000000e+00 -1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.31241717e-13 -1.00000000e+00 -7.50000000e-01 -1.00000000e-01 -1.00000000e+00 -7.50000000e-01 -2.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -2.50000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -7.00000000e-01 -2.50000000e-01 1.00000000e+00 -7.00000000e-01 2.75279799e-12 1.00000000e+00 -7.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -2.50000000e-01 1.00000000e+00 -6.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 + 2.75279799e-12 1.00000000e+00 6.00000000e-01 2.50000000e-01 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 2.75281187e-12 1.00000000e+00 7.00000000e-01 2.50000000e-01 1.00000000e+00 7.00000000e-01 5.00000000e-01 1.00000000e+00 7.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 2.50000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 7.50000000e-01 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -7.00000000e-01 -1.00000000e+00 7.50000000e-01 -7.00000000e-01 -1.00000000e+00 1.00000000e+00 -7.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -1.00000000e+00 7.50000000e-01 -6.00000000e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 + 5.00000000e-01 1.00000000e+00 8.00000000e-01 7.50000000e-01 1.00000000e+00 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 9.00000000e-01 7.50000000e-01 1.00000000e+00 9.00000000e-01 1.00000000e+00 1.00000000e+00 9.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -7.38622456e-01 -7.20629057e-01 2.58153547e-02 -7.63629266e-01 -7.27495781e-01 -1.42653195e-01 -7.19737040e-01 -7.37267268e-01 -1.68057480e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + 2.81216416e-02 5.47228351e-01 -7.57921741e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 1.33234453e-02 7.24462490e-01 -6.76076913e-01 2.75279799e-12 1.00000000e+00 -7.00000000e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 -3.85304003e-02 7.30500373e-01 -6.37788061e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 + -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 -1.89088984e-02 2.07719227e-01 8.55329884e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 0.00000000e+00 0.00000000e+00 1.00000000e+00 6.88199497e-13 2.50000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 + -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -7.50000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -1.00000000e+00 -7.00000000e-01 -7.50000000e-01 -1.00000000e+00 -7.00000000e-01 -5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -7.50000000e-01 -1.00000000e+00 -6.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 + 5.36295327e-01 5.28286707e-01 7.83714183e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 7.79818509e-01 7.49717783e-01 8.31083095e-01 1.00000000e+00 7.50000000e-01 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 7.50000000e-01 1.00000000e+00 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -7.50000000e-01 -1.00000000e+00 -5.31234778e-13 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -1.00000000e+00 -1.00000000e+00 -1.00000000e-01 -7.50000000e-01 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 -7.50000000e-01 -1.00000000e+00 -2.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -9.00000000e-01 -2.50000000e-01 1.00000000e+00 -9.00000000e-01 2.75279799e-12 1.00000000e+00 -9.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -2.50000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 + -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -2.50000000e-01 -2.50000000e-01 -1.00000000e+00 -6.88199497e-13 -2.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -2.50000000e-01 6.88199497e-13 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 + 5.12293954e-01 -5.47020830e-01 8.46585454e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 7.38902114e-01 -5.23320664e-01 8.68218662e-01 1.00000000e+00 -5.00000000e-01 9.00000000e-01 5.00000000e-01 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 + 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 4.56683653e-01 2.50938894e-01 8.63551567e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 5.00000000e-01 -1.37645451e-12 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 + -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -9.00000000e-01 -1.00000000e+00 7.50000000e-01 -9.00000000e-01 -1.00000000e+00 1.00000000e+00 -9.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 7.50000000e-01 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 + 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 7.50000000e-01 6.00000000e-01 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 5.00000000e-01 7.00000000e-01 1.00000000e+00 7.50000000e-01 7.00000000e-01 1.00000000e+00 1.00000000e+00 7.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 7.50000000e-01 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 + 1.00000000e+00 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 7.14522757e-01 -7.25196948e-01 2.36606326e-01 7.44995213e-01 -7.45126879e-01 1.11682616e-01 7.26655468e-01 -7.89341408e-01 -3.68835602e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.50000000e-01 1.00000000e+00 -2.50000000e-01 -2.50000000e-01 1.00000000e+00 -6.88199497e-13 -2.50000000e-01 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 -2.50000000e-01 6.88199497e-13 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -4.79293826e-01 -7.15374773e-01 -9.46229465e-01 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 + -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.50000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.75281187e-12 -1.00000000e+00 9.00000000e-01 2.50000000e-01 -1.00000000e+00 9.00000000e-01 5.00000000e-01 -1.00000000e+00 9.00000000e-01 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 + -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -7.61949822e-01 -4.83182440e-01 -6.13761349e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -1.00000000e+00 -2.50000000e-01 -6.00000000e-01 -7.97759817e-01 -2.64304369e-01 -6.46363315e-01 -5.37458717e-01 -2.20855384e-01 -6.15373185e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -7.26284734e-01 -3.76036267e-02 -5.64749763e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 + 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -7.50000000e-01 1.00000000e+00 7.50000000e-01 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 + -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -6.88199497e-13 -2.50000000e-01 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 4.55758302e-02 -2.79320737e-01 -9.46636603e-01 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 + 5.00000000e-01 -1.37645451e-12 1.00000000e+00 7.50000000e-01 -2.06462625e-12 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 7.50000000e-01 2.50000000e-01 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 + -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -2.27518950e-01 -3.08139637e-02 -6.49633469e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 -5.26541160e-01 2.33288068e-01 -5.82433991e-01 -2.05802848e-01 2.29052059e-01 -5.57243933e-01 4.76975638e-03 2.22747039e-01 -5.54198113e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -2.28613183e-01 5.45106914e-01 -6.46579701e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.00000000e-01 1.00000000e+00 -1.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 5.35060517e-01 7.11084213e-01 3.07005869e-02 4.95011847e-01 7.79566521e-01 -9.99144674e-02 5.10729093e-01 7.60639709e-01 -2.14082050e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + -1.00000000e+00 5.00000000e-01 1.00000000e+00 -7.50000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -7.50000000e-01 7.50000000e-01 1.00000000e+00 -5.00000000e-01 7.50000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 + -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -4.87976075e-01 7.73594387e-01 -8.52717303e-01 -5.00000000e-01 1.00000000e+00 -9.00000000e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 + 5.36295327e-01 5.28286707e-01 7.83714183e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 7.37698002e-01 4.70873997e-01 8.70680706e-01 1.00000000e+00 5.00000000e-01 9.00000000e-01 5.00000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 2.00000000e-01 7.50000000e-01 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 7.50000000e-01 -1.00000000e+00 1.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 7.50000000e-01 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 + 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 -2.10803822e-02 -2.49912051e-01 8.81721294e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 -6.88199497e-13 -2.50000000e-01 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 + -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 7.50000000e-01 8.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 -1.00000000e+00 5.00000000e-01 9.00000000e-01 -1.00000000e+00 7.50000000e-01 9.00000000e-01 -1.00000000e+00 1.00000000e+00 9.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 7.23575875e-01 5.10278343e-01 6.17869689e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 7.48327818e-01 4.69342848e-01 6.87791918e-01 1.00000000e+00 5.00000000e-01 7.00000000e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 + -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.50000000e-01 5.00000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -2.06103308e-01 5.18738661e-01 -8.84719218e-01 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 + -1.11217671e-02 4.85990029e-01 5.72847359e-01 2.93080452e-01 4.76318217e-01 6.15661245e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 2.18923350e-01 4.98121341e-01 7.08619968e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 + 1.00000000e+00 1.00000000e+00 -5.31241717e-13 1.00000000e+00 1.00000000e+00 -1.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 7.50000000e-01 1.00000000e+00 -5.31234778e-13 7.50000000e-01 1.00000000e+00 -1.00000000e-01 7.50000000e-01 1.00000000e+00 -2.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.00000000e-01 1.00000000e+00 -1.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 + 1.00000000e+00 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -7.50000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e-01 1.00000000e+00 -7.50000000e-01 1.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -7.50000000e-01 -5.31234778e-13 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 + -4.84577644e-02 4.06855736e-02 5.60664410e-01 -2.39636276e-02 2.31604414e-01 6.19527443e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 3.19092115e-02 2.63598931e-01 7.32473554e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 + -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -9.00000000e-01 -7.10966190e-01 -5.46091036e-01 -8.82215202e-01 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 + 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -7.50000000e-01 -5.31234778e-13 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -1.00000000e+00 -1.00000000e-01 1.00000000e+00 -7.50000000e-01 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -7.50000000e-01 -2.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -4.02499262e-02 -2.79583390e-01 6.39593268e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 4.43906404e-02 -2.23005081e-01 7.48947550e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 + 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.99664140e-01 7.72204924e-01 4.51198643e-03 5.00000000e-01 1.00000000e+00 -5.31227839e-13 1.00000000e+00 5.00000000e-01 -1.00000000e-01 7.31534570e-01 7.43038376e-01 -9.77085297e-02 5.00000000e-01 1.00000000e+00 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 7.34916653e-01 7.05552036e-01 -1.88958584e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 + 5.12293954e-01 -5.47020830e-01 8.46585454e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 4.78844536e-01 -2.27741543e-01 8.72881996e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 5.00000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -2.50000000e-01 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 + -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -1.00000000e+00 5.00000000e-01 -7.00000000e-01 -7.76218534e-01 4.87491134e-01 -7.30700101e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -7.12353132e-01 4.56004138e-01 -5.52765752e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 + 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 2.50000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 -2.75281187e-12 7.00000000e-01 1.00000000e+00 2.50000000e-01 7.00000000e-01 1.00000000e+00 5.00000000e-01 7.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 2.50000000e-01 8.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 + 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -1.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 7.26655468e-01 -7.89341408e-01 -3.68835602e-02 7.83139868e-01 -7.01991015e-01 -1.19380168e-01 7.56483320e-01 -7.26132381e-01 -2.14701945e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -2.50000000e-01 -7.50000000e-01 1.00000000e+00 -2.06459849e-12 -7.50000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 + 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.17509951e-01 -2.15134087e-01 5.98024945e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 4.50090696e-01 -2.06334645e-01 7.15879163e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 + 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 2.50000000e-01 2.00000000e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 2.50000000e-01 1.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 2.50000000e-01 -5.31234778e-13 1.00000000e+00 5.00000000e-01 -5.31241717e-13 + 5.12293954e-01 -5.47020830e-01 8.46585454e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 7.48792700e-01 -2.15543402e-01 8.20861523e-01 1.00000000e+00 -2.50000000e-01 8.00000000e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 + 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 9.38447953e-03 -2.48841529e-01 -7.45540129e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 1.11083696e-02 -2.30119466e-01 -6.11745165e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -2.50000000e-01 6.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 -5.00000000e-01 7.00000000e-01 1.00000000e+00 -2.50000000e-01 7.00000000e-01 1.00000000e+00 -2.75281187e-12 7.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -2.50000000e-01 8.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 + -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -2.50000000e-01 6.88199497e-13 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -2.94531864e-01 4.10629953e-02 -8.93397807e-01 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 + 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 7.46866862e-01 2.99271142e-01 3.61728318e-02 7.78684892e-01 2.52991615e-01 -8.02820141e-02 7.94944168e-01 2.92358944e-01 -1.63669585e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 2.10835765e-01 -4.82328769e-01 6.19792310e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 2.07904282e-01 -4.57094421e-01 7.03149397e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 + -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -1.00000000e+00 2.75279799e-12 -7.00000000e-01 -7.63866303e-01 2.84441812e-02 -6.79297819e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -7.26284734e-01 -3.76036267e-02 -5.64749763e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 + 5.00000000e-01 -1.00000000e+00 6.00000000e-01 5.42189289e-01 -7.20003365e-01 6.43416688e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.00000000e-01 -1.00000000e+00 7.00000000e-01 5.16597444e-01 -7.48984446e-01 6.91893431e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 + -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -4.87401687e-01 -2.53996841e-01 -7.33436743e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -5.37458717e-01 -2.20855384e-01 -6.15373185e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -2.50000000e-01 2.00000000e-01 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -2.50000000e-01 1.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -2.50000000e-01 -5.31227839e-13 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 + -5.00000000e-01 1.00000000e+00 8.00000000e-01 -2.50000000e-01 1.00000000e+00 8.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 9.00000000e-01 -2.50000000e-01 1.00000000e+00 9.00000000e-01 2.75281187e-12 1.00000000e+00 9.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 + -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -7.50000000e-01 2.06459849e-12 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -9.00000000e-01 -7.54756264e-01 -2.05155583e-02 -8.85140932e-01 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 7.47570636e-01 -2.54779531e-01 1.59569447e-01 7.69425713e-01 -2.14233386e-01 7.23532228e-02 7.93299243e-01 -2.90391319e-01 -3.62303831e-02 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + 4.04523035e-02 5.23334239e-01 7.85315811e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 2.90787792e-02 7.01291418e-01 8.76884113e-01 2.75281187e-12 1.00000000e+00 9.00000000e-01 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.06459849e-12 7.50000000e-01 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 + -4.90548406e-01 5.30132674e-01 8.30068751e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -2.56503075e-01 7.72183060e-01 8.39100635e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 -2.50000000e-01 1.00000000e+00 8.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -7.50000000e-01 -2.50000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -7.50000000e-01 2.06459849e-12 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 + 4.76425748e-01 5.49663539e-01 -7.93911671e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 7.03699572e-01 5.40375024e-01 -7.16772867e-01 1.00000000e+00 5.00000000e-01 -7.00000000e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 7.52729016e-01 4.70095302e-01 -6.25440659e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -2.50000000e-01 -1.00000000e+00 2.00000000e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -2.50000000e-01 -1.00000000e+00 1.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -2.50000000e-01 -1.00000000e+00 -5.31227839e-13 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 + 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 7.57978864e-01 -4.51872992e-02 -3.48262680e-02 7.26054535e-01 -4.23898258e-02 -1.03295065e-01 7.39298995e-01 1.55739606e-02 -2.39746917e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + -5.00000000e-01 1.00000000e+00 6.00000000e-01 -2.50000000e-01 1.00000000e+00 6.00000000e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 7.00000000e-01 -2.50000000e-01 1.00000000e+00 7.00000000e-01 2.75281187e-12 1.00000000e+00 7.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 -2.50000000e-01 1.00000000e+00 8.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 + -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -7.50000000e-01 -1.00000000e+00 -6.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -1.00000000e+00 -7.50000000e-01 -6.00000000e-01 -7.81293091e-01 -7.22212300e-01 -5.73868124e-01 -5.19284749e-01 -7.83778037e-01 -5.82806477e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -7.61949822e-01 -4.83182440e-01 -6.13761349e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 + 5.36295327e-01 5.28286707e-01 7.83714183e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 5.05789196e-01 7.80782768e-01 8.99780890e-01 5.00000000e-01 1.00000000e+00 9.00000000e-01 5.00000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 + -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -2.50000000e-01 -7.50000000e-01 -1.00000000e+00 -2.06459849e-12 -7.50000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 + 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -2.50000000e-01 -5.31227839e-13 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -2.50000000e-01 -1.00000000e-01 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 1.00000000e+00 -2.50000000e-01 -2.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 + -5.00000000e-01 1.37639899e-12 1.00000000e+00 -2.50000000e-01 6.88199497e-13 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -2.50000000e-01 2.50000000e-01 1.00000000e+00 6.88199497e-13 2.50000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -2.50000000e-01 5.00000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 + 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 7.78210727e-01 -4.61807554e-01 2.30335534e-01 7.82580381e-01 -5.33537662e-01 1.28807707e-01 7.54486357e-01 -4.65779570e-01 4.65500115e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -2.05542581e-01 2.46086019e-01 7.98602343e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 + -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -7.50000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -7.50000000e-01 -8.00000000e-01 -7.12188074e-01 -7.59807148e-01 -7.97497264e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 + 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 7.50000000e-01 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 7.50000000e-01 -2.06462625e-12 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 + -1.00000000e+00 1.00000000e+00 2.00000000e-01 -1.00000000e+00 7.50000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e-01 -1.00000000e+00 7.50000000e-01 1.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 7.50000000e-01 -5.31234778e-13 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 + -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -2.09237873e-01 -4.53806070e-01 8.68795487e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 + 5.00000000e-01 1.00000000e+00 2.00000000e-01 2.50000000e-01 1.00000000e+00 2.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e-01 2.50000000e-01 1.00000000e+00 1.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 2.50000000e-01 1.00000000e+00 -5.31227839e-13 2.75282575e-12 1.00000000e+00 -5.31227839e-13 + -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -2.04187698e-01 -5.48263988e-01 6.12094029e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -2.21508272e-01 -4.76936119e-01 6.65330696e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 + 5.00000000e-01 1.00000000e+00 -5.31227839e-13 2.50000000e-01 1.00000000e+00 -5.31227839e-13 2.75282575e-12 1.00000000e+00 -5.31227839e-13 5.00000000e-01 1.00000000e+00 -1.00000000e-01 2.50000000e-01 1.00000000e+00 -1.00000000e-01 2.75281187e-12 1.00000000e+00 -1.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 2.50000000e-01 1.00000000e+00 -2.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 1.00000000e+00 8.00000000e-01 -7.50000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 -1.00000000e+00 1.00000000e+00 9.00000000e-01 -7.50000000e-01 1.00000000e+00 9.00000000e-01 -5.00000000e-01 1.00000000e+00 9.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 + -1.00000000e+00 5.00000000e-01 8.00000000e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -1.00000000e+00 7.50000000e-01 8.00000000e-01 -7.33417299e-01 7.45318984e-01 8.16801742e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 -7.50000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 + 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 5.43805201e-01 -2.74415027e-01 2.11309501e-01 4.60634676e-01 -2.74851932e-01 1.42167096e-01 5.30532753e-01 -2.53759366e-01 -1.51549915e-02 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 + -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -7.50000000e-01 -2.50000000e-01 1.00000000e+00 -5.00000000e-01 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -7.50000000e-01 2.06459849e-12 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 + -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 2.14876777e-01 2.66014695e-02 1.95716027e-03 2.40675690e-01 1.35868819e-02 -1.32847045e-01 2.39904708e-01 2.97034161e-02 -2.43450037e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 + -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -1.00000000e+00 -2.50000000e-01 8.00000000e-01 -7.28652026e-01 -2.32061883e-01 8.05360909e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 + 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 7.50000000e-01 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 4.51723141e-01 -7.12445778e-01 -6.31796976e-01 7.81919864e-01 -7.71891779e-01 -5.92480176e-01 1.00000000e+00 -7.50000000e-01 -6.00000000e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 7.71083683e-01 -4.83737049e-01 -6.24197292e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 -4.84513376e-01 7.88613759e-01 -2.47734269e-02 -4.69709896e-01 7.22790237e-01 -1.35031999e-01 -4.70185252e-01 7.09785934e-01 -1.98354831e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -5.00000000e-01 1.00000000e+00 6.00000000e-01 -4.56240197e-01 7.11292251e-01 5.92377271e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 -7.50000000e-01 1.00000000e+00 6.00000000e-01 -7.62957935e-01 7.97576878e-01 5.88911288e-01 -7.45184141e-01 4.51483100e-01 5.88051785e-01 -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 7.50000000e-01 6.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 + -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -7.56224055e-01 -4.89237272e-01 2.39317721e-01 -7.62796857e-01 -4.73609152e-01 1.05760567e-01 -7.39628005e-01 -5.05700884e-01 1.87812797e-02 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 + -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 2.50000000e-01 -1.00000000e+00 -6.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 3.60248665e-02 -7.15736638e-01 -5.56900182e-01 2.50060687e-01 -7.04443808e-01 -6.04812110e-01 4.51723141e-01 -7.12445778e-01 -6.31796976e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.27888915e-01 -5.48643075e-01 -6.08178478e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 + 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -9.00000000e-01 7.50000000e-01 -1.00000000e+00 -9.00000000e-01 1.00000000e+00 -1.00000000e+00 -9.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 7.50000000e-01 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 + -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.49002019e-01 2.94878361e-01 2.22905724e-01 -4.91126648e-01 2.58928321e-01 5.69806889e-02 -4.71056834e-01 2.61828242e-01 -6.29466438e-03 -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 + -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -1.00000000e+00 -5.00000000e-01 9.00000000e-01 -7.43282336e-01 -5.01907987e-01 9.10718370e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 + 5.00000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 5.12062842e-01 -7.55583018e-01 1.82592331e-01 4.64262691e-01 -7.01821563e-01 1.00021871e-01 5.05907645e-01 -7.32869598e-01 2.79303667e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 + 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 5.00000000e-01 -1.00000000e+00 -7.00000000e-01 4.84994371e-01 -7.38185004e-01 -6.65984176e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 4.51723141e-01 -7.12445778e-01 -6.31796976e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 + -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 7.50000000e-01 -5.31234778e-13 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 1.00000000e+00 -1.00000000e-01 -1.00000000e+00 7.50000000e-01 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -1.00000000e+00 7.50000000e-01 -2.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 + 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 7.48197731e-01 -5.00521294e-01 -9.02070050e-01 1.00000000e+00 -5.00000000e-01 -9.00000000e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -5.39119198e-01 -2.18069642e-01 1.93502074e-01 -4.86713420e-01 -2.44213726e-01 8.93451833e-02 -4.78043847e-01 -2.07629733e-01 4.50886922e-02 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 + -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 2.89188667e-01 2.16866454e-01 -8.14176746e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 + 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 2.88874271e-01 -2.15716841e-01 -7.69846103e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 + 5.23944619e-01 1.85747848e-02 -5.96055755e-01 7.75733836e-01 -1.61799598e-03 -6.49360986e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 4.58568070e-01 2.90475700e-01 -5.61771941e-01 7.82733565e-01 2.58540036e-01 -5.89888172e-01 1.00000000e+00 2.50000000e-01 -6.00000000e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 7.52729016e-01 4.70095302e-01 -6.25440659e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 + -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -7.08701747e-01 4.85548346e-02 1.58550948e-01 -7.84986887e-01 -3.81684720e-02 9.48671005e-02 -7.40704078e-01 3.39288150e-02 -3.48449259e-02 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 + 5.09344874e-01 3.09144506e-02 -8.04652537e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 5.33169296e-01 2.88871609e-01 -7.48787355e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.58568070e-01 2.90475700e-01 -5.61771941e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 + -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -5.09737465e-01 7.67979309e-01 2.14852365e-01 -5.02845819e-01 7.73810273e-01 1.30364171e-01 -4.84513376e-01 7.88613759e-01 -2.47734269e-02 -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 + 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 7.47443361e-01 -1.60454830e-02 -7.08548030e-01 1.00000000e+00 -2.75279799e-12 -7.00000000e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 7.75733836e-01 -1.61799598e-03 -6.49360986e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 + -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -9.00000000e-01 -1.00000000e+00 -2.50000000e-01 -9.00000000e-01 -1.00000000e+00 2.75279799e-12 -9.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -2.50000000e-01 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 + 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 2.50000000e-01 8.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 -2.75281187e-12 9.00000000e-01 1.00000000e+00 2.50000000e-01 9.00000000e-01 1.00000000e+00 5.00000000e-01 9.00000000e-01 1.00000000e+00 -2.75279799e-12 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 + -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 -3.05552104e-02 2.65334773e-01 -6.90856343e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 4.76975638e-03 2.22747039e-01 -5.54198113e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 + -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -7.39628005e-01 -5.05700884e-01 1.87812797e-02 -7.30008300e-01 -5.47348177e-01 -1.01940973e-01 -7.23830262e-01 -5.10947776e-01 -2.04324878e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -9.00000000e-01 2.50000000e-01 -1.00000000e+00 -9.00000000e-01 5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 2.50000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 + -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -5.00000000e-01 2.50000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -5.38981877e-01 2.96708750e-01 -8.76711821e-01 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 + 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 2.70130842e-01 -4.98191594e-01 9.30082282e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 + 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.06459849e-12 7.50000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 3.94476533e-02 7.30638742e-01 -8.91840879e-01 2.75279799e-12 1.00000000e+00 -9.00000000e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 + 5.00000000e-01 1.00000000e+00 6.00000000e-01 7.50000000e-01 1.00000000e+00 6.00000000e-01 1.00000000e+00 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 7.00000000e-01 7.50000000e-01 1.00000000e+00 7.00000000e-01 1.00000000e+00 1.00000000e+00 7.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 7.50000000e-01 1.00000000e+00 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 + -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 2.02005392e-01 1.35088691e-02 -5.71704179e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.76975638e-03 2.22747039e-01 -5.54198113e-01 2.91138431e-01 2.35274349e-01 -5.51608391e-01 4.58568070e-01 2.90475700e-01 -5.61771941e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 2.88127504e-01 4.80366421e-01 -6.27498998e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 + 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.50000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 2.60867227e-01 5.22254554e-01 -9.09337193e-01 4.70494256e-01 5.00918977e-01 -8.78265196e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 + -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -2.50000000e-01 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -7.00000000e-01 -1.00000000e+00 -2.50000000e-01 -7.00000000e-01 -1.00000000e+00 2.75279799e-12 -7.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -1.00000000e+00 -2.50000000e-01 -6.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.50000000e-01 -1.00000000e+00 8.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -2.32778847e-01 -7.32731274e-01 8.13562707e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 3.87532026e-02 -7.48895411e-01 2.03633120e-01 -1.83511266e-02 -7.81917519e-01 6.84074762e-02 3.57478130e-02 -7.19804803e-01 -2.81200514e-02 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 + 5.00000000e-01 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -9.00000000e-01 7.50000000e-01 1.00000000e+00 -9.00000000e-01 1.00000000e+00 1.00000000e+00 -9.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 7.50000000e-01 1.00000000e+00 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 + -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 2.69114021e-01 -5.15966523e-01 -9.48240687e-01 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 + -1.00000000e+00 2.75282575e-12 8.00000000e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -1.00000000e+00 2.50000000e-01 8.00000000e-01 -7.49028192e-01 2.17844318e-01 8.44612291e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 + -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -9.00000000e-01 -7.50000000e-01 -1.00000000e+00 -9.00000000e-01 -5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -7.50000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 + -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -2.20873227e-01 -3.75745311e-03 9.44865877e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 -5.00000000e-01 1.37639899e-12 1.00000000e+00 -2.50000000e-01 6.88199497e-13 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 + -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -2.16946743e-01 -5.25091517e-01 -7.09679786e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -2.63857307e-01 -5.34652399e-01 -6.28666006e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 + 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 2.51700686e-01 -4.75998118e-01 -6.83401355e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.27888915e-01 -5.48643075e-01 -6.08178478e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -4.98466940e-01 -7.73475031e-01 1.66920868e-01 -5.39246180e-01 -7.62299504e-01 1.17290036e-01 -4.79675664e-01 -7.95380719e-01 -4.19450610e-02 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 + 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 7.50000000e-01 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 7.18008568e-01 -7.14058162e-01 -7.52591447e-01 1.00000000e+00 -7.50000000e-01 -8.00000000e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -7.11589479e-01 4.73335261e-01 2.49885800e-01 -7.55379689e-01 5.02039035e-01 1.49589770e-01 -7.83353594e-01 5.17147107e-01 -3.99209592e-02 -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 + 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -9.00000000e-01 1.00000000e+00 -7.50000000e-01 -9.00000000e-01 1.00000000e+00 -5.00000000e-01 -9.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -7.50000000e-01 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 + -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -4.71056834e-01 2.61828242e-01 -6.29466438e-03 -5.48172301e-01 2.45067493e-01 -5.10752028e-02 -4.63290913e-01 2.52761197e-01 -2.45700557e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + 2.75279799e-12 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -9.00000000e-01 2.50000000e-01 1.00000000e+00 -9.00000000e-01 5.00000000e-01 1.00000000e+00 -9.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 2.50000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 2.50000000e-01 8.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 2.75281187e-12 9.00000000e-01 -1.00000000e+00 2.50000000e-01 9.00000000e-01 -1.00000000e+00 5.00000000e-01 9.00000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 + 5.00000000e-01 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -2.50000000e-01 1.00000000e+00 7.50000000e-01 -2.50000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 7.50000000e-01 -2.06462625e-12 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 + -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 -2.85273885e-01 -7.11165751e-01 -3.61668105e-02 -2.22166591e-01 -7.68530707e-01 -1.26377051e-01 -2.07140846e-01 -7.92509484e-01 -2.24986267e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -9.00000000e-01 1.00000000e+00 2.50000000e-01 -9.00000000e-01 1.00000000e+00 5.00000000e-01 -9.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 2.50000000e-01 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 + 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 7.54486357e-01 -4.65779570e-01 4.65500115e-02 7.45652536e-01 -5.48822921e-01 -1.45145075e-01 7.62093252e-01 -5.48127444e-01 -1.80394090e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 + -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -2.26655422e-01 -2.46675215e-01 8.14959825e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 + -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -5.16530636e-01 -7.79155729e-01 -7.21762249e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -5.19284749e-01 -7.83778037e-01 -5.82806477e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 + -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -7.98649990e-01 -2.91977690e-01 3.76771938e-02 -7.69015107e-01 -2.60617708e-01 -7.61638297e-02 -7.94536143e-01 -2.68885321e-01 -1.66434791e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 + 0.00000000e+00 0.00000000e+00 -1.00000000e+00 2.50000000e-01 -6.88227253e-13 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 2.33031555e-01 -1.28211303e-02 -8.62544563e-01 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 + 2.81216416e-02 5.47228351e-01 -7.57921741e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 2.34152876e-01 7.47001994e-01 -7.61482326e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 2.50000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 -7.83353594e-01 5.17147107e-01 -3.99209592e-02 -7.73749894e-01 5.16432557e-01 -1.17487197e-01 -7.04899767e-01 4.70385201e-01 -2.10375257e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.83997912e-01 -7.90354142e-01 2.38104026e-01 -2.61610301e-01 -7.06670631e-01 9.04965407e-02 -2.85273885e-01 -7.11165751e-01 -3.61668105e-02 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 + 5.00000000e-01 5.00000000e-01 -1.00000000e+00 7.50000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 5.00000000e-01 7.50000000e-01 -1.00000000e+00 7.50000000e-01 7.50000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 + 2.75282575e-12 1.00000000e+00 -5.31227839e-13 2.75281187e-12 1.00000000e+00 -1.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 2.25211425e-01 7.87891962e-01 -9.39040992e-03 2.27194458e-01 7.80514207e-01 -1.10576007e-01 2.63252585e-01 7.40363202e-01 -1.92816815e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -5.10127471e-01 7.70774332e-01 9.32284862e-01 -5.00000000e-01 1.00000000e+00 9.00000000e-01 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 7.50000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 + -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 2.50000000e-01 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -7.00000000e-01 -1.00000000e+00 2.50000000e-01 -7.00000000e-01 -1.00000000e+00 5.00000000e-01 -7.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -1.00000000e+00 2.50000000e-01 -6.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 + 5.07529007e-01 -2.21590699e-02 5.82710233e-01 7.17970008e-01 -1.41566063e-02 5.58387791e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 7.06962214e-01 1.36224033e-02 6.82437435e-01 1.00000000e+00 -2.75281187e-12 7.00000000e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 + -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -2.27936065e-01 -2.02156405e-01 -8.03899353e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 + -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -2.92161293e-01 -4.06917502e-02 -6.93066376e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -2.27518950e-01 -3.08139637e-02 -6.49633469e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -2.50000000e-01 8.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 -5.00000000e-01 9.00000000e-01 1.00000000e+00 -2.50000000e-01 9.00000000e-01 1.00000000e+00 -2.75281187e-12 9.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 + -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 2.50000000e-01 -5.31227839e-13 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 2.50000000e-01 -1.00000000e-01 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 -1.00000000e+00 2.50000000e-01 -2.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 + 2.81216416e-02 5.47228351e-01 -7.57921741e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 2.52054048e-01 4.68467442e-01 -6.83075965e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 2.88127504e-01 4.80366421e-01 -6.27498998e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 + -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -7.50000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e-01 -7.50000000e-01 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -7.50000000e-01 -1.00000000e+00 -5.31234778e-13 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 + 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -7.50000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -9.00000000e-01 4.58333239e-01 -7.78485232e-01 -8.54036893e-01 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 + 5.00000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 7.50000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 4.70494256e-01 5.00918977e-01 -8.78265196e-01 4.84143459e-01 7.63467196e-01 -8.75978386e-01 5.00000000e-01 1.00000000e+00 -9.00000000e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 + 5.00000000e-01 -1.00000000e+00 8.00000000e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 5.00000000e-01 -1.00000000e+00 9.00000000e-01 4.73299977e-01 -7.16758539e-01 9.33283353e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -7.50000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 + 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 5.00000000e-01 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 7.87671700e-01 5.18477684e-01 2.65507873e-02 7.45407900e-01 4.74300234e-01 -8.32584288e-02 7.94545669e-01 5.15331880e-01 -1.50795761e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 + 5.00000000e-01 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.28371569e-01 7.31981280e-01 1.80526485e-01 5.27596354e-01 7.03979621e-01 5.66260221e-02 5.35060517e-01 7.11084213e-01 3.07005869e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 + -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.50000000e-01 -1.00000000e+00 8.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 9.00000000e-01 -2.50000000e-01 -1.00000000e+00 9.00000000e-01 -2.75281187e-12 -1.00000000e+00 9.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 + 4.76425748e-01 5.49663539e-01 -7.93911671e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 5.13618419e-01 7.13005495e-01 -7.05070610e-01 5.00000000e-01 1.00000000e+00 -7.00000000e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 4.67519964e-01 7.42183049e-01 -6.00421251e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 2.50000000e-01 2.00000000e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 2.50000000e-01 1.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 2.50000000e-01 -5.31227839e-13 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 + 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -9.00000000e-01 1.00000000e+00 7.50000000e-01 -9.00000000e-01 1.00000000e+00 1.00000000e+00 -9.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 7.50000000e-01 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -1.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -7.30225254e-01 7.83182848e-01 -4.97444001e-02 -7.09016328e-01 7.29158642e-01 -1.40227885e-01 -7.80936772e-01 7.57720448e-01 -1.99463657e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 + 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 7.50000000e-01 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -7.00000000e-01 7.50000000e-01 -1.00000000e+00 -7.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 7.50000000e-01 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 + 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 4.56820619e-01 -2.40486813e-01 -8.69901215e-01 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 + 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 7.71083683e-01 -4.83737049e-01 -6.24197292e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 4.74472946e-01 -2.55527072e-01 -6.17101064e-01 7.57447184e-01 -2.73750487e-01 -6.40156968e-01 1.00000000e+00 -2.50000000e-01 -6.00000000e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 7.75733836e-01 -1.61799598e-03 -6.49360986e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 + -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -2.50000000e-01 -1.00000000e+00 -5.31227839e-13 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -2.50000000e-01 -1.00000000e+00 -1.00000000e-01 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -2.50000000e-01 -1.00000000e+00 -2.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 + -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -2.63857307e-01 -5.34652399e-01 -6.28666006e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 -5.37458717e-01 -2.20855384e-01 -6.15373185e-01 -2.27894762e-01 -2.78777633e-01 -5.96910235e-01 1.11083696e-02 -2.30119466e-01 -6.11745165e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -2.27518950e-01 -3.08139637e-02 -6.49633469e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 + 5.08559128e-01 4.68350764e-02 8.47523900e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 7.10656385e-01 -3.90368472e-02 8.70199235e-01 1.00000000e+00 -2.75281187e-12 9.00000000e-01 5.00000000e-01 -1.37645451e-12 1.00000000e+00 7.50000000e-01 -2.06462625e-12 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 + -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -5.12608499e-01 7.92499024e-01 -7.47789707e-01 -5.00000000e-01 1.00000000e+00 -7.00000000e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -4.72348517e-01 7.55363920e-01 -5.93158920e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -2.99692682e-01 7.95631121e-01 -8.06065640e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -2.50000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 + -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -7.81530511e-01 2.79380115e-01 2.11246802e-01 -7.69127379e-01 2.80955891e-01 6.68660699e-02 -7.67432407e-01 2.08191458e-01 2.61816764e-03 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 + 1.59455851e-02 5.49948037e-01 -5.66649946e-01 2.88127504e-01 4.80366421e-01 -6.27498998e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 -3.85304003e-02 7.30500373e-01 -6.37788061e-01 2.29855889e-01 7.20288707e-01 -6.42358530e-01 4.67519964e-01 7.42183049e-01 -6.00421251e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 2.50000000e-01 1.00000000e+00 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 + 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 7.50000000e-01 2.00000000e-01 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 1.00000000e+00 7.50000000e-01 1.00000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e-01 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 7.50000000e-01 -5.31241717e-13 1.00000000e+00 1.00000000e+00 -5.31241717e-13 + 4.04523035e-02 5.23334239e-01 7.85315811e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 2.58520722e-01 4.90649406e-01 9.26968893e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.50000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 + 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 7.50000000e-01 -2.06462625e-12 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 7.50000000e-01 2.50000000e-01 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 7.50000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 + -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -2.70734059e-01 2.91861282e-01 2.01535922e-01 -2.05210706e-01 2.55930784e-01 6.09896351e-02 -2.12499061e-01 2.63559960e-01 2.50309024e-02 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 + -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -7.32136997e-01 -7.68847575e-01 2.25254060e-01 -7.27802875e-01 -7.30247579e-01 5.57324192e-02 -7.38622456e-01 -7.20629057e-01 2.58153547e-02 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 + -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 2.50000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 2.78394223e-01 -7.39518919e-01 -8.05394048e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 + 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 -2.50000000e-01 6.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 7.17970008e-01 -1.41566063e-02 5.58387791e-01 7.85439604e-01 -2.42670287e-01 6.23520706e-01 7.11398136e-01 -5.13660148e-01 5.52310014e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 5.17509951e-01 -2.15134087e-01 5.98024945e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 + -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 2.50000000e-01 -1.00000000e+00 -5.31234778e-13 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 2.50000000e-01 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 2.50000000e-01 -1.00000000e+00 -2.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 + -1.00000000e+00 1.00000000e+00 2.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -7.78681422e-01 7.97121596e-01 1.57212989e-01 -7.94522386e-01 7.55757599e-01 1.43601664e-01 -7.30225254e-01 7.83182848e-01 -4.97444001e-02 -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 + 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 7.50000000e-01 -2.06462625e-12 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 7.09086800e-01 -2.05745677e-02 -8.72720579e-01 1.00000000e+00 -2.75279799e-12 -9.00000000e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 + -1.41423116e-02 -4.65415711e-01 6.46359410e-01 3.60221343e-02 -7.72494852e-01 6.10765349e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 -2.04187698e-01 -5.48263988e-01 6.12094029e-01 -2.10587495e-01 -7.49604268e-01 5.55379367e-01 -2.50000000e-01 -1.00000000e+00 6.00000000e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.48640676e-01 -7.77286265e-01 6.36669671e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 + -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 -2.28102848e-01 7.22658326e-01 1.37320272e-03 -2.69998668e-01 7.39667674e-01 -9.92035629e-02 -2.00554723e-01 7.20919671e-01 -2.28707058e-01 -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 + -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -2.29859095e-01 -4.62241540e-01 -8.89853533e-01 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 + 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.54102049e-01 2.74010313e-01 5.73290265e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 2.93080452e-01 4.76318217e-01 6.15661245e-01 2.29679836e-01 2.69446281e-01 6.27084301e-01 2.01691136e-01 -4.79247863e-02 5.66882667e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 -2.39636276e-02 2.31604414e-01 6.19527443e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 + 2.75279799e-12 1.00000000e+00 2.00000000e-01 -2.50000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 -2.50000000e-01 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -2.50000000e-01 1.00000000e+00 -5.31234778e-13 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 + -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -2.63967420e-01 3.93850057e-02 3.28850264e-02 -2.73606057e-01 9.90301043e-03 -1.42874927e-01 -2.80153842e-01 -3.64863794e-02 -1.56716221e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 + 2.75279799e-12 1.00000000e+00 -8.00000000e-01 2.50000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -7.00000000e-01 2.50000000e-01 1.00000000e+00 -7.00000000e-01 5.00000000e-01 1.00000000e+00 -7.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 2.50000000e-01 1.00000000e+00 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 + -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -4.78043847e-01 -2.07629733e-01 4.50886922e-02 -5.18699628e-01 -2.03255142e-01 -1.07225665e-01 -5.40207811e-01 -2.89915281e-01 -2.42605818e-01 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 + 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 4.72608798e-01 -2.91735905e-01 -7.17049475e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.74472946e-01 -2.55527072e-01 -6.17101064e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 + 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -7.50000000e-01 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.00000000e-01 1.00000000e+00 -7.50000000e-01 -7.00000000e-01 1.00000000e+00 -5.00000000e-01 -7.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -7.50000000e-01 -6.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 + -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -7.50000000e-01 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 -7.50000000e-01 1.00000000e+00 -1.00000000e-01 -1.00000000e+00 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 -7.50000000e-01 1.00000000e+00 -2.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 + -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -2.28613183e-01 5.45106914e-01 -6.46579701e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 -4.72348517e-01 7.55363920e-01 -5.93158920e-01 -2.79324600e-01 7.11748303e-01 -6.05174083e-01 -3.85304003e-02 7.30500373e-01 -6.37788061e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -2.50000000e-01 1.00000000e+00 -6.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 + 4.76425748e-01 5.49663539e-01 -7.93911671e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 7.65968010e-01 7.01265899e-01 -7.54998642e-01 1.00000000e+00 7.50000000e-01 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 7.50000000e-01 1.00000000e+00 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 + -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -2.79454677e-01 -5.37813444e-01 2.02229801e-01 -2.60664590e-01 -4.66170921e-01 1.32762161e-01 -2.62569079e-01 -5.25838878e-01 -5.68085725e-03 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 + + + H[0-31,524-555] + F[1,6,39,43,69,73,99,103,542,409,548,387,128,497,418,309,323,401,330,361,350,370,569,601,604,611,654,660,696,702,738,744,1174,780,1178,1135,1041,1026,1199,957,968,1221,972,1003,996,1012,1060,1035,1240,1245,1274,1278,1300,1304,1326,1330] + F[123,126,93,96,63,66,31,35,545,412,546,384,133,500,422,312,326,393,333,364,347,367,572,600,774,779,730,735,688,693,645,651,1177,785,1180,1133,1050,1029,1145,1202,964,1222,975,1006,993,1009,1057,1039,1347,1350,1321,1324,1295,1298,1267,1271] + F[100,104,108,111,115,118,122,125,549,406,544,390,558,300,415,320,340,395,578,588,353,593,505,494,741,747,752,757,762,767,772,777,1179,868,1176,951,1047,1023,1140,1193,981,1219,989,1210,999,1015,1053,1037,1327,1331,1334,1337,1340,1343,1346,1349] + F[32,36,23,27,14,18,4,9,543,381,547,403,303,217,420,316,336,399,343,377,357,373,584,597,642,648,630,636,618,624,607,614,1175,950,1181,1191,1019,1044,1142,961,978,1128,985,1209,1214,1217,1062,1032,1268,1272,1260,1264,1252,1256,1243,1248] + F[0,11,20,29,38,47,54,61,68,77,84,91,98,107,114,121] + F[1249,1257,1265,1273,1281,1287,1293,1299,1307,1313,1319,1325,1333,1339,1345,1351] + A[32-229,310-507] + P[230-245,508-523] + R[246-309] + + + C[1,601-603] + +
+ + + L0211-XU + 5.3.0 + 07-Nov-2023 15:14:09 + + -v mixed_ref_cube_0.5_perturbed_order_2.msh mixed_ref_cube_0.5_perturbed_order_2.tmp.xml:xml:uncompress + +
diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index a656e834..e6c272bb 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -1,68 +1,19 @@ -#include "nektar_interface/coordinate_mapping.hpp" -#include "nektar_interface/geometry_transport/halo_extension.hpp" -#include "nektar_interface/particle_interface.hpp" -#include "nektar_interface/utility_mesh_plotting.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace Nektar; -using namespace Nektar::SolverUtils; -using namespace Nektar::LibUtilities; -using namespace Nektar::SpatialDomains; -using namespace NESO::Particles; - -static inline void copy_to_cstring(std::string input, char **output) { - *output = new char[input.length() + 1]; - std::strcpy(*output, input.c_str()); -} +#include "test_helper_utilities.hpp" TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { int size, rank; MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); - - LibUtilities::SessionReaderSharedPtr session; - SpatialDomains::MeshGraphSharedPtr graph; - - int argc = 3; - char *argv[3]; - copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); - - std::filesystem::path source_file = __FILE__; - std::filesystem::path source_dir = source_file.parent_path(); - std::filesystem::path test_resources_dir = - source_dir / "../../test_resources"; - std::filesystem::path conditions_file = - test_resources_dir / "reference_all_types_cube/conditions.xml"; - copy_to_cstring(std::string(conditions_file), &argv[1]); - // std::filesystem::path mesh_file = - // test_resources_dir / "reference_all_types_cube/mixed_ref_cube_0.2.xml"; - - std::filesystem::path mesh_file = - "/home/js0259/git-ukaea/NESO-workspace/reference_all_types_cube/" - "mixed_ref_cube_0.5_perturbed_order_2.xml"; - copy_to_cstring(std::string(mesh_file), &argv[2]); + TestUtilities::TestResourceSession resource_session( + "reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml", + "reference_all_types_cube/conditions.xml"); // Create session reader. - session = LibUtilities::SessionReader::CreateInstance(argc, argv); + auto session = resource_session.session; // Create MeshGraph. - graph = SpatialDomains::MeshGraph::Read(session); + auto graph = SpatialDomains::MeshGraph::Read(session); // build map from owned mesh hierarchy cells to geoms that touch that cell auto mesh = std::make_shared(graph); @@ -225,7 +176,4 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { } mesh->free(); - delete[] argv[0]; - delete[] argv[1]; - delete[] argv[2]; } From 109ccbbb080747e4a92a8d434835693e3aea1e4a Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 12 Nov 2024 12:31:00 +0000 Subject: [PATCH 39/66] added curved 3d particle mapper and integration test --- .../geometry_container_3d.hpp | 32 +- .../map_particles_3d.hpp | 20 +- .../map_particles_newton.hpp | 299 +++++++++--------- .../newton_generic_3d.hpp | 1 - .../particle_cell_mapping_common.hpp | 11 + .../map_particles_2d.cpp | 5 +- .../map_particles_3d.cpp | 70 +++- .../test_particle_advection.cpp | 149 +++------ .../test_helper_utilities.hpp | 37 ++- 9 files changed, 350 insertions(+), 274 deletions(-) diff --git a/include/nektar_interface/geometry_transport/geometry_container_3d.hpp b/include/nektar_interface/geometry_transport/geometry_container_3d.hpp index 9a404391..3b36eb9f 100644 --- a/include/nektar_interface/geometry_transport/geometry_container_3d.hpp +++ b/include/nektar_interface/geometry_transport/geometry_container_3d.hpp @@ -27,16 +27,15 @@ namespace NESO { class GeometryContainer3D { protected: inline GeometryTypes3D &classify(std::shared_ptr &geom) { - auto g_type = geom->GetMetricInfo()->GetGtype(); if (g_type == eRegular) { return this->regular; } else { - const std::map expected_num_verts{ - {{eTetrahedron, 4}, {ePyramid, 5}, {ePrism, 6}, {eHexahedron, 8}}}; - const int linear_num_verts = expected_num_verts.at(geom->GetShapeType()); - const int num_verts = geom->GetNumVerts(); - if (num_verts == linear_num_verts) { + auto xmap = geom->GetXmap(); + const bool linear = (xmap->GetBasisNumModes(0) == 2) && + (xmap->GetBasisNumModes(1) == 2) && + (xmap->GetBasisNumModes(2) == 2); + if (linear) { return this->deformed_linear; } else { return this->deformed_non_linear; @@ -70,6 +69,27 @@ class GeometryContainer3D { auto &container = this->classify(geom->geom); container.push_back(geom); } + + /** + * Print information about the number of contained geometry objects. + */ + inline void print() { + nprint("Num regular :", regular.size()); + nprint("\tTetrahedrons:", regular.tet.size()); + nprint("\tPyramid :", regular.pyr.size()); + nprint("\tPrism :", regular.prism.size()); + nprint("\tHexahedrons :", regular.hex.size()); + nprint("Num deformed linear :", deformed_linear.size()); + nprint("\tTetrahedrons:", deformed_linear.tet.size()); + nprint("\tPyramid :", deformed_linear.pyr.size()); + nprint("\tPrism :", deformed_linear.prism.size()); + nprint("\tHexahedrons :", deformed_linear.hex.size()); + nprint("Num deformed non-linear:", deformed_non_linear.size()); + nprint("\tTetrahedrons:", deformed_non_linear.tet.size()); + nprint("\tPyramid :", deformed_non_linear.pyr.size()); + nprint("\tPrism :", deformed_non_linear.prism.size()); + nprint("\tHexahedrons :", deformed_non_linear.hex.size()); + } }; } // namespace NESO diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_3d.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_3d.hpp index 2c9c0a36..e71e1cf1 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_3d.hpp @@ -52,12 +52,24 @@ class MapParticles3D { std::unique_ptr>> map_particles_3d_deformed_linear; + std::unique_ptr> + map_particles_3d_deformed_non_linear; + + template + inline void map_newton_initial(std::unique_ptr &ptr, + ParticleGroup &particle_group, + const int map_cell) { + if (ptr) { + ptr->map_initial(particle_group, map_cell); + } + } + template - inline void map_newton_internal(std::unique_ptr &ptr, - ParticleGroup &particle_group, - const int map_cell) { + inline void map_newton_final(std::unique_ptr &ptr, + ParticleGroup &particle_group, + const int map_cell) { if (ptr) { - ptr->map(particle_group, map_cell); + ptr->map_final(particle_group, map_cell); } } diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp index 9ed10d63..69981c7e 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -91,7 +91,146 @@ class MapParticlesNewton : public CoarseMappersBase { return this->newton_type.data_size_local(h_data_ptr); } - inline void map_inital(ParticleGroup &particle_group, const int map_cell) { +public: + ~MapParticlesNewton() { + for (int index = 0; index < num_geoms; index++) { + auto h_data_ptr = + (this->num_bytes_per_map_host) + ? this->h_data.data() + index * this->num_bytes_per_map_host + : nullptr; + this->newton_type.free_data(h_data_ptr); + } + } + + /** + * Create new Newton implementation templated on a X(xi) map type and a + * geometry type. + * + * @param newton_type Sub-class of MappingNewtonIterationBase that defines + * the X(xi) map. + * @param sycl_target SYCLTarget That defines where to perform Newton + * iteration. + * @param geoms_local Map of local Nektar++ geometry objects to which + * newton_type is applicable. + * @param geoms_remote Vector of remote Nektar++ geometry objects to which + * newton_type is applicable. + * @param config ParameterStore instance to configure exit tolerance and + * iteration counts. + */ + template + MapParticlesNewton( + MappingNewtonIterationBase newton_type, + SYCLTargetSharedPtr sycl_target, + std::map> &geoms_local, + std::vector> &geoms_remote, + ParameterStoreSharedPtr config = std::make_shared()) + : CoarseMappersBase(sycl_target), newton_type(newton_type), + num_bytes_per_map_device(newton_type.data_size_device()), + num_bytes_per_map_host(newton_type.data_size_host()), + ndim(newton_type.get_ndim()) { + + this->newton_tol = + config->get("MapParticlesNewton/newton_tol", 1.0e-8); + this->newton_max_iteration = + config->get("MapParticlesNewton/newton_max_iteration", 51); + this->contained_tol = + config->get("MapParticlesNewton/contained_tol", this->newton_tol); + const int num_modes_factor = + config->get("MapParticlesNewton/num_modes_factor", 1); + + this->num_geoms = geoms_local.size() + geoms_remote.size(); + if (this->num_geoms > 0) { + + // create the coarse lookup mesh + this->coarse_lookup_map = std::make_unique( + this->ndim, this->sycl_target, geoms_local, geoms_remote); + + // store the information required to evaluate v_GetLocCoords for regular + // Geometry3D objects. + // map from cartesian cells to nektar mesh cells + std::map>> geom_map; + this->dh_cell_ids = + std::make_unique>(this->sycl_target, num_geoms); + this->dh_mpi_ranks = + std::make_unique>(this->sycl_target, num_geoms); + this->dh_type = + std::make_unique>(this->sycl_target, num_geoms); + + if (this->num_bytes_per_map_device) { + this->dh_data = std::make_unique>( + this->sycl_target, num_geoms * this->num_bytes_per_map_device); + } + if (this->num_bytes_per_map_host) { + this->h_data = + std::vector(num_geoms * this->num_bytes_per_map_host); + } + + const int index_tri = shape_type_to_int(eTriangle); + const int index_quad = shape_type_to_int(eQuadrilateral); + const int index_tet = shape_type_to_int(eTetrahedron); + const int index_pyr = shape_type_to_int(ePyramid); + const int index_prism = shape_type_to_int(ePrism); + const int index_hex = shape_type_to_int(eHexahedron); + + const int rank = this->sycl_target->comm_pair.rank_parent; + + int num_modes = 0; + this->num_bytes_local_memory = 0; + auto lambda_update_local_memory = [&](const std::size_t s) { + this->num_bytes_local_memory = + std::max(this->num_bytes_local_memory, s); + }; + for (auto &geom : geoms_local) { + const int id = geom.second->GetGlobalID(); + const int cell_index = this->coarse_lookup_map->gid_to_lookup_id.at(id); + NESOASSERT((cell_index < num_geoms) && (0 <= cell_index), + "Bad cell index from map."); + NESOASSERT(id == geom.first, "ID mismatch"); + + this->dh_cell_ids->h_buffer.ptr[cell_index] = id; + this->dh_mpi_ranks->h_buffer.ptr[cell_index] = rank; + const int geom_type = shape_type_to_int(geom.second->GetShapeType()); + NESOASSERT((geom_type == index_tet) || (geom_type == index_pyr) || + (geom_type == index_prism) || (geom_type == index_hex) || + (geom_type == index_tri) || (geom_type == index_quad), + "Unknown shape type."); + this->dh_type->h_buffer.ptr[cell_index] = geom_type; + lambda_update_local_memory(this->write_data(geom.second, cell_index)); + num_modes = + std::max(num_modes, geom.second->GetXmap()->EvalBasisNumModesMax()); + } + + for (auto &geom : geoms_remote) { + const int id = geom->id; + const int cell_index = this->coarse_lookup_map->gid_to_lookup_id.at(id); + NESOASSERT((cell_index < num_geoms) && (0 <= cell_index), + "Bad cell index from map."); + this->dh_cell_ids->h_buffer.ptr[cell_index] = id; + this->dh_mpi_ranks->h_buffer.ptr[cell_index] = geom->rank; + const int geom_type = shape_type_to_int(geom->geom->GetShapeType()); + NESOASSERT((geom_type == index_tet) || (geom_type == index_pyr) || + (geom_type == index_prism) || (geom_type == index_hex) || + (geom_type == index_tri) || (geom_type == index_quad), + "Unknown shape type."); + this->dh_type->h_buffer.ptr[cell_index] = geom_type; + lambda_update_local_memory(this->write_data(geom->geom, cell_index)); + num_modes = + std::max(num_modes, geom->geom->GetXmap()->EvalBasisNumModesMax()); + } + + this->grid_size = num_modes * num_modes_factor; + this->dh_cell_ids->host_to_device(); + this->dh_mpi_ranks->host_to_device(); + this->dh_type->host_to_device(); + this->dh_data->host_to_device(); + } + } + + /** + * Called internally by NESO to map positions to Nektar++ + * Geometry objects via Newton iteration. + */ + inline void map_initial(ParticleGroup &particle_group, const int map_cell) { if (this->num_geoms == 0) { return; @@ -214,6 +353,7 @@ class MapParticlesNewton : public CoarseMappersBase { const bool contained = clamped_residual <= k_newton_tol; cell_found = contained && converged; + if (cell_found) { const int geom_id = k_map_cell_ids[geom_map_index]; const int mpi_rank = k_map_mpi_ranks[geom_map_index]; @@ -237,6 +377,10 @@ class MapParticlesNewton : public CoarseMappersBase { } } + /** + * Called internally by NESO to map positions to Nektar++ + * Geometry objects via Newton iteration. + */ inline void map_final(ParticleGroup &particle_group, const int map_cell) { if (this->num_geoms == 0) { return; @@ -276,7 +420,7 @@ class MapParticlesNewton : public CoarseMappersBase { particle_group.get_dat(Sym("NESO_REFERENCE_POSITIONS")); auto local_memory = LocalMemoryBlock(this->num_bytes_local_memory); - particle_loop( + auto loop = particle_loop( "MapParticlesNewton::map_final", position_dat, [=](auto k_part_positions, auto k_part_cell_ids, auto k_part_mpi_ranks, auto k_part_ref_positions, auto k_local_memory) { @@ -390,153 +534,12 @@ class MapParticlesNewton : public CoarseMappersBase { }, Access::read(position_dat), Access::write(cell_ids), Access::write(mpi_ranks), Access::write(ref_positions), - Access::write(local_memory)) - ->execute(map_cell); - } - -public: - ~MapParticlesNewton() { - for (int index = 0; index < num_geoms; index++) { - auto h_data_ptr = - (this->num_bytes_per_map_host) - ? this->h_data.data() + index * this->num_bytes_per_map_host - : nullptr; - this->newton_type.free_data(h_data_ptr); - } - } - - /** - * Create new Newton implementation templated on a X(xi) map type and a - * geometry type. - * - * @param newton_type Sub-class of MappingNewtonIterationBase that defines - * the X(xi) map. - * @param sycl_target SYCLTarget That defines where to perform Newton - * iteration. - * @param geoms_local Map of local Nektar++ geometry objects to which - * newton_type is applicable. - * @param geoms_remote Vector of remote Nektar++ geometry objects to which - * newton_type is applicable. - * @param config ParameterStore instance to configure exit tolerance and - * iteration counts. - */ - template - MapParticlesNewton( - MappingNewtonIterationBase newton_type, - SYCLTargetSharedPtr sycl_target, - std::map> &geoms_local, - std::vector> &geoms_remote, - ParameterStoreSharedPtr config = std::make_shared()) - : CoarseMappersBase(sycl_target), newton_type(newton_type), - num_bytes_per_map_device(newton_type.data_size_device()), - num_bytes_per_map_host(newton_type.data_size_host()), - ndim(newton_type.get_ndim()) { - - this->newton_tol = - config->get("MapParticlesNewton/newton_tol", 1.0e-8); - this->newton_max_iteration = - config->get("MapParticlesNewton/newton_max_iteration", 51); - this->contained_tol = - config->get("MapParticlesNewton/contained_tol", this->newton_tol); - const int num_modes_factor = - config->get("MapParticlesNewton/num_modes_factor", 1); - - this->num_geoms = geoms_local.size() + geoms_remote.size(); - if (this->num_geoms > 0) { - - // create the coarse lookup mesh - this->coarse_lookup_map = std::make_unique( - this->ndim, this->sycl_target, geoms_local, geoms_remote); - - // store the information required to evaluate v_GetLocCoords for regular - // Geometry3D objects. - // map from cartesian cells to nektar mesh cells - std::map>> geom_map; - this->dh_cell_ids = - std::make_unique>(this->sycl_target, num_geoms); - this->dh_mpi_ranks = - std::make_unique>(this->sycl_target, num_geoms); - this->dh_type = - std::make_unique>(this->sycl_target, num_geoms); - - if (this->num_bytes_per_map_device) { - this->dh_data = std::make_unique>( - this->sycl_target, num_geoms * this->num_bytes_per_map_device); - } - if (this->num_bytes_per_map_host) { - this->h_data = - std::vector(num_geoms * this->num_bytes_per_map_host); - } - - const int index_tri = shape_type_to_int(eTriangle); - const int index_quad = shape_type_to_int(eQuadrilateral); - const int index_tet = shape_type_to_int(eTetrahedron); - const int index_pyr = shape_type_to_int(ePyramid); - const int index_prism = shape_type_to_int(ePrism); - const int index_hex = shape_type_to_int(eHexahedron); - - const int rank = this->sycl_target->comm_pair.rank_parent; - - int num_modes = 0; - this->num_bytes_local_memory = 0; - auto lambda_update_local_memory = [&](const std::size_t s) { - this->num_bytes_local_memory = - std::max(this->num_bytes_local_memory, s); - }; - for (auto &geom : geoms_local) { - const int id = geom.second->GetGlobalID(); - const int cell_index = this->coarse_lookup_map->gid_to_lookup_id.at(id); - NESOASSERT((cell_index < num_geoms) && (0 <= cell_index), - "Bad cell index from map."); - NESOASSERT(id == geom.first, "ID mismatch"); - - this->dh_cell_ids->h_buffer.ptr[cell_index] = id; - this->dh_mpi_ranks->h_buffer.ptr[cell_index] = rank; - const int geom_type = shape_type_to_int(geom.second->GetShapeType()); - NESOASSERT((geom_type == index_tet) || (geom_type == index_pyr) || - (geom_type == index_prism) || (geom_type == index_hex) || - (geom_type == index_tri) || (geom_type == index_quad), - "Unknown shape type."); - this->dh_type->h_buffer.ptr[cell_index] = geom_type; - lambda_update_local_memory(this->write_data(geom.second, cell_index)); - num_modes = - std::max(num_modes, geom.second->GetXmap()->EvalBasisNumModesMax()); - } - - for (auto &geom : geoms_remote) { - const int id = geom->id; - const int cell_index = this->coarse_lookup_map->gid_to_lookup_id.at(id); - NESOASSERT((cell_index < num_geoms) && (0 <= cell_index), - "Bad cell index from map."); - this->dh_cell_ids->h_buffer.ptr[cell_index] = id; - this->dh_mpi_ranks->h_buffer.ptr[cell_index] = geom->rank; - const int geom_type = shape_type_to_int(geom->geom->GetShapeType()); - NESOASSERT((geom_type == index_tet) || (geom_type == index_pyr) || - (geom_type == index_prism) || (geom_type == index_hex) || - (geom_type == index_tri) || (geom_type == index_quad), - "Unknown shape type."); - this->dh_type->h_buffer.ptr[cell_index] = geom_type; - lambda_update_local_memory(this->write_data(geom->geom, cell_index)); - num_modes = - std::max(num_modes, geom->geom->GetXmap()->EvalBasisNumModesMax()); - } - - this->grid_size = num_modes * num_modes_factor; - this->dh_cell_ids->host_to_device(); - this->dh_mpi_ranks->host_to_device(); - this->dh_type->host_to_device(); - this->dh_data->host_to_device(); - } - } + Access::write(local_memory)); - /** - * Called internally by NESO-Particles to map positions to Nektar++ - * Geometry objects via Newton iteration. - */ - inline void map(ParticleGroup &particle_group, const int map_cell = -1) { - this->map_inital(particle_group, map_cell); - if (map_cell != -1) { - this->map_final(particle_group, map_cell); + if (map_cell > -1) { + loop->execute(map_cell); + } else { + loop->execute(); } } }; diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index 808f5f93..2b95fd2e 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -256,7 +256,6 @@ struct MappingGeneric3D : MappingNewtonIterationBase { const REAL norm2 = MAX(MAX(ABS(*f0), ABS(*f1)), ABS(*f2)); const REAL tol_scaling = d->tol_scaling; const REAL scaled_norm2 = norm2 * tol_scaling; - return scaled_norm2; } diff --git a/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp b/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp index 0620f83c..4045c973 100644 --- a/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp +++ b/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp @@ -172,6 +172,17 @@ inline bool contains_point_3d(std::shared_ptr geom, Array &global_coord, Array &local_coord, const NekDouble tol) { bool contained = geom->ContainsPoint(global_coord, local_coord, tol); + // TODO REMOVE START + if (contained) { + Array test_coord(3); + test_coord[0] = geom->GetCoord(0, local_coord); + test_coord[1] = geom->GetCoord(1, local_coord); + test_coord[2] = geom->GetCoord(2, local_coord); + nprint("P:", global_coord[0], global_coord[1], global_coord[2], + "L:", local_coord[0], local_coord[1], local_coord[2], + "T:", test_coord[0], test_coord[1], test_coord[2]); + } + // TODO REMOVE END return contained; } diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_2d.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_2d.cpp index 59f22952..a15465c2 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_2d.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_2d.cpp @@ -73,7 +73,10 @@ void MapParticles2D::map(ParticleGroup &particle_group, const int map_cell) { // attempt to bin the remaining particles into deformed cells if there are // deformed cells. if (particles_not_mapped) { - this->map_particles_newton_linear_quad->map(particle_group, map_cell); + this->map_particles_newton_linear_quad->map_initial(particle_group, + map_cell); + this->map_particles_newton_linear_quad->map_final(particle_group, + map_cell); } } diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp index 7ea446d5..b79e9c5a 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp @@ -18,6 +18,7 @@ MapParticles3D::MapParticles3D( std::get<1>(this->map_particles_3d_deformed_linear) = nullptr; std::get<2>(this->map_particles_3d_deformed_linear) = nullptr; std::get<3>(this->map_particles_3d_deformed_linear) = nullptr; + this->map_particles_3d_deformed_non_linear = nullptr; GeometryContainer3D geometry_container_3d; assemble_geometry_container_3d(particle_mesh_interface->graph, @@ -59,13 +60,41 @@ MapParticles3D::MapParticles3D( geometry_container_3d.deformed_linear.pyr.local, geometry_container_3d.deformed_linear.pyr.remote, config); } + if (geometry_container_3d.deformed_non_linear.size()) { + + std::map> local; + std::vector> remote; + remote.reserve( + geometry_container_3d.deformed_non_linear.tet.remote.size() + + geometry_container_3d.deformed_non_linear.pyr.remote.size() + + geometry_container_3d.deformed_non_linear.prism.remote.size() + + geometry_container_3d.deformed_non_linear.hex.remote.size()); + + auto lambda_push = [&](auto &lr) -> void { + for (auto &lx : lr.local) { + local[lx.first] = lx.second; + } + for (auto &rx : lr.remote) { + remote.push_back(rx); + } + }; + lambda_push(geometry_container_3d.deformed_non_linear.tet); + lambda_push(geometry_container_3d.deformed_non_linear.pyr); + lambda_push(geometry_container_3d.deformed_non_linear.prism); + lambda_push(geometry_container_3d.deformed_non_linear.hex); + + this->map_particles_3d_deformed_non_linear = + std::make_unique>( + Newton::MappingGeneric3D{}, this->sycl_target, local, remote, + config); + } // Create a mapper for 3D deformed non-linear geometry objects // as a sycl version is not written yet we reuse the host mapper - if (geometry_container_3d.deformed_non_linear.size()) { - this->map_particles_host = std::make_unique( - sycl_target, particle_mesh_interface, config); - } + // if (geometry_container_3d.deformed_non_linear.size()) { + // this->map_particles_host = std::make_unique( + // sycl_target, particle_mesh_interface, config); + //} } void MapParticles3D::map(ParticleGroup &particle_group, const int map_cell) { @@ -75,16 +104,31 @@ void MapParticles3D::map(ParticleGroup &particle_group, const int map_cell) { this->map_particles_3d_regular->map(particle_group, map_cell); } - map_newton_internal(std::get<0>(this->map_particles_3d_deformed_linear), - particle_group, map_cell); - map_newton_internal(std::get<1>(this->map_particles_3d_deformed_linear), - particle_group, map_cell); - map_newton_internal(std::get<2>(this->map_particles_3d_deformed_linear), - particle_group, map_cell); - map_newton_internal(std::get<3>(this->map_particles_3d_deformed_linear), - particle_group, map_cell); + map_newton_initial(std::get<0>(this->map_particles_3d_deformed_linear), + particle_group, map_cell); + map_newton_initial(std::get<1>(this->map_particles_3d_deformed_linear), + particle_group, map_cell); + map_newton_initial(std::get<2>(this->map_particles_3d_deformed_linear), + particle_group, map_cell); + map_newton_initial(std::get<3>(this->map_particles_3d_deformed_linear), + particle_group, map_cell); + map_newton_initial(this->map_particles_3d_deformed_non_linear, particle_group, + map_cell); + + bool particles_not_mapped = + this->map_particles_common->check_map(particle_group, map_cell); + + map_newton_final(std::get<0>(this->map_particles_3d_deformed_linear), + particle_group, map_cell); + map_newton_final(std::get<1>(this->map_particles_3d_deformed_linear), + particle_group, map_cell); + map_newton_final(std::get<2>(this->map_particles_3d_deformed_linear), + particle_group, map_cell); + map_newton_final(std::get<3>(this->map_particles_3d_deformed_linear), + particle_group, map_cell); + map_newton_final(this->map_particles_3d_deformed_non_linear, particle_group, + map_cell); - bool particles_not_mapped = true; if (this->map_particles_host) { // are there particles whcih are not yet mapped into cells particles_not_mapped = diff --git a/test/integration/nektar_interface/test_particle_advection.cpp b/test/integration/nektar_interface/test_particle_advection.cpp index 9bc98459..2f2c9a70 100644 --- a/test/integration/nektar_interface/test_particle_advection.cpp +++ b/test/integration/nektar_interface/test_particle_advection.cpp @@ -1,51 +1,17 @@ -#include "nektar_interface/particle_interface.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace Nektar; -using namespace Nektar::SolverUtils; -using namespace Nektar::SpatialDomains; -using namespace NESO::Particles; - -static inline void copy_to_cstring(std::string input, char **output) { - *output = new char[input.length() + 1]; - std::strcpy(*output, input.c_str()); -} +#include "../../unit/nektar_interface/test_helper_utilities.hpp" // Test advecting particles between ranks TEST(ParticleGeometryInterface, Advection2D) { const int N_total = 1000; const double tol = 1.0e-10; - int argc = 2; - char *argv[2]; - copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); - - std::filesystem::path source_file = __FILE__; - std::filesystem::path source_dir = source_file.parent_path(); - std::filesystem::path test_resources_dir = - source_dir / "../../test_resources"; - std::filesystem::path mesh_file = - test_resources_dir / "square_triangles_quads.xml"; - copy_to_cstring(std::string(mesh_file), &argv[1]); - - LibUtilities::SessionReaderSharedPtr session; - SpatialDomains::MeshGraphSharedPtr graph; + + TestUtilities::TestResourceSession resource_session( + "square_triangles_quads.xml"); + // Create session reader. - session = LibUtilities::SessionReader::CreateInstance(argc, argv); - graph = SpatialDomains::MeshGraph::Read(session); + auto session = resource_session.session; + auto graph = SpatialDomains::MeshGraph::Read(session); auto mesh = std::make_shared(graph); auto sycl_target = std::make_shared(0, mesh->get_comm()); @@ -188,9 +154,6 @@ TEST(ParticleGeometryInterface, Advection2D) { } mesh->free(); - - delete[] argv[0]; - delete[] argv[1]; } class ParticleAdvection3D : public testing::TestWithParam< @@ -201,38 +164,24 @@ TEST_P(ParticleAdvection3D, Advection3D) { std::tuple param = GetParam(); - const int N_total = 1000; + const int N_total = 2000; const double tol = std::get<2>(param); - std::filesystem::path source_file = __FILE__; - std::filesystem::path source_dir = source_file.parent_path(); - std::filesystem::path test_resources_dir = - source_dir / "../../test_resources"; - - std::filesystem::path condtions_file_basename = - static_cast(std::get<0>(param)); - std::filesystem::path mesh_file_basename = - static_cast(std::get<1>(param)); - std::filesystem::path conditions_file = - test_resources_dir / condtions_file_basename; - std::filesystem::path mesh_file = test_resources_dir / mesh_file_basename; - - int argc = 3; - char *argv[3]; - copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); - copy_to_cstring(std::string(conditions_file), &argv[1]); - copy_to_cstring(std::string(mesh_file), &argv[2]); - - LibUtilities::SessionReaderSharedPtr session; - SpatialDomains::MeshGraphSharedPtr graph; + TestUtilities::TestResourceSession resource_session( + static_cast(std::get<1>(param)), + static_cast(std::get<0>(param))); + // Create session reader. - session = LibUtilities::SessionReader::CreateInstance(argc, argv); - graph = SpatialDomains::MeshGraph::Read(session); + auto session = resource_session.session; + auto graph = SpatialDomains::MeshGraph::Read(session); auto mesh = std::make_shared(graph); auto sycl_target = std::make_shared(0, mesh->get_comm()); auto config = std::make_shared(); + config->set("MapParticlesNewton/newton_tol", 1.0e-10); + config->set("MapParticlesNewton/contained_tol", 1.0e-10); + auto nektar_graph_local_mapper = std::make_shared(sycl_target, mesh, config); @@ -266,7 +215,7 @@ TEST_P(ParticleAdvection3D, Advection3D) { MPICHK(MPI_Allreduce(&N, &N_check, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD)); NESOASSERT(N_check == N_total, "Error creating particles"); - const int Nsteps = 2000; + const int Nsteps = 1000; const REAL dt = 0.1; const int cell_count = domain->mesh->get_cell_count(); @@ -319,7 +268,7 @@ TEST_P(ParticleAdvection3D, Advection3D) { auto lambda_check_owning_cell = [&] { Array global_coord(3); - Array local_coord(3); + Array xi(3); Array eta(3); for (int cellx = 0; cellx < cell_count; cellx++) { @@ -328,26 +277,30 @@ TEST_P(ParticleAdvection3D, Advection3D) { auto reference_positions = A->get_cell(Sym("NESO_REFERENCE_POSITIONS"), cellx); - for (int rowx = 0; rowx < cell_ids->nrow; rowx++) { + const int cell_nektar = cell_id_translation.map_to_nektar[cellx]; + auto geom = geoms_3d[cell_nektar]; + + int shape_type = geom->GetShapeType(); + Newton::XMapNewton mapper(sycl_target, geom); + for (int rowx = 0; rowx < cell_ids->nrow; rowx++) { const int cell_neso = (*cell_ids)[0][rowx]; ASSERT_EQ(cell_neso, cellx); - const int cell_nektar = cell_id_translation.map_to_nektar[cell_neso]; - auto geom = geoms_3d[cell_nektar]; - local_coord[0] = reference_positions->at(rowx, 0); - local_coord[1] = reference_positions->at(rowx, 1); - local_coord[2] = reference_positions->at(rowx, 2); - global_coord[0] = geom->GetCoord(0, local_coord); - global_coord[1] = geom->GetCoord(1, local_coord); - global_coord[2] = geom->GetCoord(2, local_coord); - geom->GetXmap()->LocCoordToLocCollapsed(local_coord, eta); + xi[0] = reference_positions->at(rowx, 0); + xi[1] = reference_positions->at(rowx, 1); + xi[2] = reference_positions->at(rowx, 2); + global_coord[0] = geom->GetCoord(0, xi); + global_coord[1] = geom->GetCoord(1, xi); + global_coord[2] = geom->GetCoord(2, xi); // check the global coordinate matches the one on the particle for (int dimx = 0; dimx < ndim; dimx++) { const double err_abs = ABS(positions->at(rowx, dimx) - global_coord[dimx]); - ASSERT_TRUE(err_abs <= tol); + const double err_rel = + err_abs > 0.0 ? err_abs / std::abs(global_coord[dimx]) : err_abs; + ASSERT_TRUE((err_abs <= tol) || (err_rel <= tol)); ASSERT_TRUE(std::fabs((double)eta[dimx]) < (1.0 + tol)); } } @@ -360,7 +313,6 @@ TEST_P(ParticleAdvection3D, Advection3D) { REAL T = 0.0; for (int stepx = 0; stepx < Nsteps; stepx++) { - pbc.execute(); mesh_hierarchy_global_map.execute(); A->hybrid_move(); @@ -375,22 +327,25 @@ TEST_P(ParticleAdvection3D, Advection3D) { // h5part.close(); mesh->free(); - - delete[] argv[0]; - delete[] argv[1]; - delete[] argv[2]; } INSTANTIATE_TEST_SUITE_P( MultipleMeshes, ParticleAdvection3D, - testing::Values(std::tuple( - "reference_all_types_cube/conditions.xml", - "reference_all_types_cube/linear_non_regular_0.5.xml", - 1.0e-4 // The non-linear exit tolerance in Nektar is - // like (err_x * err_x - // + err_y * err_y) < 1.0e-8 - ), - std::tuple( - "reference_all_types_cube/conditions.xml", - "reference_all_types_cube/mixed_ref_cube_0.5.xml", - 1.0e-10))); + testing::Values( + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/linear_non_regular_0.5.xml", + 1.0e-4 // The non-linear exit tolerance in Nektar is + // like (err_x * err_x + // + err_y * err_y) < 1.0e-8 + ), + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/mixed_ref_cube_0.5.xml", 1.0e-10), + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml", + 1.0e-4 // The non-linear exit tolerance in Nektar is + // like (err_x * err_x + // + err_y * err_y) < 1.0e-8 + ))); diff --git a/test/unit/nektar_interface/test_helper_utilities.hpp b/test/unit/nektar_interface/test_helper_utilities.hpp index d977f520..aa094809 100644 --- a/test/unit/nektar_interface/test_helper_utilities.hpp +++ b/test/unit/nektar_interface/test_helper_utilities.hpp @@ -40,16 +40,20 @@ namespace NESO::TestUtilities { */ class TestResourceSession { protected: - char *argv[3]; + char *argv[3]{nullptr, nullptr, nullptr}; public: /// The session created from test resources. LibUtilities::SessionReaderSharedPtr session; ~TestResourceSession() { - delete[] this->argv[0]; - delete[] this->argv[1]; - delete[] this->argv[2]; + for (int ix = 0; ix < 3; ix++) { + auto ptr = this->argv[ix]; + if (ptr != nullptr) { + delete[] ptr; + this->argv[ix] = nullptr; + } + } } /** @@ -63,12 +67,14 @@ class TestResourceSession { */ TestResourceSession(const std::string filename_mesh, const std::string filename_conditions) { + copy_to_cstring(std::string("neso_nektar_test"), &this->argv[0]); std::filesystem::path source_file = __FILE__; std::filesystem::path source_dir = source_file.parent_path(); std::filesystem::path test_resources_dir = source_dir / "../../test_resources"; + std::filesystem::path conditions_file = test_resources_dir / filename_conditions; copy_to_cstring(std::string(conditions_file), &this->argv[1]); @@ -78,6 +84,29 @@ class TestResourceSession { // Create session reader. session = LibUtilities::SessionReader::CreateInstance(3, this->argv); } + + /** + * Create a Nektar++ session from a conditions file and mesh file in the + * test_resources directory. + * + * @param filename_mesh Path relative to the test_resources directory for the + * mesh. + */ + TestResourceSession(const std::string filename_mesh) { + + copy_to_cstring(std::string("neso_nektar_test"), &this->argv[0]); + + std::filesystem::path source_file = __FILE__; + std::filesystem::path source_dir = source_file.parent_path(); + std::filesystem::path test_resources_dir = + source_dir / "../../test_resources"; + + std::filesystem::path mesh_file = test_resources_dir / filename_mesh; + copy_to_cstring(std::string(mesh_file), &this->argv[1]); + + // Create session reader. + session = LibUtilities::SessionReader::CreateInstance(2, this->argv); + } }; } // namespace NESO::TestUtilities From 35889039994d25cbd19579ec284eeabb2dd78b53 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 13 Nov 2024 16:35:44 +0000 Subject: [PATCH 40/66] added initial implementation of sycl bounding box estimator --- CMakeLists.txt | 5 + .../coarse_lookup_map.hpp | 2 +- .../map_particles_newton.hpp | 1 - .../particle_cell_mapping/x_map_newton.hpp | 167 +++++++++++++++- .../map_particles_3d.cpp | 27 ++- test/CMakeLists.txt | 8 + .../test_particle_advection.cpp | 181 +++++++++++++++++- 7 files changed, 371 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 14ce7ae7..cfc61529 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) option(ENABLE_NESO_TESTS "Build unit tests for this project and register with ctest" ON) +option(ENABLE_NESO_PROFILING "Enable built in profiling" OFF) # Various sanitizers, including coverage and address sanitizer include(cmake/Sanitizers.cmake) @@ -270,6 +271,10 @@ target_link_libraries( ${NESO_LIBRARY_NAME} PUBLIC Nektar++::nektar++ fft::fft NESO-Particles::NESO-Particles PRIVATE ${TEST_LIBRARIES}) +if(ENABLE_NESO_PROFILING) + target_compile_definitions(${NESO_LIBRARY_NAME} + PUBLIC NESO_PARTICLES_PROFILING_REGION) +endif() add_sycl_to_target(TARGET ${NESO_LIBRARY_NAME} SOURCES ${LIB_SRC_FILES}) # Create executable diff --git a/include/nektar_interface/particle_cell_mapping/coarse_lookup_map.hpp b/include/nektar_interface/particle_cell_mapping/coarse_lookup_map.hpp index e46248af..a2b102ca 100644 --- a/include/nektar_interface/particle_cell_mapping/coarse_lookup_map.hpp +++ b/include/nektar_interface/particle_cell_mapping/coarse_lookup_map.hpp @@ -129,7 +129,7 @@ class CoarseLookupMap { min_extent = std::min(min_extent, dim_extent); } - const int target_cell_count = std::pow(2, ndim) * cell_count; + const int target_cell_count = std::pow(4, ndim) * cell_count; double base_extent = min_extent / 4; std::array grid_cell_counts; int grid_linear_cell_count = 1; diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp index 69981c7e..fc3818c3 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -1,6 +1,5 @@ #ifndef __MAP_PARTICLES_NEWTON_H_ #define __MAP_PARTICLES_NEWTON_H_ - #include #include #include diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 52f4a197..155c14a1 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -96,7 +96,7 @@ template class XMapNewton { num_modes_factor(num_modes_factor) { this->write_data(geom); this->dh_fdata = - std::make_unique>(this->sycl_target, 4); + std::make_unique>(this->sycl_target, 6); } /** @@ -271,6 +271,171 @@ template class XMapNewton { *xi2 = this->dh_fdata->h_buffer.ptr[2]; return (this->dh_fdata->h_buffer.ptr[3] > 0); } + + /** + * Return a Nektar++ style bounding box for the geometry object. + * + * @param grid_size Resolution of grid to use on each face of the collapsed + * reference space. Default 32. + * @returns Bounding box in format [minx, miny, minz, maxx, maxy, maxz]; + */ + std::array get_bounding_box(std::size_t grid_size = 32) { + char *k_map_data; + if (this->dh_data) { + k_map_data = this->dh_data->d_buffer.ptr; + } + NESOASSERT(this->dh_fdata != nullptr, "Bad pointer"); + auto k_fdata = this->dh_fdata->d_buffer.ptr; + NESOASSERT(k_fdata != nullptr, "Bad pointer"); + const std::size_t num_bytes_local = + std::max(this->num_bytes_local, sizeof(REAL)); + + // Get a local size which is a power of 2. + const std::size_t local_size = + get_prev_power_of_two(static_cast( + std::sqrt(this->sycl_target->get_num_local_work_items( + num_bytes_local, + sycl_target->parameters + ->template get("LOOP_LOCAL_SIZE") + ->value)))); + // make grid_size a multiple of the local size + grid_size = get_next_multiple(grid_size, local_size); + sycl::range<3> range_local(1, local_size, local_size); + const std::size_t local_size_l = local_size * local_size; + // There are 6 faces on the collapsed reference cell + sycl::range<3> range_global(6, grid_size, grid_size); + const REAL k_width = 2.0 / static_cast(grid_size - 1); + + constexpr REAL kc[6][3] = { + {-1.0, 0.0, 0.0}, // x = -1 + {1.0, 0.0, 0.0}, // x = 1 + {0.0, -1.0, 0.0}, // y = -1 + {0.0, 1.0, 0.0}, // y = 1 + {0.0, 0.0, -1.0}, // z = -1 + {0.0, 0.0, 1.0} // z = 1 + }; + + constexpr REAL kcx[6][3] = {{0.0, 1.0, 0.0}, {0.0, 1.0, 0.0}, + {0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}, + {1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}}; + + constexpr REAL kcy[6][3] = {{0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}, + {1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}, + {0.0, 1.0, 0.0}, {0.0, 1.0, 0.0}}; + + static_assert((kc[0][0] + kcx[0][0] + kcy[0][0]) == -1); + static_assert((kc[0][1] + kcx[0][1] + kcy[0][1]) == 1); + static_assert((kc[0][2] + kcx[0][2] + kcy[0][2]) == 1); + static_assert((kc[1][0] + kcx[1][0] + kcy[1][0]) == 1); + static_assert((kc[1][1] + kcx[1][1] + kcy[1][1]) == 1); + static_assert((kc[1][2] + kcx[1][2] + kcy[1][2]) == 1); + static_assert((kc[2][0] + kcx[2][0] + kcy[2][0]) == 1); + static_assert((kc[2][1] + kcx[2][1] + kcy[2][1]) == -1); + static_assert((kc[2][2] + kcx[2][2] + kcy[2][2]) == 1); + static_assert((kc[3][0] + kcx[3][0] + kcy[3][0]) == 1); + static_assert((kc[3][1] + kcx[3][1] + kcy[3][1]) == 1); + static_assert((kc[3][2] + kcx[3][2] + kcy[3][2]) == 1); + static_assert((kc[4][0] + kcx[4][0] + kcy[4][0]) == 1); + static_assert((kc[4][1] + kcx[4][1] + kcy[4][1]) == 1); + static_assert((kc[4][2] + kcx[4][2] + kcy[4][2]) == -1); + static_assert((kc[5][0] + kcx[5][0] + kcy[5][0]) == 1); + static_assert((kc[5][1] + kcx[5][1] + kcy[5][1]) == 1); + static_assert((kc[5][2] + kcx[5][2] + kcy[5][2]) == 1); + + this->dh_fdata->h_buffer.ptr[0] = std::numeric_limits::max(); + this->dh_fdata->h_buffer.ptr[1] = std::numeric_limits::max(); + this->dh_fdata->h_buffer.ptr[2] = std::numeric_limits::max(); + this->dh_fdata->h_buffer.ptr[3] = std::numeric_limits::lowest(); + this->dh_fdata->h_buffer.ptr[4] = std::numeric_limits::lowest(); + this->dh_fdata->h_buffer.ptr[5] = std::numeric_limits::lowest(); + this->dh_fdata->host_to_device(); + + this->sycl_target->queue + .submit([=](sycl::handler &cgh) { + sycl::local_accessor local_mem( + sycl::range<1>(num_bytes_local * local_size_l), cgh); + + cgh.parallel_for<>( + this->sycl_target->device_limits.validate_nd_range( + sycl::nd_range<3>(range_global, range_local)), + [=](auto idx) { + MappingNewtonIterationBase k_newton_type{}; + + const auto local_id = idx.get_local_linear_id(); + const auto iix = idx.get_global_id(2); + const auto iiy = idx.get_global_id(1); + const auto facex = idx.get_global_id(0); + const REAL gx = -1.0 + iix * k_width; + const REAL gy = -1.0 + iiy * k_width; + + const REAL eta0 = + kc[facex][0] + kcx[facex][0] * gx + kcy[facex][0] * gy; + const REAL eta1 = + kc[facex][1] + kcx[facex][1] * gx + kcy[facex][1] * gy; + const REAL eta2 = + kc[facex][2] + kcx[facex][2] * gx + kcy[facex][2] * gy; + + REAL k_xi0, k_xi1, k_xi2; + k_newton_type.loc_collapsed_to_loc_coord( + k_map_data, eta0, eta1, eta2, &k_xi0, &k_xi1, &k_xi2); + + REAL f[3] = {0.0, 0.0, 0.0}; + constexpr REAL p0 = 0.0; + constexpr REAL p1 = 0.0; + constexpr REAL p2 = 0.0; + + k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f, f + 1, + f + 2, &local_mem[local_id * num_bytes_local]); + idx.barrier(sycl::access::fence_space::local_space); + + // Do the reductions, we pessimistically do not use the builtin + // SYCL functions as we have used all the local memory already + // and the SYCL reduction functions also use local memory. + for (int dimx = 0; dimx < 3; dimx++) { + + // Tree reduce the maximum + local_mem[local_id] = f[dimx]; + for (int ix = local_size_l / 2; ix > 0; ix >>= 1) { + idx.barrier(sycl::access::fence_space::local_space); + if (local_id < ix) { + local_mem[local_id] = sycl::max(local_mem[local_id + ix], + local_mem[local_id]); + } + } + if (local_id == 0) { + sycl::atomic_ref + ar(k_fdata[dimx + 3]); + ar.fetch_max(local_mem[0]); + } + // Tree reduce the minimum + local_mem[local_id] = f[dimx]; + for (int ix = local_size_l / 2; ix > 0; ix >>= 1) { + idx.barrier(sycl::access::fence_space::local_space); + if (local_id < ix) { + local_mem[local_id] = sycl::min(local_mem[local_id + ix], + local_mem[local_id]); + } + } + if (local_id == 0) { + sycl::atomic_ref + ar(k_fdata[dimx]); + ar.fetch_min(local_mem[0]); + } + } + }); + }) + .wait_and_throw(); + + this->dh_fdata->device_to_host(); + std::array output; + for (int cx = 0; cx < 6; cx++) { + output[cx] = this->dh_fdata->h_buffer.ptr[cx]; + } + return output; + } }; } // namespace NESO::Newton diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp index b79e9c5a..d2a3c4cb 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp @@ -89,12 +89,9 @@ MapParticles3D::MapParticles3D( config); } - // Create a mapper for 3D deformed non-linear geometry objects - // as a sycl version is not written yet we reuse the host mapper - // if (geometry_container_3d.deformed_non_linear.size()) { - // this->map_particles_host = std::make_unique( - // sycl_target, particle_mesh_interface, config); - //} + // Create a host mapper as a last resort mapping attempt. + this->map_particles_host = std::make_unique( + sycl_target, particle_mesh_interface, config); } void MapParticles3D::map(ParticleGroup &particle_group, const int map_cell) { @@ -129,21 +126,19 @@ void MapParticles3D::map(ParticleGroup &particle_group, const int map_cell) { map_newton_final(this->map_particles_3d_deformed_non_linear, particle_group, map_cell); - if (this->map_particles_host) { - // are there particles whcih are not yet mapped into cells + if (map_cell > -1) { + // if there are particles not yet mapped this may be an error depending on + // which stage of NESO-Particles hybrid move we are at. particles_not_mapped = this->map_particles_common->check_map(particle_group, map_cell); - // attempt to bin the remaining particles into deformed cells if there are - // deformed cells. - if (particles_not_mapped) { - this->map_particles_host->map(particle_group, map_cell); + if (this->map_particles_host && particles_not_mapped) { + auto pr = ProfileRegion("MapParticles3D", "host_backup"); + this->map_particles_host->map(particle_group, -1); + pr.end(); + this->sycl_target->profile_map.add_region(pr); } - } - if (map_cell > -1) { - // if there are particles not yet mapped this may be an error depending on - // which stage of NESO-Particles hybrid move we are at. particles_not_mapped = this->map_particles_common->check_map(particle_group, map_cell); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6e92cf72..8351a840 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -85,6 +85,10 @@ list(REMOVE_ITEM TEST_LIBRARIES "gcov") set(UNIT_EXE unitTests) add_executable(${UNIT_EXE} ${UNIT_SRC_FILES}) target_link_libraries(${UNIT_EXE} PRIVATE ${NESO_LIBRARY_NAME} GTest::gtest) +if(ENABLE_NESO_PROFILING) + target_compile_definitions(${UNIT_EXE} + PRIVATE NESO_PARTICLES_PROFILING_REGION) +endif() add_sycl_to_target(TARGET ${UNIT_EXE} SOURCES ${UNIT_SRC_FILES}) gtest_add_tests(TARGET ${UNIT_EXE}) @@ -100,6 +104,10 @@ target_link_libraries( PRIVATE ${NESO_LIBRARY_NAME} ${SOLVER_LIBS} ${ELECTROSTATIC_2D3V_LIBRARY_NAME} GTest::gmock_main GTest::gtest Boost::boost) +if(ENABLE_NESO_PROFILING) + target_compile_definitions(${INTEGRATION_EXE} + PRIVATE NESO_PARTICLES_PROFILING_REGION) +endif() # Define the integration test executable as a sycl target add_sycl_to_target(TARGET ${INTEGRATION_EXE} SOURCES ${TEST_MAIN} diff --git a/test/integration/nektar_interface/test_particle_advection.cpp b/test/integration/nektar_interface/test_particle_advection.cpp index 2f2c9a70..f527aef2 100644 --- a/test/integration/nektar_interface/test_particle_advection.cpp +++ b/test/integration/nektar_interface/test_particle_advection.cpp @@ -176,11 +176,14 @@ TEST_P(ParticleAdvection3D, Advection3D) { auto graph = SpatialDomains::MeshGraph::Read(session); auto mesh = std::make_shared(graph); + extend_halos_fixed_offset(1, mesh); auto sycl_target = std::make_shared(0, mesh->get_comm()); auto config = std::make_shared(); config->set("MapParticlesNewton/newton_tol", 1.0e-10); - config->set("MapParticlesNewton/contained_tol", 1.0e-10); + // There are some pyramid corners that are hard to bin into with tighter + // tolerances. + config->set("MapParticlesNewton/contained_tol", 1.0e-2); auto nektar_graph_local_mapper = std::make_shared(sycl_target, mesh, config); @@ -322,6 +325,7 @@ TEST_P(ParticleAdvection3D, Advection3D) { lambda_advect(); T += dt; + // h5part.write(); } @@ -349,3 +353,178 @@ INSTANTIATE_TEST_SUITE_P( // like (err_x * err_x // + err_y * err_y) < 1.0e-8 ))); + +// TODO REMOVE START +class FooBar : public testing::TestWithParam< + std::tuple> {}; +TEST_P(FooBar, Advection3D) { + // Test advecting particles between ranks + + std::tuple param = GetParam(); + + const int N_total = 100000; + const double tol = std::get<2>(param); + + TestUtilities::TestResourceSession resource_session( + static_cast(std::get<1>(param)), + static_cast(std::get<0>(param))); + + // Create session reader. + auto session = resource_session.session; + auto graph = SpatialDomains::MeshGraph::Read(session); + + auto mesh = std::make_shared(graph); + extend_halos_fixed_offset(1, mesh); + auto sycl_target = std::make_shared(0, mesh->get_comm()); + + auto config = std::make_shared(); + config->set("MapParticlesNewton/newton_tol", 1.0e-12); + config->set("MapParticlesNewton/contained_tol", 1.0e-2); + + auto nektar_graph_local_mapper = + std::make_shared(sycl_target, mesh, config); + + auto domain = std::make_shared(mesh, nektar_graph_local_mapper); + + const int ndim = 3; + ParticleSpec particle_spec{ParticleProp(Sym("P"), ndim, true), + ParticleProp(Sym("P_ORIG"), ndim), + ParticleProp(Sym("V"), 3), + ParticleProp(Sym("CELL_ID"), 1, true), + ParticleProp(Sym("ID"), 1)}; + + auto A = std::make_shared(domain, particle_spec, sycl_target); + + NektarCartesianPeriodic pbc(sycl_target, graph, A->position_dat); + + CellIDTranslation cell_id_translation(sycl_target, A->cell_id_dat, mesh); + + const int rank = sycl_target->comm_pair.rank_parent; + const int size = sycl_target->comm_pair.size_parent; + + std::mt19937 rng_pos(52234234 + rank); + std::mt19937 rng_vel(52234231 + rank); + std::mt19937 rng_rank(18241); + + int rstart, rend; + get_decomp_1d(size, N_total, rank, &rstart, &rend); + const int N = rend - rstart; + + int N_check = -1; + MPICHK(MPI_Allreduce(&N, &N_check, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD)); + NESOASSERT(N_check == N_total, "Error creating particles"); + + const int Nsteps = 20; + const REAL dt = 0.1; + const int cell_count = domain->mesh->get_cell_count(); + + if (N > 0) { + auto positions = + uniform_within_extents(N, ndim, pbc.global_extent, rng_pos); + auto velocities = + NESO::Particles::normal_distribution(N, 3, 0.0, 0.5, rng_vel); + std::uniform_int_distribution uniform_dist( + 0, sycl_target->comm_pair.size_parent - 1); + ParticleSet initial_distribution(N, A->get_particle_spec()); + for (int px = 0; px < N; px++) { + for (int dimx = 0; dimx < ndim; dimx++) { + const double pos_orig = positions[dimx][px] + pbc.global_origin[dimx]; + initial_distribution[Sym("P")][px][dimx] = pos_orig; + initial_distribution[Sym("P_ORIG")][px][dimx] = pos_orig; + } + for (int dimx = 0; dimx < 3; dimx++) { + initial_distribution[Sym("V")][px][dimx] = velocities[dimx][px]; + } + initial_distribution[Sym("CELL_ID")][px][0] = 0; + initial_distribution[Sym("ID")][px][0] = px; + const auto px_rank = uniform_dist(rng_rank); + initial_distribution[Sym("NESO_MPI_RANK")][px][0] = px_rank; + } + A->add_particles_local(initial_distribution); + } + reset_mpi_ranks((*A)[Sym("NESO_MPI_RANK")]); + + MeshHierarchyGlobalMap mesh_hierarchy_global_map( + sycl_target, domain->mesh, A->position_dat, A->cell_id_dat, + A->mpi_rank_dat); + + auto lambda_advect = [&] { + auto t0 = profile_timestamp(); + particle_loop( + A, + [=](auto P, auto V) { + for (int dimx = 0; dimx < ndim; dimx++) { + P.at(dimx) += dt * V.at(dimx); + } + }, + Access::write(Sym("P")), Access::read(Sym("V"))) + ->execute(); + sycl_target->profile_map.inc("Advect", "Execute", 1, + profile_elapsed(t0, profile_timestamp())); + }; + + H5Part h5part("trajectory.h5part", A, Sym("P"), + Sym("NESO_MPI_RANK"), + Sym("NESO_REFERENCE_POSITIONS")); + + write_vtk_cells_owned("owned_cells", mesh); + + for (int stepx = 0; stepx < 2; stepx++) { + pbc.execute(); + mesh_hierarchy_global_map.execute(); + A->hybrid_move(); + cell_id_translation.execute(); + A->cell_move(); + lambda_advect(); + h5part.write(); + h5part.close(); + } + sycl_target->profile_map.enable(); + sycl_target->profile_map.reset(); + auto t0 = profile_timestamp(); + REAL T = 0.0; + for (int stepx = 0; stepx < Nsteps; stepx++) { + pbc.execute(); + mesh_hierarchy_global_map.execute(); + A->hybrid_move(); + cell_id_translation.execute(); + A->cell_move(); + + lambda_advect(); + T += dt; + + auto tt = profile_elapsed(t0, profile_timestamp()); + + if (!rank) { + nprint(stepx, tt / (((stepx + 1)) * N_total)); + } + // h5part.write(); + } + sycl_target->profile_map.write_events_json("newton_test_events", rank); + + // h5part.close(); + mesh->free(); +} + +INSTANTIATE_TEST_SUITE_P( + MultipleMeshes, FooBar, + testing::Values( + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/linear_non_regular_0.5.xml", + 1.0e-4 // The non-linear exit tolerance in Nektar is + // like (err_x * err_x + // + err_y * err_y) < 1.0e-8 + ), + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/mixed_ref_cube_0.5.xml", 1.0e-10), + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml", + 1.0e-4 // The non-linear exit tolerance in Nektar is + // like (err_x * err_x + // + err_y * err_y) < 1.0e-8 + ))); + +// TODO REMOVE END From 6836d0f258201669939890de2c25e1d42bab87d7 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Fri, 15 Nov 2024 16:46:01 +0000 Subject: [PATCH 41/66] added utility function to create curved HexGeoms on the fly for testing --- .../map_particles_newton.hpp | 11 +- .../particle_cell_mapping/x_map_newton.hpp | 11 +- .../test_helper_utilities.hpp | 2 + ..._particle_geometry_interface_3d_curved.cpp | 417 ++++++++++++++++++ 4 files changed, 433 insertions(+), 8 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp index fc3818c3..77a99da1 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -134,8 +134,12 @@ class MapParticlesNewton : public CoarseMappersBase { config->get("MapParticlesNewton/newton_max_iteration", 51); this->contained_tol = config->get("MapParticlesNewton/contained_tol", this->newton_tol); - const int num_modes_factor = + const REAL num_modes_factor = config->get("MapParticlesNewton/num_modes_factor", 1); + const auto grid_size_min = + config->get("MapParticlesNewton/grid_size_min", 2); + const auto grid_size_max = + config->get("MapParticlesNewton/grid_size_min", 4); this->num_geoms = geoms_local.size() + geoms_remote.size(); if (this->num_geoms > 0) { @@ -217,7 +221,10 @@ class MapParticlesNewton : public CoarseMappersBase { std::max(num_modes, geom->geom->GetXmap()->EvalBasisNumModesMax()); } - this->grid_size = num_modes * num_modes_factor; + this->grid_size = + std::min(std::max(static_cast(num_modes * num_modes_factor), + static_cast(grid_size_min)), + static_cast(grid_size_max)); this->dh_cell_ids->host_to_device(); this->dh_mpi_ranks->host_to_device(); this->dh_type->host_to_device(); diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 155c14a1..a6bb838b 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -342,12 +342,11 @@ template class XMapNewton { static_assert((kc[5][1] + kcx[5][1] + kcy[5][1]) == 1); static_assert((kc[5][2] + kcx[5][2] + kcy[5][2]) == 1); - this->dh_fdata->h_buffer.ptr[0] = std::numeric_limits::max(); - this->dh_fdata->h_buffer.ptr[1] = std::numeric_limits::max(); - this->dh_fdata->h_buffer.ptr[2] = std::numeric_limits::max(); - this->dh_fdata->h_buffer.ptr[3] = std::numeric_limits::lowest(); - this->dh_fdata->h_buffer.ptr[4] = std::numeric_limits::lowest(); - this->dh_fdata->h_buffer.ptr[5] = std::numeric_limits::lowest(); + for (int dx = 0; dx < 3; dx++) { + this->dh_fdata->h_buffer.ptr[dx] = std::numeric_limits::max(); + this->dh_fdata->h_buffer.ptr[dx + 3] = + std::numeric_limits::lowest(); + } this->dh_fdata->host_to_device(); this->sycl_target->queue diff --git a/test/unit/nektar_interface/test_helper_utilities.hpp b/test/unit/nektar_interface/test_helper_utilities.hpp index aa094809..f482a801 100644 --- a/test/unit/nektar_interface/test_helper_utilities.hpp +++ b/test/unit/nektar_interface/test_helper_utilities.hpp @@ -6,6 +6,8 @@ #include "nektar_interface/utilities.hpp" #include "nektar_interface/utility_mesh_plotting.hpp" #include +#include +#include #include #include #include diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index e6c272bb..5f4a133e 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -175,5 +175,422 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { } } + sycl_target->free(); mesh->free(); } + +template +inline std::shared_ptr make_hex_geom(const int num_modes, T xmapx, + U xmapy, V xmapz) { + + /** + * Vertices: + * + * 7 - 6 + * | | + * 4 - 5 + * + * 3 - 2 + * | | + * 0 - 1 + * + * Edges: + * + * * 10 * + * 11 9 + * * 8 * + * + * 7 - 6 + * | | + * 4 - 5 + * + * * 2 * + * 3 1 + * * 0 * + * + * Faces: + * + * * - * + * | 5 | + * * - * + * + * * 3 * + * 4 2 + * * 1 * + * + * * - * + * | 0 | + * * - * + * + * auto pts = LibUtilities::PointsManager()[*points_key]; + * Triangle is something like trievenlyspaced + * quad will x fastest then y + * Triangles are not the expansion looping ordering - look at nektmesh + * top eta0, eta1, eta2=0 + * eta0 eta1 + * + * make meshgraph, meshgraphio. view -> adavnced "nonlinear subdivisions + * (slider)" + */ + + REAL coords_vertices[8][3] = {{-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, + {1.0, 1.0, -1.0}, {-1.0, 1.0, -1.0}, + {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, + {1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}}; + + int map_edge_to_vertices[12][2] = { + {0, 1}, {1, 2}, {2, 3}, {3, 0}, + + {0, 4}, {1, 5}, {2, 6}, {3, 7}, + + {4, 5}, {5, 6}, {6, 7}, {7, 4}, + }; + + int map_face_to_edges[6][4] = { + {0, 1, 2, 3}, {0, 5, 8, 4}, {1, 6, 9, 5}, + {2, 7, 10, 6}, {3, 4, 11, 7}, {8, 9, 10, 11}, + }; + + int map_face_to_vertices[6][4] = {{0, 1, 2, 3}, {0, 1, 4, 5}, {1, 2, 6, 5}, + {2, 3, 7, 6}, {1, 3, 7, 4}, {4, 5, 6, 7}}; + + auto points_key = PointsKey(num_modes, ePolyEvenlySpaced); + auto control_points = std::make_shared(points_key); + control_points->Initialize(); + auto Z = control_points->GetZ(); + std::vector Znormalised(Z.size()); + for (int ix = 0; ix < num_modes; ix++) { + Znormalised.at(ix) = (Z[ix] + 1.0) / 2.0; + } + + std::map> v; + std::map> e; + std::map> c; + std::map> q; + + // Create the vertices + int vx_index = 0; + int cx_index = 0; + for (int vx = 0; vx < 8; vx++) { + const REAL px = xmapx(coords_vertices[vx]); + const REAL py = xmapy(coords_vertices[vx]); + const REAL pz = xmapz(coords_vertices[vx]); + v[vx] = std::make_shared(3, vx_index++, px, py, pz); + } + + // Create the edges + auto lambda_get_1D_qpoint = [&](const int point_id, const auto a, + const auto b) -> std::array { + NekDouble ax, ay, az, bx, by, bz; + ax = a[0]; + ay = a[1]; + az = a[2]; + bx = b[0]; + by = b[1]; + bz = b[2]; + const NekDouble dx = bx - ax; + const NekDouble dy = by - ay; + const NekDouble dz = bz - az; + + std::array out; + out[0] = ax + Znormalised[point_id] * dx; + out[1] = ay + Znormalised[point_id] * dy; + out[2] = az + Znormalised[point_id] * dz; + return out; + }; + + for (int ex = 0; ex < 12; ex++) { + auto cx = std::make_shared(cx_index++, ePolyEvenlySpaced); + + for (int mx = 0; mx < num_modes; mx++) { + auto ref_coord = + lambda_get_1D_qpoint(mx, coords_vertices[map_edge_to_vertices[ex][0]], + coords_vertices[map_edge_to_vertices[ex][1]]); + const REAL px = xmapx(ref_coord); + const REAL py = xmapy(ref_coord); + const REAL pz = xmapz(ref_coord); + cx->m_points.push_back( + std::make_shared(3, vx_index++, px, py, pz)); + } + std::shared_ptr vertices_array[2] = { + v.at(map_edge_to_vertices[ex][0]), v.at(map_edge_to_vertices[ex][1])}; + c[ex] = cx; + e[ex] = std::make_shared(ex, 3, vertices_array, cx); + e[ex]->GetGeomFactors(); + e[ex]->Setup(); + } + + // Create the faces + auto lambda_get_2D_qpoint = [&](const int point_id0, const int point_id1, + const auto a, const auto b, + const auto c) -> std::array { + /** + * c + * | + * a - b + */ + + NekDouble ax, ay, az, bx, by, bz, cx, cy, cz; + ax = a[0]; + ay = a[1]; + az = a[2]; + bx = b[0]; + by = b[1]; + bz = b[2]; + cx = c[0]; + cy = c[1]; + cz = c[2]; + const NekDouble d0x = bx - ax; + const NekDouble d0y = by - ay; + const NekDouble d0z = bz - az; + const NekDouble d1x = cx - ax; + const NekDouble d1y = cy - ay; + const NekDouble d1z = cz - az; + + std::array out; + out[0] = ax + Znormalised[point_id0] * d0x + Znormalised[point_id1] * d1x; + out[1] = ay + Znormalised[point_id0] * d0y + Znormalised[point_id1] * d1y; + out[2] = az + Znormalised[point_id0] * d0z + Znormalised[point_id1] * d1z; + return out; + }; + + for (int fx = 0; fx < 6; fx++) { + std::shared_ptr vertices_array[4] = { + v.at(map_face_to_vertices[fx][0]), v.at(map_face_to_vertices[fx][1]), + v.at(map_face_to_vertices[fx][2]), v.at(map_face_to_vertices[fx][3])}; + + auto cx = std::make_shared(cx_index++, ePolyEvenlySpaced); + for (int mx = 0; mx < num_modes; mx++) { + for (int my = 0; my < num_modes; my++) { + auto ref_coord = lambda_get_2D_qpoint( + mx, my, coords_vertices[map_face_to_vertices[fx][0]], + coords_vertices[map_face_to_vertices[fx][1]], + coords_vertices[map_face_to_vertices[fx][3]]); + const REAL px = xmapx(ref_coord); + const REAL py = xmapy(ref_coord); + const REAL pz = xmapz(ref_coord); + cx->m_points.push_back( + std::make_shared(3, vx_index++, px, py, pz)); + } + } + + std::shared_ptr edges_array[4] = { + e.at(map_face_to_edges[fx][0]), e.at(map_face_to_edges[fx][1]), + e.at(map_face_to_edges[fx][2]), e.at(map_face_to_edges[fx][3])}; + q[fx] = std::make_shared(fx, edges_array, cx); + q[fx]->GetGeomFactors(); + q[fx]->Setup(); + } + + std::shared_ptr quads[6] = {q[0], q[1], q[2], q[3], q[4], q[5]}; + + auto hex = std::make_shared(0, quads); + hex->GetGeomFactors(); + hex->Setup(); + + return hex; +} + +TEST(ParticleGeometryInterfaceCurved, MakeCurvedHex) { + + auto lambda_check = [&](auto correct, auto to_test) { + const auto err_abs = std::abs(correct - to_test); + const auto err_rel = + std::abs(correct) > 0.0 ? err_abs / std::abs(correct) : err_abs; + const REAL tol = 1.0e-10; + ASSERT_TRUE(err_abs < tol || err_rel < tol); + }; + + { + auto xmapx = [&](auto eta) { return eta[0] * 2.0; }; + auto xmapy = [&](auto eta) { return eta[1] * 3.0; }; + auto xmapz = [&](auto eta) { return eta[2] * 5.0; }; + + const int num_modes = 3; + auto h = make_hex_geom(num_modes, xmapx, xmapy, xmapz); + + auto points_key = PointsKey(num_modes, ePolyEvenlySpaced); + auto control_points = std::make_shared(points_key); + control_points->Initialize(); + auto Z = control_points->GetZ(); + + Array lcoords(3); + for (int iz = 0; iz < num_modes; iz++) { + for (int iy = 0; iy < num_modes; iy++) { + for (int ix = 0; ix < num_modes; ix++) { + lcoords[0] = Z[ix]; + lcoords[1] = Z[iy]; + lcoords[2] = Z[iz]; + + auto x0 = h->GetCoord(0, lcoords); + auto x1 = h->GetCoord(1, lcoords); + auto x2 = h->GetCoord(2, lcoords); + auto c0 = xmapx(lcoords); + auto c1 = xmapy(lcoords); + auto c2 = xmapz(lcoords); + lambda_check(c0, x0); + lambda_check(c1, x1); + lambda_check(c2, x2); + } + } + } + } + + { + auto xmapx = [&](auto eta) { return eta[0] * 2.0 + 7.0; }; + auto xmapy = [&](auto eta) { return eta[1] * 3.0 + 9.0; }; + auto xmapz = [&](auto eta) { return eta[2] * 5.0 + 11.0; }; + + const int num_modes = 3; + auto h = make_hex_geom(num_modes, xmapx, xmapy, xmapz); + + auto points_key = PointsKey(num_modes, ePolyEvenlySpaced); + auto control_points = std::make_shared(points_key); + control_points->Initialize(); + auto Z = control_points->GetZ(); + + Array lcoords(3); + for (int iz = 0; iz < num_modes; iz++) { + for (int iy = 0; iy < num_modes; iy++) { + for (int ix = 0; ix < num_modes; ix++) { + lcoords[0] = Z[ix]; + lcoords[1] = Z[iy]; + lcoords[2] = Z[iz]; + + auto x0 = h->GetCoord(0, lcoords); + auto x1 = h->GetCoord(1, lcoords); + auto x2 = h->GetCoord(2, lcoords); + auto c0 = xmapx(lcoords); + auto c1 = xmapy(lcoords); + auto c2 = xmapz(lcoords); + lambda_check(c0, x0); + lambda_check(c1, x1); + lambda_check(c2, x2); + } + } + } + } + + { + auto xmapx = [&](auto eta) { return eta[0]; }; + auto xmapy = [&](auto eta) { return eta[1]; }; + auto xmapz = [&](auto eta) { + return eta[2] + 0.2 * eta[0] * eta[0] + 0.2 * eta[1] * eta[1]; + }; + + const int num_modes = 3; + auto h = make_hex_geom(num_modes, xmapx, xmapy, xmapz); + + auto points_key = PointsKey(num_modes, ePolyEvenlySpaced); + auto control_points = std::make_shared(points_key); + control_points->Initialize(); + auto Z = control_points->GetZ(); + + Array lcoords(3); + for (int iz = 0; iz < num_modes; iz++) { + for (int iy = 0; iy < num_modes; iy++) { + for (int ix = 0; ix < num_modes; ix++) { + lcoords[0] = Z[ix]; + lcoords[1] = Z[iy]; + lcoords[2] = Z[iz]; + + auto x0 = h->GetCoord(0, lcoords); + auto x1 = h->GetCoord(1, lcoords); + auto x2 = h->GetCoord(2, lcoords); + auto c0 = xmapx(lcoords); + auto c1 = xmapy(lcoords); + auto c2 = xmapz(lcoords); + lambda_check(c0, x0); + lambda_check(c1, x1); + lambda_check(c2, x2); + } + } + } + } + + { + auto xmapx = [&](auto eta) { return eta[0]; }; + auto xmapy = [&](auto eta) { + return eta[1] + 0.1 * eta[0] + 0.1 * eta[2] * eta[2]; + }; + auto xmapz = [&](auto eta) { + return eta[2] + 0.2 * eta[0] * eta[0] + 0.2 * eta[1] * eta[1]; + }; + + const int num_modes = 3; + auto h = make_hex_geom(num_modes, xmapx, xmapy, xmapz); + + auto points_key = PointsKey(num_modes, ePolyEvenlySpaced); + auto control_points = std::make_shared(points_key); + control_points->Initialize(); + auto Z = control_points->GetZ(); + + Array lcoords(3); + for (int iz = 0; iz < num_modes; iz++) { + for (int iy = 0; iy < num_modes; iy++) { + for (int ix = 0; ix < num_modes; ix++) { + lcoords[0] = Z[ix]; + lcoords[1] = Z[iy]; + lcoords[2] = Z[iz]; + + auto x0 = h->GetCoord(0, lcoords); + auto x1 = h->GetCoord(1, lcoords); + auto x2 = h->GetCoord(2, lcoords); + auto c0 = xmapx(lcoords); + auto c1 = xmapy(lcoords); + auto c2 = xmapz(lcoords); + lambda_check(c0, x0); + lambda_check(c1, x1); + lambda_check(c2, x2); + } + } + } + } + + { + auto xmapx = [&](auto eta) { + return eta[0] + (0.2 - 0.1 * eta[2] * eta[2]) - 2.0; + }; + auto xmapy = [&](auto eta) { + return eta[1] + 0.1 * eta[0] + 0.1 * eta[2] * eta[2]; + }; + auto xmapz = [&](auto eta) { + return eta[2] + 0.2 * eta[0] * eta[0] + 0.2 * eta[1] * eta[1]; + }; + + const int num_modes = 3; + auto h = make_hex_geom(num_modes, xmapx, xmapy, xmapz); + + auto points_key = PointsKey(num_modes, ePolyEvenlySpaced); + auto control_points = std::make_shared(points_key); + control_points->Initialize(); + auto Z = control_points->GetZ(); + + Array lcoords(3); + for (int iz = 0; iz < num_modes; iz++) { + for (int iy = 0; iy < num_modes; iy++) { + for (int ix = 0; ix < num_modes; ix++) { + lcoords[0] = Z[ix]; + lcoords[1] = Z[iy]; + lcoords[2] = Z[iz]; + + auto x0 = h->GetCoord(0, lcoords); + auto x1 = h->GetCoord(1, lcoords); + auto x2 = h->GetCoord(2, lcoords); + auto c0 = xmapx(lcoords); + auto c1 = xmapy(lcoords); + auto c2 = xmapz(lcoords); + lambda_check(c0, x0); + lambda_check(c1, x1); + lambda_check(c2, x2); + } + } + } + } +} + +TEST(ParticleGeometryInterfaceCurved, BoundingBox) { + + auto sycl_target = std::make_shared(0, MPI_COMM_WORLD); + sycl_target->free(); +} From 1bee74c4147752d1725bf9725972e0e7853d14cb Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Fri, 15 Nov 2024 17:23:27 +0000 Subject: [PATCH 42/66] moved hex creation function into neso library --- CMakeLists.txt | 1 + include/nektar_interface/utility_mesh.hpp | 251 ++++++++++++++++++ .../test_helper_utilities.hpp | 1 + ..._particle_geometry_interface_3d_curved.cpp | 212 --------------- 4 files changed, 253 insertions(+), 212 deletions(-) create mode 100644 include/nektar_interface/utility_mesh.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index cfc61529..17bae3a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -238,6 +238,7 @@ set(HEADER_FILES ${INC_DIR}/nektar_interface/solver_base/time_evolved_eqnsys_base.hpp ${INC_DIR}/nektar_interface/typedefs.hpp ${INC_DIR}/nektar_interface/utilities.hpp + ${INC_DIR}/nektar_interface/utility_mesh.hpp ${INC_DIR}/nektar_interface/utility_mesh_cartesian.hpp ${INC_DIR}/nektar_interface/utility_mesh_plotting.hpp ${INC_DIR}/nektar_interface/utility_sycl.hpp diff --git a/include/nektar_interface/utility_mesh.hpp b/include/nektar_interface/utility_mesh.hpp new file mode 100644 index 00000000..7c519658 --- /dev/null +++ b/include/nektar_interface/utility_mesh.hpp @@ -0,0 +1,251 @@ +#ifndef __UTILITY_MESH_H_ +#define __UTILITY_MESH_H_ + +#include +#include +#include + +#include +#include +using namespace Nektar; + +namespace NESO { + +/** + * Create a curved HexGeom from three X maps and a number of modes. Each X map + * should map the reference space [-1,1]^3 to a point in R. + * + * @param num_modes Number of modes in the coordinate mapping for the Xmap, i.e. + * polynomial order plus 1. + * @param xmapx Callable that defines the X map in the x direction with + * signature NekDouble(NekDouble[3]) where the single argument is a + * subscriptable type.; + * @param xmapy Callable that defines the X map in the y direction with + * signature NekDouble(NekDouble[3]) where the single argument is a + * subscriptable type.; + * @param xmapz Callable that defines the X map in the z direction with + * signature NekDouble(NekDouble[3]) where the single argument is a + * subscriptable type.; + * @returns HexGeom constructed from X maps. + */ +template +inline std::shared_ptr +make_hex_geom(const int num_modes, T xmapx, U xmapy, V xmapz) { + + /** + * Vertices: + * + * 7 - 6 + * | | z = 1 + * 4 - 5 + * + * 3 - 2 + * | | z = -1 + * 0 - 1 + * + * Edges: + * + * * 10 * + * 11 9 z = 1 + * * 8 * + * + * 7 - 6 + * | | z = 0 + * 4 - 5 + * + * * 2 * + * 3 1 z = -1 + * * 0 * + * + * Faces: + * + * * - * + * | 5 | Top face, z = 1 + * * - * + * + * * 3 * + * 4 2 Sides, z = 0 + * * 1 * + * + * * - * + * | 0 | Bottom face, z = -1 + * * - * + * + * auto pts = LibUtilities::PointsManager()[*points_key]; + * Triangle is something like trievenlyspaced + * quad will x fastest then y + * Triangles are not the expansion looping ordering - look at nektmesh + * top eta0, eta1, eta2=0 + * eta0 eta1 + * + * make meshgraph, meshgraphio. view -> adavnced "nonlinear subdivisions + * (slider)" + */ + + NekDouble coords_vertices[8][3] = {{-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, + {1.0, 1.0, -1.0}, {-1.0, 1.0, -1.0}, + {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, + {1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}}; + + int map_edge_to_vertices[12][2] = { + {0, 1}, {1, 2}, {2, 3}, {3, 0}, + + {0, 4}, {1, 5}, {2, 6}, {3, 7}, + + {4, 5}, {5, 6}, {6, 7}, {7, 4}, + }; + + int map_face_to_edges[6][4] = { + {0, 1, 2, 3}, {0, 5, 8, 4}, {1, 6, 9, 5}, + {2, 7, 10, 6}, {3, 4, 11, 7}, {8, 9, 10, 11}, + }; + + int map_face_to_vertices[6][4] = {{0, 1, 2, 3}, {0, 1, 4, 5}, {1, 2, 6, 5}, + {2, 3, 7, 6}, {1, 3, 7, 4}, {4, 5, 6, 7}}; + + auto points_key = + LibUtilities::PointsKey(num_modes, LibUtilities::ePolyEvenlySpaced); + auto control_points = std::make_shared(points_key); + control_points->Initialize(); + auto Z = control_points->GetZ(); + std::vector Znormalised(Z.size()); + for (int ix = 0; ix < num_modes; ix++) { + Znormalised.at(ix) = (Z[ix] + 1.0) / 2.0; + } + + std::map> v; + std::map> e; + std::map> c; + std::map> q; + + // Create the vertices + int vx_index = 0; + int cx_index = 0; + for (int vx = 0; vx < 8; vx++) { + const NekDouble px = xmapx(coords_vertices[vx]); + const NekDouble py = xmapy(coords_vertices[vx]); + const NekDouble pz = xmapz(coords_vertices[vx]); + v[vx] = + std::make_shared(3, vx_index++, px, py, pz); + } + + // Create the edges + auto lambda_get_1D_qpoint = [&](const int point_id, const auto a, + const auto b) -> std::array { + NekDouble ax, ay, az, bx, by, bz; + ax = a[0]; + ay = a[1]; + az = a[2]; + bx = b[0]; + by = b[1]; + bz = b[2]; + const NekDouble dx = bx - ax; + const NekDouble dy = by - ay; + const NekDouble dz = bz - az; + + std::array out; + out[0] = ax + Znormalised[point_id] * dx; + out[1] = ay + Znormalised[point_id] * dy; + out[2] = az + Znormalised[point_id] * dz; + return out; + }; + + for (int ex = 0; ex < 12; ex++) { + auto cx = std::make_shared( + cx_index++, LibUtilities::ePolyEvenlySpaced); + + for (int mx = 0; mx < num_modes; mx++) { + auto ref_coord = + lambda_get_1D_qpoint(mx, coords_vertices[map_edge_to_vertices[ex][0]], + coords_vertices[map_edge_to_vertices[ex][1]]); + const NekDouble px = xmapx(ref_coord); + const NekDouble py = xmapy(ref_coord); + const NekDouble pz = xmapz(ref_coord); + cx->m_points.push_back(std::make_shared( + 3, vx_index++, px, py, pz)); + } + std::shared_ptr vertices_array[2] = { + v.at(map_edge_to_vertices[ex][0]), v.at(map_edge_to_vertices[ex][1])}; + c[ex] = cx; + e[ex] = + std::make_shared(ex, 3, vertices_array, cx); + e[ex]->GetGeomFactors(); + e[ex]->Setup(); + } + + // Create the faces + auto lambda_get_2D_qpoint = [&](const int point_id0, const int point_id1, + const auto a, const auto b, + const auto c) -> std::array { + /** + * c + * | + * a - b + */ + + NekDouble ax, ay, az, bx, by, bz, cx, cy, cz; + ax = a[0]; + ay = a[1]; + az = a[2]; + bx = b[0]; + by = b[1]; + bz = b[2]; + cx = c[0]; + cy = c[1]; + cz = c[2]; + const NekDouble d0x = bx - ax; + const NekDouble d0y = by - ay; + const NekDouble d0z = bz - az; + const NekDouble d1x = cx - ax; + const NekDouble d1y = cy - ay; + const NekDouble d1z = cz - az; + + std::array out; + out[0] = ax + Znormalised[point_id0] * d0x + Znormalised[point_id1] * d1x; + out[1] = ay + Znormalised[point_id0] * d0y + Znormalised[point_id1] * d1y; + out[2] = az + Znormalised[point_id0] * d0z + Znormalised[point_id1] * d1z; + return out; + }; + + for (int fx = 0; fx < 6; fx++) { + std::shared_ptr vertices_array[4] = { + v.at(map_face_to_vertices[fx][0]), v.at(map_face_to_vertices[fx][1]), + v.at(map_face_to_vertices[fx][2]), v.at(map_face_to_vertices[fx][3])}; + + auto cx = std::make_shared( + cx_index++, LibUtilities::ePolyEvenlySpaced); + for (int mx = 0; mx < num_modes; mx++) { + for (int my = 0; my < num_modes; my++) { + auto ref_coord = lambda_get_2D_qpoint( + mx, my, coords_vertices[map_face_to_vertices[fx][0]], + coords_vertices[map_face_to_vertices[fx][1]], + coords_vertices[map_face_to_vertices[fx][3]]); + const NekDouble px = xmapx(ref_coord); + const NekDouble py = xmapy(ref_coord); + const NekDouble pz = xmapz(ref_coord); + cx->m_points.push_back(std::make_shared( + 3, vx_index++, px, py, pz)); + } + } + + std::shared_ptr edges_array[4] = { + e.at(map_face_to_edges[fx][0]), e.at(map_face_to_edges[fx][1]), + e.at(map_face_to_edges[fx][2]), e.at(map_face_to_edges[fx][3])}; + q[fx] = std::make_shared(fx, edges_array, cx); + q[fx]->GetGeomFactors(); + q[fx]->Setup(); + } + + std::shared_ptr quads[6] = {q[0], q[1], q[2], + q[3], q[4], q[5]}; + + auto hex = std::make_shared(0, quads); + hex->GetGeomFactors(); + hex->Setup(); + + return hex; +} + +} // namespace NESO + +#endif diff --git a/test/unit/nektar_interface/test_helper_utilities.hpp b/test/unit/nektar_interface/test_helper_utilities.hpp index f482a801..8104b946 100644 --- a/test/unit/nektar_interface/test_helper_utilities.hpp +++ b/test/unit/nektar_interface/test_helper_utilities.hpp @@ -4,6 +4,7 @@ #include "nektar_interface/composite_interaction/composite_interaction.hpp" #include "nektar_interface/particle_interface.hpp" #include "nektar_interface/utilities.hpp" +#include "nektar_interface/utility_mesh.hpp" #include "nektar_interface/utility_mesh_plotting.hpp" #include #include diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 5f4a133e..d67711d2 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -179,218 +179,6 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { mesh->free(); } -template -inline std::shared_ptr make_hex_geom(const int num_modes, T xmapx, - U xmapy, V xmapz) { - - /** - * Vertices: - * - * 7 - 6 - * | | - * 4 - 5 - * - * 3 - 2 - * | | - * 0 - 1 - * - * Edges: - * - * * 10 * - * 11 9 - * * 8 * - * - * 7 - 6 - * | | - * 4 - 5 - * - * * 2 * - * 3 1 - * * 0 * - * - * Faces: - * - * * - * - * | 5 | - * * - * - * - * * 3 * - * 4 2 - * * 1 * - * - * * - * - * | 0 | - * * - * - * - * auto pts = LibUtilities::PointsManager()[*points_key]; - * Triangle is something like trievenlyspaced - * quad will x fastest then y - * Triangles are not the expansion looping ordering - look at nektmesh - * top eta0, eta1, eta2=0 - * eta0 eta1 - * - * make meshgraph, meshgraphio. view -> adavnced "nonlinear subdivisions - * (slider)" - */ - - REAL coords_vertices[8][3] = {{-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, - {1.0, 1.0, -1.0}, {-1.0, 1.0, -1.0}, - {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, - {1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}}; - - int map_edge_to_vertices[12][2] = { - {0, 1}, {1, 2}, {2, 3}, {3, 0}, - - {0, 4}, {1, 5}, {2, 6}, {3, 7}, - - {4, 5}, {5, 6}, {6, 7}, {7, 4}, - }; - - int map_face_to_edges[6][4] = { - {0, 1, 2, 3}, {0, 5, 8, 4}, {1, 6, 9, 5}, - {2, 7, 10, 6}, {3, 4, 11, 7}, {8, 9, 10, 11}, - }; - - int map_face_to_vertices[6][4] = {{0, 1, 2, 3}, {0, 1, 4, 5}, {1, 2, 6, 5}, - {2, 3, 7, 6}, {1, 3, 7, 4}, {4, 5, 6, 7}}; - - auto points_key = PointsKey(num_modes, ePolyEvenlySpaced); - auto control_points = std::make_shared(points_key); - control_points->Initialize(); - auto Z = control_points->GetZ(); - std::vector Znormalised(Z.size()); - for (int ix = 0; ix < num_modes; ix++) { - Znormalised.at(ix) = (Z[ix] + 1.0) / 2.0; - } - - std::map> v; - std::map> e; - std::map> c; - std::map> q; - - // Create the vertices - int vx_index = 0; - int cx_index = 0; - for (int vx = 0; vx < 8; vx++) { - const REAL px = xmapx(coords_vertices[vx]); - const REAL py = xmapy(coords_vertices[vx]); - const REAL pz = xmapz(coords_vertices[vx]); - v[vx] = std::make_shared(3, vx_index++, px, py, pz); - } - - // Create the edges - auto lambda_get_1D_qpoint = [&](const int point_id, const auto a, - const auto b) -> std::array { - NekDouble ax, ay, az, bx, by, bz; - ax = a[0]; - ay = a[1]; - az = a[2]; - bx = b[0]; - by = b[1]; - bz = b[2]; - const NekDouble dx = bx - ax; - const NekDouble dy = by - ay; - const NekDouble dz = bz - az; - - std::array out; - out[0] = ax + Znormalised[point_id] * dx; - out[1] = ay + Znormalised[point_id] * dy; - out[2] = az + Znormalised[point_id] * dz; - return out; - }; - - for (int ex = 0; ex < 12; ex++) { - auto cx = std::make_shared(cx_index++, ePolyEvenlySpaced); - - for (int mx = 0; mx < num_modes; mx++) { - auto ref_coord = - lambda_get_1D_qpoint(mx, coords_vertices[map_edge_to_vertices[ex][0]], - coords_vertices[map_edge_to_vertices[ex][1]]); - const REAL px = xmapx(ref_coord); - const REAL py = xmapy(ref_coord); - const REAL pz = xmapz(ref_coord); - cx->m_points.push_back( - std::make_shared(3, vx_index++, px, py, pz)); - } - std::shared_ptr vertices_array[2] = { - v.at(map_edge_to_vertices[ex][0]), v.at(map_edge_to_vertices[ex][1])}; - c[ex] = cx; - e[ex] = std::make_shared(ex, 3, vertices_array, cx); - e[ex]->GetGeomFactors(); - e[ex]->Setup(); - } - - // Create the faces - auto lambda_get_2D_qpoint = [&](const int point_id0, const int point_id1, - const auto a, const auto b, - const auto c) -> std::array { - /** - * c - * | - * a - b - */ - - NekDouble ax, ay, az, bx, by, bz, cx, cy, cz; - ax = a[0]; - ay = a[1]; - az = a[2]; - bx = b[0]; - by = b[1]; - bz = b[2]; - cx = c[0]; - cy = c[1]; - cz = c[2]; - const NekDouble d0x = bx - ax; - const NekDouble d0y = by - ay; - const NekDouble d0z = bz - az; - const NekDouble d1x = cx - ax; - const NekDouble d1y = cy - ay; - const NekDouble d1z = cz - az; - - std::array out; - out[0] = ax + Znormalised[point_id0] * d0x + Znormalised[point_id1] * d1x; - out[1] = ay + Znormalised[point_id0] * d0y + Znormalised[point_id1] * d1y; - out[2] = az + Znormalised[point_id0] * d0z + Znormalised[point_id1] * d1z; - return out; - }; - - for (int fx = 0; fx < 6; fx++) { - std::shared_ptr vertices_array[4] = { - v.at(map_face_to_vertices[fx][0]), v.at(map_face_to_vertices[fx][1]), - v.at(map_face_to_vertices[fx][2]), v.at(map_face_to_vertices[fx][3])}; - - auto cx = std::make_shared(cx_index++, ePolyEvenlySpaced); - for (int mx = 0; mx < num_modes; mx++) { - for (int my = 0; my < num_modes; my++) { - auto ref_coord = lambda_get_2D_qpoint( - mx, my, coords_vertices[map_face_to_vertices[fx][0]], - coords_vertices[map_face_to_vertices[fx][1]], - coords_vertices[map_face_to_vertices[fx][3]]); - const REAL px = xmapx(ref_coord); - const REAL py = xmapy(ref_coord); - const REAL pz = xmapz(ref_coord); - cx->m_points.push_back( - std::make_shared(3, vx_index++, px, py, pz)); - } - } - - std::shared_ptr edges_array[4] = { - e.at(map_face_to_edges[fx][0]), e.at(map_face_to_edges[fx][1]), - e.at(map_face_to_edges[fx][2]), e.at(map_face_to_edges[fx][3])}; - q[fx] = std::make_shared(fx, edges_array, cx); - q[fx]->GetGeomFactors(); - q[fx]->Setup(); - } - - std::shared_ptr quads[6] = {q[0], q[1], q[2], q[3], q[4], q[5]}; - - auto hex = std::make_shared(0, quads); - hex->GetGeomFactors(); - hex->Setup(); - - return hex; -} - TEST(ParticleGeometryInterfaceCurved, MakeCurvedHex) { auto lambda_check = [&](auto correct, auto to_test) { From f2821d0fe614c52fe0d0812add7202679f851f1d Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 19 Nov 2024 19:52:43 +0000 Subject: [PATCH 43/66] blocked Bary cpu evaluation progress --- CMakeLists.txt | 2 + .../bary_interpolation/bary_evaluation.hpp | 105 +++++++++++++ .../function_bary_evaluation.hpp | 140 +++++++++++++++++- include/nektar_interface/utility_sycl.hpp | 2 +- test/CMakeLists.txt | 1 + .../test_particle_function_evaluation_3d.cpp | 123 +++++++++++++++ 6 files changed, 366 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 17bae3a9..3f5bcfcf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,6 +99,8 @@ elseif(BUILD_TYPE STREQUAL "RELEASE") set(BUILD_TYPE_LINK_FLAGS "") set(TEST_LIBRARIES "") endif() +message(STATUS BUILD_TYPE_COMPILE_FLAGS: ${BUILD_TYPE_COMPILE_FLAGS}) +message(STATUS BUILD_TYPE_LINK_FLAGS: ${BUILD_TYPE_LINK_FLAGS}) # ############################################################################## # Set up targets diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp index f90a3627..1b86d79c 100644 --- a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -48,6 +48,60 @@ inline void preprocess_weights(const int num_phys, const REAL coord, } } +/** + * TODO + */ +template +inline void +preprocess_weights_block(const int num_phys, const REAL *const coord, + const REAL *const z_values, + const REAL *const bw_values, REAL *div_values) { + + for (int ix = 0; ix < num_phys; ix++) { + for (int blockx = 0; blockx < N; blockx++) { + div_values[ix * N + blockx] = 0.0; + } + } + bool on_point[N]; + for (int blockx = 0; blockx < N; blockx++) { + on_point[blockx] = false; + } + + for (int ix = 0; ix < num_phys; ix++) { + for (int blockx = 0; blockx < N; blockx++) { + const auto xdiff = z_values[ix] - coord[blockx]; + if (xdiff == 0.0) { + div_values[ix * N + blockx] = 1.0; + on_point[blockx] = true; + } + } + } + REAL denom[N]; + for (int blockx = 0; blockx < N; blockx++) { + denom[blockx] = 0.0; + } + + for (int ix = 0; ix < num_phys; ix++) { + for (int blockx = 0; blockx < N; blockx++) { + const auto xdiff = z_values[ix] - coord[blockx]; + const auto bw_over_diff = bw_values[ix] / xdiff; + div_values[ix * N + blockx] = + on_point[blockx] ? div_values[ix * N + blockx] : bw_over_diff; + denom[blockx] += bw_over_diff; + } + } + REAL factor[N]; + for (int blockx = 0; blockx < N; blockx++) { + factor[blockx] = on_point[blockx] ? 1.0 : 1.0 / denom[blockx]; + } + + for (int ix = 0; ix < num_phys; ix++) { + for (int blockx = 0; blockx < N; blockx++) { + div_values[ix * N + blockx] *= factor[blockx]; + } + } +} + /** * Perform Bary interpolation in the first dimension. * @@ -306,6 +360,57 @@ inline void compute_dir_210_interlaced(const int num_functions, } } +/** + * TODO + */ +template +inline void compute_dir_210_interlaced_block( + const int num_functions, const int num_phys0, const int num_phys1, + const int num_phys2, const REAL *RESTRICT const physvals, + const REAL *RESTRICT const div_space0, + const REAL *RESTRICT const div_space1, + const REAL *RESTRICT const div_space2, REAL *RESTRICT output) { + + for (int funcx = 0; funcx < num_functions; funcx++) { + for (int blockx = 0; blockx < N; blockx++) { + output[funcx * N + blockx] = 0.0; + } + } + + const int stride_phys = num_phys0 * num_phys1; + + for (int i2 = 0; i2 < num_phys2; i2++) { + REAL b2[N]; + for (int blockx = 0; blockx < N; blockx++) { + b2[blockx] = div_space2[i2 * N + blockx]; + } + + for (int i1 = 0; i1 < num_phys1; i1++) { + REAL b1[N]; + for (int blockx = 0; blockx < N; blockx++) { + b1[blockx] = div_space1[i1 * N + blockx] * b2[blockx]; + } + + for (int i0 = 0; i0 < num_phys0; i0++) { + REAL basis_eval[N]; + for (int blockx = 0; blockx < N; blockx++) { + const REAL b0 = div_space0[i0 * N + blockx]; + basis_eval[blockx] = b0 * b1[blockx]; + } + + for (int funcx = 0; funcx < num_functions; funcx++) { + const int inner_stride = + (i2 * stride_phys + i1 * num_phys0 + i0) * num_functions; + const REAL func_coeff = physvals[inner_stride + funcx]; + for (int blockx = 0; blockx < N; blockx++) { + output[funcx * N + blockx] += basis_eval[blockx] * func_coeff; + } + } + } + } + } +} + /** * Compute a function evaluation at a point using the passed quadrature point * values, quadrature points and weights. diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 32a9c0b3..64607127 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -229,6 +229,124 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { } } + template + static inline void + dispatch_3d_cpu(SYCLTargetSharedPtr sycl_target, EventStack &es, + const std::size_t num_functions, const int k_max_num_phys, + const NekDouble *const RESTRICT k_global_physvals_interlaced, + const CellInfo *const RESTRICT k_cell_info, + ParticleDatSharedPtr mpi_rank_dat, + ParticleDatSharedPtr ref_positions_dat, + U ****k_syms_ptrs, int *k_components) { + constexpr int ndim = 3; + ParticleLoopImplementation::ParticleLoopBlockIterationSet ish{mpi_rank_dat}; + const std::size_t local_size = + sycl_target->parameters->template get("LOOP_LOCAL_SIZE") + ->value; + const std::size_t local_num_reals = + static_cast(ndim * k_max_num_phys) + num_functions; + const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); + const auto k_ref_positions = ref_positions_dat->cell_dat.device_ptr(); + + for(int cellx=0 ; cellxncell ; cellx++){ + + //auto is = ish.get_all_cells(local_size, num_bytes_local); + auto is = ish.get_single_cell(cellx, local_size, num_bytes_local, NESO_VECTOR_LENGTH); + + for (auto &blockx : is) { + const auto block_device = blockx.block_device; + const std::size_t local_size = blockx.local_size; + es.push(sycl_target->queue.submit([&](sycl::handler &cgh) { + // Allocate local memory to compute the divides. + sycl::local_accessor local_mem( + sycl::range<1>(local_num_reals * local_size * NESO_VECTOR_LENGTH), cgh); + + cgh.parallel_for<>( + blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { + const int idx_local = idx.get_local_id(1); + std::size_t cell; + std::size_t layer; + block_device.stride_get_cell_layer(idx, &cell, &layer); + if (block_device.stride_work_item_required(cell, layer)){ + + const std::size_t particle_start = layer * NESO_VECTOR_LENGTH; + const std::size_t local_bound = particle_start + + block_device.stride_local_index_bound(cell, layer); + + // offset by the local index for the striding to work + REAL *evaluations = &local_mem[0] + idx_local * num_functions * NESO_VECTOR_LENGTH; + REAL *div_start = &local_mem[local_size * num_functions * NESO_VECTOR_LENGTH]; + const std::size_t div_space_per_work_item = NESO_VECTOR_LENGTH * k_max_num_phys; + + REAL *div_space0 = div_start + idx_local * div_space_per_work_item * 3; + REAL *div_space1 = div_space0 + div_space_per_work_item; + REAL *div_space2 = div_space1 + div_space_per_work_item; + + for (std::size_t fx = 0; fx < num_functions; fx++) { + for(std::size_t blockx=0 ; blockx(num_phys0, eta0, z0, bw0, div_space0); + Bary::preprocess_weights_block(num_phys1, eta1, z1, bw1, div_space1); + Bary::preprocess_weights_block(num_phys2, eta2, z2, bw2, div_space2); + + Bary::compute_dir_210_interlaced_block( + num_functions, num_phys0, num_phys1, num_phys2, physvals, + div_space0, div_space1, div_space2, evaluations); + + for (std::size_t fx = 0; fx < num_functions; fx++) { + auto ptr = k_syms_ptrs[fx]; + auto component = k_components[fx]; + ptr[cell][component][layer] = evaluations[fx]; + } + for (std::size_t fx = 0; fx < num_functions; fx++) { + for(std::size_t blockx=0 ; blockx inline void evaluate_inner(ParticleGroupSharedPtr particle_group, @@ -296,12 +414,22 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")), d_syms_ptrs.ptr, d_components.ptr); } else { - this->dispatch_3d( - this->sycl_target, es, num_functions, this->max_num_phys, - k_global_physvals_interlaced, this->d_cell_info->ptr, - particle_group->mpi_rank_dat, - particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")), - d_syms_ptrs.ptr, d_components.ptr); + + if (this->sycl_target->device.is_gpu()) { + this->dispatch_3d( + this->sycl_target, es, num_functions, this->max_num_phys, + k_global_physvals_interlaced, this->d_cell_info->ptr, + particle_group->mpi_rank_dat, + particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")), + d_syms_ptrs.ptr, d_components.ptr); + } else { + this->dispatch_3d_cpu( + this->sycl_target, es, num_functions, this->max_num_phys, + k_global_physvals_interlaced, this->d_cell_info->ptr, + particle_group->mpi_rank_dat, + particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")), + d_syms_ptrs.ptr, d_components.ptr); + } } const auto nphys = this->max_num_phys; diff --git a/include/nektar_interface/utility_sycl.hpp b/include/nektar_interface/utility_sycl.hpp index a26775bd..ebb529ba 100644 --- a/include/nektar_interface/utility_sycl.hpp +++ b/include/nektar_interface/utility_sycl.hpp @@ -84,7 +84,7 @@ get_particle_loop_global_size(ParticleDatSharedPtr particle_dat, #ifdef NESO_PARTICLES_VECTOR_LENGTH #define NESO_VECTOR_LENGTH NESO_PARTICLES_VECTOR_LENGTH #else -#define NESO_VECTOR_LENGTH 1 +#define NESO_VECTOR_LENGTH 4 // TODO MAKE THIS CONFIGURATION CMAKE TIME #endif #endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8351a840..b69869c9 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -84,6 +84,7 @@ list(REMOVE_ITEM TEST_LIBRARIES "gcov") # Build the unit test suite set(UNIT_EXE unitTests) add_executable(${UNIT_EXE} ${UNIT_SRC_FILES}) +target_compile_options(${UNIT_EXE} PRIVATE ${BUILD_TYPE_COMPILE_FLAGS}) target_link_libraries(${UNIT_EXE} PRIVATE ${NESO_LIBRARY_NAME} GTest::gtest) if(ENABLE_NESO_PROFILING) target_compile_definitions(${UNIT_EXE} diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index b1bca673..2ea40699 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -383,3 +383,126 @@ TEST(BaryInterpolation, Evaluation3DDisContFieldPrismTet) { "reference_prism_tet_cube/conditions.xml", "reference_prism_tet_cube/prism_tet_cube_0.5_perturbed.xml", 1.0e-7); } + +// TODO REMOVE START + +template +static inline void evaluation_marco(std::string condtions_file_s, + std::string mesh_file_s, const double tol) { + + const int N_total = 1200000; + + std::filesystem::path source_file = __FILE__; + std::filesystem::path source_dir = source_file.parent_path(); + std::filesystem::path test_resources_dir = + source_dir / "../../test_resources"; + + std::filesystem::path condtions_file_basename{condtions_file_s}; + std::filesystem::path mesh_file_basename{mesh_file_s}; + std::filesystem::path conditions_file = + test_resources_dir / condtions_file_basename; + std::filesystem::path mesh_file = test_resources_dir / mesh_file_basename; + + int argc = 3; + char *argv[3]; + copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); + copy_to_cstring(std::string(conditions_file), &argv[1]); + copy_to_cstring(std::string(mesh_file), &argv[2]); + + LibUtilities::SessionReaderSharedPtr session; + SpatialDomains::MeshGraphSharedPtr graph; + // Create session reader. + session = LibUtilities::SessionReader::CreateInstance(argc, argv); + graph = SpatialDomains::MeshGraph::Read(session); + + auto mesh = std::make_shared(graph); + auto sycl_target = std::make_shared(0, mesh->get_comm()); + + std::mt19937 rng{182348}; + + auto nektar_graph_local_mapper = + std::make_shared(sycl_target, mesh); + auto domain = std::make_shared(mesh, nektar_graph_local_mapper); + + const int ndim = 3; + ParticleSpec particle_spec{ParticleProp(Sym("P"), ndim, true), + ParticleProp(Sym("CELL_ID"), 1, true), + ParticleProp(Sym("E"), 1), + ParticleProp(Sym("DEDX"), ndim), + ParticleProp(Sym("ID"), 1)}; + + auto A = std::make_shared(domain, particle_spec, sycl_target); + + NektarCartesianPeriodic pbc(sycl_target, graph, A->position_dat); + auto cell_id_translation = + std::make_shared(sycl_target, A->cell_id_dat, mesh); + const int rank = sycl_target->comm_pair.rank_parent; + const int size = sycl_target->comm_pair.size_parent; + + std::mt19937 rng_pos(52234234 + rank); + int rstart, rend; + get_decomp_1d(size, N_total, rank, &rstart, &rend); + const int N = rend - rstart; + int N_check = -1; + MPICHK(MPI_Allreduce(&N, &N_check, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD)); + NESOASSERT(N_check == N_total, "Error creating particles"); + const int cell_count = domain->mesh->get_cell_count(); + if (N > 0) { + auto positions = + uniform_within_extents(N, ndim, pbc.global_extent, rng_pos); + + ParticleSet initial_distribution(N, A->get_particle_spec()); + for (int px = 0; px < N; px++) { + for (int dimx = 0; dimx < ndim; dimx++) { + const double pos_orig = positions[dimx][px] + pbc.global_origin[dimx]; + initial_distribution[Sym("P")][px][dimx] = pos_orig; + } + + initial_distribution[Sym("CELL_ID")][px][0] = 0; + initial_distribution[Sym("ID")][px][0] = px; + } + A->add_particles_local(initial_distribution); + } + reset_mpi_ranks((*A)[Sym("NESO_MPI_RANK")]); + + pbc.execute(); + A->hybrid_move(); + cell_id_translation->execute(); + A->cell_move(); + + auto field = std::make_shared(session, graph, "u"); + + auto lambda_f = [&](const NekDouble x, const NekDouble y, const NekDouble z) { + return std::pow((x + 1.0) * (x - 1.0) * (y + 1.0) * (y - 1.0) * (z + 1.0) * + (z - 1.0), + 4); + }; + + interpolate_onto_nektar_field_3d(lambda_f, field); + NESOCellsToNektarExp map_cells_to_exp(field, cell_id_translation); + + // auto field_evaluate = std::make_shared>( + // field, A, cell_id_translation); + // field_evaluate->evaluate(Sym("E")); + auto field_deriv_evaluate = std::make_shared>( + field, A, cell_id_translation, true); + + for (int cellx = 0; cellx < 10; cellx++) { + field_deriv_evaluate->evaluate(Sym("DEDX")); + } + + A->free(); + mesh->free(); + + delete[] argv[0]; + delete[] argv[1]; + delete[] argv[2]; +} + +TEST(Marco, Polo) { + evaluation_marco( + "reference_hex_cube/conditions.xml", + "reference_hex_cube/hex_cube_0.5.xml", 1.0e-7); +} + +// TODO REMOVE END From 77f07c3276c31990b725f5510f36b2313734d33c Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 20 Nov 2024 11:07:51 +0000 Subject: [PATCH 44/66] fixed indexing bugs in blocked bary cpu evaluation --- .../function_bary_evaluation.hpp | 85 ++++++++++--------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 64607127..cd6b76a7 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -248,46 +248,42 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); const auto k_ref_positions = ref_positions_dat->cell_dat.device_ptr(); - for(int cellx=0 ; cellxncell ; cellx++){ + for (int cellx = 0; cellx < mpi_rank_dat->ncell; cellx++) { - //auto is = ish.get_all_cells(local_size, num_bytes_local); - auto is = ish.get_single_cell(cellx, local_size, num_bytes_local, NESO_VECTOR_LENGTH); + // auto is = ish.get_all_cells(local_size, num_bytes_local); + auto is = ish.get_single_cell(cellx, local_size, num_bytes_local, + NESO_VECTOR_LENGTH); for (auto &blockx : is) { const auto block_device = blockx.block_device; const std::size_t local_size = blockx.local_size; es.push(sycl_target->queue.submit([&](sycl::handler &cgh) { + const std::size_t local_mem_stride = + local_num_reals * NESO_VECTOR_LENGTH; // Allocate local memory to compute the divides. sycl::local_accessor local_mem( - sycl::range<1>(local_num_reals * local_size * NESO_VECTOR_LENGTH), cgh); + sycl::range<1>(local_size * local_mem_stride), cgh); cgh.parallel_for<>( blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { const int idx_local = idx.get_local_id(1); std::size_t cell; - std::size_t layer; - block_device.stride_get_cell_layer(idx, &cell, &layer); - if (block_device.stride_work_item_required(cell, layer)){ - - const std::size_t particle_start = layer * NESO_VECTOR_LENGTH; - const std::size_t local_bound = particle_start + - block_device.stride_local_index_bound(cell, layer); - - // offset by the local index for the striding to work - REAL *evaluations = &local_mem[0] + idx_local * num_functions * NESO_VECTOR_LENGTH; - REAL *div_start = &local_mem[local_size * num_functions * NESO_VECTOR_LENGTH]; - const std::size_t div_space_per_work_item = NESO_VECTOR_LENGTH * k_max_num_phys; - - REAL *div_space0 = div_start + idx_local * div_space_per_work_item * 3; + std::size_t block; + block_device.stride_get_cell_block(idx, &cell, &block); + if (block_device.stride_work_item_required(cell, block)) { + const std::size_t particle_start = block * NESO_VECTOR_LENGTH; + const std::size_t local_bound = + block_device.stride_local_index_bound(cell, block); + + REAL *evaluations = + &local_mem[0] + idx_local * local_mem_stride; + const std::size_t div_space_per_work_item = + NESO_VECTOR_LENGTH * k_max_num_phys; + REAL *div_space0 = + evaluations + NESO_VECTOR_LENGTH * num_functions; REAL *div_space1 = div_space0 + div_space_per_work_item; REAL *div_space2 = div_space1 + div_space_per_work_item; - for (std::size_t fx = 0; fx < num_functions; fx++) { - for(std::size_t blockx=0 ; blockx class BaryEvaluateBase : GeomToExpansionBuilder { const auto physvals = &k_global_physvals_interlaced[cell_info.phys_offset * num_functions]; - + + REAL xi0[NESO_VECTOR_LENGTH]; + REAL xi1[NESO_VECTOR_LENGTH]; + REAL xi2[NESO_VECTOR_LENGTH]; REAL eta0[NESO_VECTOR_LENGTH]; REAL eta1[NESO_VECTOR_LENGTH]; REAL eta2[NESO_VECTOR_LENGTH]; - for(std::size_t blockx=0 ; blockx(num_phys0, eta0, z0, bw0, div_space0); - Bary::preprocess_weights_block(num_phys1, eta1, z1, bw1, div_space1); - Bary::preprocess_weights_block(num_phys2, eta2, z2, bw2, div_space2); + Bary::preprocess_weights_block( + num_phys0, eta0, z0, bw0, div_space0); + Bary::preprocess_weights_block( + num_phys1, eta1, z1, bw1, div_space1); + Bary::preprocess_weights_block( + num_phys2, eta2, z2, bw2, div_space2); Bary::compute_dir_210_interlaced_block( num_functions, num_phys0, num_phys1, num_phys2, physvals, div_space0, div_space1, div_space2, evaluations); for (std::size_t fx = 0; fx < num_functions; fx++) { - auto ptr = k_syms_ptrs[fx]; - auto component = k_components[fx]; - ptr[cell][component][layer] = evaluations[fx]; - } - for (std::size_t fx = 0; fx < num_functions; fx++) { - for(std::size_t blockx=0 ; blockx From a794dd8faf919c0be51ba9bb2acfdca9bba093b6 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 20 Nov 2024 16:30:49 +0000 Subject: [PATCH 45/66] moved 3D bary eval CPU variant to all cells loop construct --- .../function_bary_evaluation.hpp | 187 +++++++++--------- include/nektar_interface/utility_sycl.hpp | 6 + .../test_particle_function_evaluation_3d.cpp | 2 +- 3 files changed, 100 insertions(+), 95 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index cd6b76a7..73f6e266 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -243,110 +243,109 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { const std::size_t local_size = sycl_target->parameters->template get("LOOP_LOCAL_SIZE") ->value; + const std::size_t nbin = + sycl_target->parameters->template get("LOOP_NBIN") + ->value; const std::size_t local_num_reals = static_cast(ndim * k_max_num_phys) + num_functions; const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); const auto k_ref_positions = ref_positions_dat->cell_dat.device_ptr(); - for (int cellx = 0; cellx < mpi_rank_dat->ncell; cellx++) { - - // auto is = ish.get_all_cells(local_size, num_bytes_local); - auto is = ish.get_single_cell(cellx, local_size, num_bytes_local, - NESO_VECTOR_LENGTH); - - for (auto &blockx : is) { - const auto block_device = blockx.block_device; - const std::size_t local_size = blockx.local_size; - es.push(sycl_target->queue.submit([&](sycl::handler &cgh) { - const std::size_t local_mem_stride = - local_num_reals * NESO_VECTOR_LENGTH; - // Allocate local memory to compute the divides. - sycl::local_accessor local_mem( - sycl::range<1>(local_size * local_mem_stride), cgh); - - cgh.parallel_for<>( - blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { - const int idx_local = idx.get_local_id(1); - std::size_t cell; - std::size_t block; - block_device.stride_get_cell_block(idx, &cell, &block); - if (block_device.stride_work_item_required(cell, block)) { - const std::size_t particle_start = block * NESO_VECTOR_LENGTH; - const std::size_t local_bound = - block_device.stride_local_index_bound(cell, block); - - REAL *evaluations = - &local_mem[0] + idx_local * local_mem_stride; - const std::size_t div_space_per_work_item = - NESO_VECTOR_LENGTH * k_max_num_phys; - REAL *div_space0 = - evaluations + NESO_VECTOR_LENGTH * num_functions; - REAL *div_space1 = div_space0 + div_space_per_work_item; - REAL *div_space2 = div_space1 + div_space_per_work_item; - - const auto cell_info = k_cell_info[cell]; - const auto num_phys0 = cell_info.num_phys[0]; - const auto num_phys1 = cell_info.num_phys[1]; - const auto num_phys2 = cell_info.num_phys[2]; - const auto z0 = cell_info.d_z[0]; - const auto z1 = cell_info.d_z[1]; - const auto z2 = cell_info.d_z[2]; - const auto bw0 = cell_info.d_bw[0]; - const auto bw1 = cell_info.d_bw[1]; - const auto bw2 = cell_info.d_bw[2]; - // Get pointer to the start of the quadrature point values for - // this cell - const auto physvals = - &k_global_physvals_interlaced[cell_info.phys_offset * - num_functions]; - - REAL xi0[NESO_VECTOR_LENGTH]; - REAL xi1[NESO_VECTOR_LENGTH]; - REAL xi2[NESO_VECTOR_LENGTH]; - REAL eta0[NESO_VECTOR_LENGTH]; - REAL eta1[NESO_VECTOR_LENGTH]; - REAL eta2[NESO_VECTOR_LENGTH]; + // auto is = ish.get_all_cells(local_size, num_bytes_local); + auto is = ish.get_all_cells(nbin, local_size, num_bytes_local, + NESO_VECTOR_BLOCK_SIZE); - for (std::size_t blockx = 0; blockx < local_bound; blockx++) { - const std::size_t px = particle_start + blockx; - xi0[blockx] = k_ref_positions[cell][0][px]; - xi1[blockx] = k_ref_positions[cell][1][px]; - xi2[blockx] = k_ref_positions[cell][2][px]; - } + for (auto &blockx : is) { + const auto block_device = blockx.block_device; + const std::size_t local_size = blockx.local_size; + es.push(sycl_target->queue.submit([&](sycl::handler &cgh) { + const std::size_t local_mem_stride = + local_num_reals * NESO_VECTOR_BLOCK_SIZE; + // Allocate local memory to compute the divides. + sycl::local_accessor local_mem( + sycl::range<1>(local_size * local_mem_stride), cgh); - for (std::size_t blockx = 0; blockx < NESO_VECTOR_LENGTH; - blockx++) { - GeometryInterface::loc_coord_to_loc_collapsed_3d( - cell_info.shape_type_int, xi0[blockx], xi1[blockx], - xi2[blockx], eta0 + blockx, eta1 + blockx, - eta2 + blockx); - } + cgh.parallel_for<>( + blockx.loop_iteration_set, [=](sycl::nd_item<2> idx) { + const int idx_local = idx.get_local_id(1); + std::size_t cell; + std::size_t block; + block_device.stride_get_cell_block(idx, &cell, &block); + if (block_device.stride_work_item_required(cell, block)) { + const std::size_t particle_start = + block * NESO_VECTOR_BLOCK_SIZE; + const std::size_t local_bound = + block_device.stride_local_index_bound(cell, block); + + REAL *evaluations = + &local_mem[0] + idx_local * local_mem_stride; + const std::size_t div_space_per_work_item = + NESO_VECTOR_BLOCK_SIZE * k_max_num_phys; + REAL *div_space0 = + evaluations + NESO_VECTOR_BLOCK_SIZE * num_functions; + REAL *div_space1 = div_space0 + div_space_per_work_item; + REAL *div_space2 = div_space1 + div_space_per_work_item; - Bary::preprocess_weights_block( - num_phys0, eta0, z0, bw0, div_space0); - Bary::preprocess_weights_block( - num_phys1, eta1, z1, bw1, div_space1); - Bary::preprocess_weights_block( - num_phys2, eta2, z2, bw2, div_space2); - - Bary::compute_dir_210_interlaced_block( - num_functions, num_phys0, num_phys1, num_phys2, physvals, - div_space0, div_space1, div_space2, evaluations); - - for (std::size_t fx = 0; fx < num_functions; fx++) { - for (std::size_t blockx = 0; blockx < local_bound; - blockx++) { - const std::size_t px = particle_start + blockx; - auto ptr = k_syms_ptrs[fx]; - auto component = k_components[fx]; - ptr[cell][component][px] = - evaluations[fx * NESO_VECTOR_LENGTH + blockx]; - } + const auto cell_info = k_cell_info[cell]; + const auto num_phys0 = cell_info.num_phys[0]; + const auto num_phys1 = cell_info.num_phys[1]; + const auto num_phys2 = cell_info.num_phys[2]; + const auto z0 = cell_info.d_z[0]; + const auto z1 = cell_info.d_z[1]; + const auto z2 = cell_info.d_z[2]; + const auto bw0 = cell_info.d_bw[0]; + const auto bw1 = cell_info.d_bw[1]; + const auto bw2 = cell_info.d_bw[2]; + // Get pointer to the start of the quadrature point values for + // this cell + const auto physvals = + &k_global_physvals_interlaced[cell_info.phys_offset * + num_functions]; + + REAL xi0[NESO_VECTOR_BLOCK_SIZE]; + REAL xi1[NESO_VECTOR_BLOCK_SIZE]; + REAL xi2[NESO_VECTOR_BLOCK_SIZE]; + REAL eta0[NESO_VECTOR_BLOCK_SIZE]; + REAL eta1[NESO_VECTOR_BLOCK_SIZE]; + REAL eta2[NESO_VECTOR_BLOCK_SIZE]; + + for (std::size_t blockx = 0; blockx < local_bound; blockx++) { + const std::size_t px = particle_start + blockx; + xi0[blockx] = k_ref_positions[cell][0][px]; + xi1[blockx] = k_ref_positions[cell][1][px]; + xi2[blockx] = k_ref_positions[cell][2][px]; + } + + for (std::size_t blockx = 0; blockx < NESO_VECTOR_BLOCK_SIZE; + blockx++) { + GeometryInterface::loc_coord_to_loc_collapsed_3d( + cell_info.shape_type_int, xi0[blockx], xi1[blockx], + xi2[blockx], eta0 + blockx, eta1 + blockx, eta2 + blockx); + } + + Bary::preprocess_weights_block( + num_phys0, eta0, z0, bw0, div_space0); + Bary::preprocess_weights_block( + num_phys1, eta1, z1, bw1, div_space1); + Bary::preprocess_weights_block( + num_phys2, eta2, z2, bw2, div_space2); + + Bary::compute_dir_210_interlaced_block( + num_functions, num_phys0, num_phys1, num_phys2, physvals, + div_space0, div_space1, div_space2, evaluations); + + for (std::size_t fx = 0; fx < num_functions; fx++) { + for (std::size_t blockx = 0; blockx < local_bound; blockx++) { + const std::size_t px = particle_start + blockx; + auto ptr = k_syms_ptrs[fx]; + auto component = k_components[fx]; + ptr[cell][component][px] = + evaluations[fx * NESO_VECTOR_BLOCK_SIZE + blockx]; } } - }); - })); - } + } + }); + })); } } diff --git a/include/nektar_interface/utility_sycl.hpp b/include/nektar_interface/utility_sycl.hpp index ebb529ba..fcfc6756 100644 --- a/include/nektar_interface/utility_sycl.hpp +++ b/include/nektar_interface/utility_sycl.hpp @@ -88,6 +88,12 @@ get_particle_loop_global_size(ParticleDatSharedPtr particle_dat, #endif #endif +#ifndef NESO_VECTOR_BLOCK_FACTOR +#define NESO_VECTOR_BLOCK_FACTOR 8 // TODO MAKE THIS CONFIGURATION CMAKE TIME +#endif + +#define NESO_VECTOR_BLOCK_SIZE (NESO_VECTOR_LENGTH * NESO_VECTOR_BLOCK_FACTOR) + /** * For an input integer L >= 0 return smallest M such that M >= L and M % * NESO_VECTOR_LENGTH == 0. diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index 2ea40699..1845fe7f 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -487,7 +487,7 @@ static inline void evaluation_marco(std::string condtions_file_s, auto field_deriv_evaluate = std::make_shared>( field, A, cell_id_translation, true); - for (int cellx = 0; cellx < 10; cellx++) { + for (int cellx = 0; cellx < 40; cellx++) { field_deriv_evaluate->evaluate(Sym("DEDX")); } From 909908848d6ccb93d6e2b739dfb0c1ec6229550d Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 20 Nov 2024 18:02:00 +0000 Subject: [PATCH 46/66] updated flop estimation --- .../function_bary_evaluation.hpp | 16 +++++++++++----- src/nektar_interface/function_evaluation.cpp | 1 + .../test_particle_function_evaluation_3d.cpp | 9 ++++++++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 73f6e266..72ad8297 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -407,6 +407,12 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { ProfileRegion pr("BaryEvaluateBase", "evaluate_" + std::to_string(this->ndim) + "d_" + std::to_string(num_functions)); +// TODO GET THIS INTO CMAKE +#ifdef __INTEL_LLVM_COMPILER + constexpr bool always_gpu = true; +#else + constexpr bool always_gpu = false; +#endif if (this->ndim == 2) { this->dispatch_2d( @@ -416,8 +422,7 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")), d_syms_ptrs.ptr, d_components.ptr); } else { - - if (this->sycl_target->device.is_gpu()) { + if (this->sycl_target->device.is_gpu() || always_gpu) { this->dispatch_3d( this->sycl_target, es, num_functions, this->max_num_phys, k_global_physvals_interlaced, this->d_cell_info->ptr, @@ -437,9 +442,10 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { const auto nphys = this->max_num_phys; const auto npart = particle_group->get_npart_local(); const auto nflop_prepare = this->ndim * nphys * 5; - const auto nflop_loop = (this->ndim == 2) - ? nphys * nphys * 3 - : nphys * nphys + nphys * nphys * nphys * 3; + const auto nflop_loop = + (this->ndim == 2) + ? nphys * nphys * (1 + num_functions * 2) + : nphys * nphys + nphys * nphys * nphys * (1 + num_functions * 2); pr.num_flops = (nflop_loop + nflop_prepare) * npart; pr.num_bytes = sizeof(REAL) * (npart * ((this->ndim + num_functions)) + num_global_physvals); diff --git a/src/nektar_interface/function_evaluation.cpp b/src/nektar_interface/function_evaluation.cpp index 4010915f..8ed52725 100644 --- a/src/nektar_interface/function_evaluation.cpp +++ b/src/nektar_interface/function_evaluation.cpp @@ -1,3 +1,4 @@ +#define NESO_PARTICLES_PROFILING_REGION // TODO REMOVE #include namespace NESO { diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index 1845fe7f..0e58b5a0 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -1,3 +1,4 @@ +#define NESO_PARTICLES_PROFILING_REGION // TODO REMOVE #include "nektar_interface/function_evaluation.hpp" #include "nektar_interface/particle_interface.hpp" #include "nektar_interface/utilities.hpp" @@ -390,7 +391,7 @@ template static inline void evaluation_marco(std::string condtions_file_s, std::string mesh_file_s, const double tol) { - const int N_total = 1200000; + const int N_total = 12000000; std::filesystem::path source_file = __FILE__; std::filesystem::path source_dir = source_file.parent_path(); @@ -487,9 +488,15 @@ static inline void evaluation_marco(std::string condtions_file_s, auto field_deriv_evaluate = std::make_shared>( field, A, cell_id_translation, true); + for (int cellx = 0; cellx < 2; cellx++) { + field_deriv_evaluate->evaluate(Sym("DEDX")); + } + + sycl_target->profile_map.enable(); for (int cellx = 0; cellx < 40; cellx++) { field_deriv_evaluate->evaluate(Sym("DEDX")); } + sycl_target->profile_map.write_events_json("bary_evaluation", rank); A->free(); mesh->free(); From a2decff50274f78543af9e92b70853a6135ff77b Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Thu, 21 Nov 2024 12:38:42 +0000 Subject: [PATCH 47/66] added missing number of bins argument to get_all_cells --- .../nektar_interface/function_bary_evaluation.hpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 72ad8297..8a3f4659 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -66,10 +66,14 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { const std::size_t local_size = sycl_target->parameters->template get("LOOP_LOCAL_SIZE") ->value; + const std::size_t nbin = + sycl_target->parameters->template get("LOOP_NBIN") + ->value; + const std::size_t local_num_reals = static_cast(ndim * k_max_num_phys) + num_functions; const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); - auto is = ish.get_all_cells(local_size, num_bytes_local); + auto is = ish.get_all_cells(nbin, local_size, num_bytes_local); const auto k_ref_positions = ref_positions_dat->cell_dat.device_ptr(); for (auto &blockx : is) { @@ -151,10 +155,13 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { const std::size_t local_size = sycl_target->parameters->template get("LOOP_LOCAL_SIZE") ->value; + const std::size_t nbin = + sycl_target->parameters->template get("LOOP_NBIN") + ->value; const std::size_t local_num_reals = static_cast(ndim * k_max_num_phys) + num_functions; const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); - auto is = ish.get_all_cells(local_size, num_bytes_local); + auto is = ish.get_all_cells(nbin, local_size, num_bytes_local); const auto k_ref_positions = ref_positions_dat->cell_dat.device_ptr(); for (auto &blockx : is) { @@ -251,10 +258,8 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { const std::size_t num_bytes_local = local_num_reals * sizeof(REAL); const auto k_ref_positions = ref_positions_dat->cell_dat.device_ptr(); - // auto is = ish.get_all_cells(local_size, num_bytes_local); auto is = ish.get_all_cells(nbin, local_size, num_bytes_local, NESO_VECTOR_BLOCK_SIZE); - for (auto &blockx : is) { const auto block_device = blockx.block_device; const std::size_t local_size = blockx.local_size; From 6dae47e76c4b39ebe8ce6f48582a3ad640204f88 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Thu, 21 Nov 2024 15:21:05 +0000 Subject: [PATCH 48/66] removed always gpu for intel backends as it is not benefitial --- include/nektar_interface/function_bary_evaluation.hpp | 9 +-------- .../test_particle_function_evaluation_3d.cpp | 6 +++--- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 8a3f4659..5b6693ae 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -412,13 +412,6 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { ProfileRegion pr("BaryEvaluateBase", "evaluate_" + std::to_string(this->ndim) + "d_" + std::to_string(num_functions)); -// TODO GET THIS INTO CMAKE -#ifdef __INTEL_LLVM_COMPILER - constexpr bool always_gpu = true; -#else - constexpr bool always_gpu = false; -#endif - if (this->ndim == 2) { this->dispatch_2d( this->sycl_target, es, num_functions, this->max_num_phys, @@ -427,7 +420,7 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { particle_group->get_dat(Sym("NESO_REFERENCE_POSITIONS")), d_syms_ptrs.ptr, d_components.ptr); } else { - if (this->sycl_target->device.is_gpu() || always_gpu) { + if (this->sycl_target->device.is_gpu()) { this->dispatch_3d( this->sycl_target, es, num_functions, this->max_num_phys, k_global_physvals_interlaced, this->d_cell_info->ptr, diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index 0e58b5a0..48184382 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -315,7 +315,7 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), div_space.data(), z0v.data(), z1v.data(), z2v.data(), bw0v.data(), bw1v.data(), bw2v.data(), stride); - EXPECT_NEAR(to_test, to_test_stride, 1.0e-15); + EXPECT_NEAR(to_test, to_test_stride, 1.0e-14); const REAL err_abs = std::abs(correct - to_test); const REAL abs_correct = std::abs(correct); const REAL err_rel = @@ -348,7 +348,7 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, x0, x1, x2, num_phys0, num_phys1, num_phys2, physvalsv.data(), div_space.data(), z0v.data(), z1v.data(), z2v.data(), bw0v.data(), bw1v.data(), bw2v.data(), stride); - EXPECT_NEAR(to_test, to_test_stride, 1.0e-15); + EXPECT_NEAR(to_test, to_test_stride, 1.0e-14); for (int ix = 0; ix < div_space.size(); ix++) { if (ix % stride != 0) { EXPECT_EQ(div_space.at(ix), 3.1415); @@ -391,7 +391,7 @@ template static inline void evaluation_marco(std::string condtions_file_s, std::string mesh_file_s, const double tol) { - const int N_total = 12000000; + const int N_total = 1200000; std::filesystem::path source_file = __FILE__; std::filesystem::path source_dir = source_file.parent_path(); From f80caebcd59e179b5e48cfa78b653baac763dd28 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 9 Dec 2024 14:20:49 +0000 Subject: [PATCH 49/66] MeshGraph::Read -> MeshGraphIO::Read --- test/integration/nektar_interface/test_particle_advection.cpp | 2 +- .../nektar_interface/test_particle_function_evaluation.cpp | 2 +- .../nektar_interface/test_particle_function_evaluation_3d.cpp | 4 ++-- .../nektar_interface/test_particle_geometry_interface.cpp | 2 +- .../test_particle_geometry_interface_3d_curved.cpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/integration/nektar_interface/test_particle_advection.cpp b/test/integration/nektar_interface/test_particle_advection.cpp index 56b68ab7..e1d36947 100644 --- a/test/integration/nektar_interface/test_particle_advection.cpp +++ b/test/integration/nektar_interface/test_particle_advection.cpp @@ -371,7 +371,7 @@ TEST_P(FooBar, Advection3D) { // Create session reader. auto session = resource_session.session; - auto graph = SpatialDomains::MeshGraph::Read(session); + auto graph = SpatialDomains::MeshGraphIO::Read(session); auto mesh = std::make_shared(graph); extend_halos_fixed_offset(1, mesh); diff --git a/test/unit/nektar_interface/test_particle_function_evaluation.cpp b/test/unit/nektar_interface/test_particle_function_evaluation.cpp index ba2f5379..3a554e3d 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation.cpp @@ -628,7 +628,7 @@ TEST(BaryInterpolation, Evaluation2D) { SpatialDomains::MeshGraphSharedPtr graph; // Create session reader. session = LibUtilities::SessionReader::CreateInstance(argc, argv); - graph = SpatialDomains::MeshGraph::Read(session); + graph = SpatialDomains::MeshGraphIO::Read(session); auto cont_field = std::make_shared(session, graph, "u"); diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index 85b4dc2a..f8d3e317 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -233,7 +233,7 @@ static inline void bary_wrapper_3d(std::string condtions_file_s, SpatialDomains::MeshGraphSharedPtr graph; // Create session reader. session = LibUtilities::SessionReader::CreateInstance(argc, argv); - graph = SpatialDomains::MeshGraph::Read(session); + graph = SpatialDomains::MeshGraphIO::Read(session); auto field = std::make_shared(session, graph, "u"); @@ -415,7 +415,7 @@ static inline void evaluation_marco(std::string condtions_file_s, SpatialDomains::MeshGraphSharedPtr graph; // Create session reader. session = LibUtilities::SessionReader::CreateInstance(argc, argv); - graph = SpatialDomains::MeshGraph::Read(session); + graph = SpatialDomains::MeshGraphIO::Read(session); auto mesh = std::make_shared(graph); auto sycl_target = std::make_shared(0, mesh->get_comm()); diff --git a/test/unit/nektar_interface/test_particle_geometry_interface.cpp b/test/unit/nektar_interface/test_particle_geometry_interface.cpp index 7c1fc1d6..266b536d 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface.cpp @@ -668,7 +668,7 @@ TEST(ParticleGeometryInterface, CoordinateMapping2D) { // Create session reader. auto session = LibUtilities::SessionReader::CreateInstance(argc, argv); - auto graph = SpatialDomains::MeshGraph::Read(session); + auto graph = SpatialDomains::MeshGraphIO::Read(session); auto mesh = std::make_shared(graph); std::map> geoms; get_all_elements_2d(graph, geoms); diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index d67711d2..82ba32f2 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -13,7 +13,7 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { auto session = resource_session.session; // Create MeshGraph. - auto graph = SpatialDomains::MeshGraph::Read(session); + auto graph = SpatialDomains::MeshGraphIO::Read(session); // build map from owned mesh hierarchy cells to geoms that touch that cell auto mesh = std::make_shared(graph); From 47c69d746080aa2cf25d2e472820676d44b18648 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 9 Dec 2024 15:45:02 +0000 Subject: [PATCH 50/66] added bounding box wrapper function for xmap variant --- CMakeLists.txt | 2 ++ .../coarse_lookup_map.hpp | 1 + .../newton_geom_interfaces.hpp | 1 - .../x_map_bounding_box.hpp | 36 +++++++++++++++++++ .../particle_cell_mapping/x_map_newton.hpp | 24 ++++++++++--- .../x_map_bounding_box.cpp | 18 ++++++++++ ..._particle_geometry_interface_3d_curved.cpp | 19 +++++++++- 7 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp create mode 100644 src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4239c88c..adc1053c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,6 +120,7 @@ set(LIB_SRC_FILES ${SRC_DIR}/nektar_interface/particle_cell_mapping/map_particles_common.cpp ${SRC_DIR}/nektar_interface/particle_cell_mapping/map_particles_host.cpp ${SRC_DIR}/nektar_interface/particle_cell_mapping/nektar_graph_local_mapper.cpp + ${SRC_DIR}/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp ${SRC_DIR}/nektar_interface/utilities.cpp ${SRC_DIR}/nektar_interface/solver_base/partsys_base.cpp) @@ -208,6 +209,7 @@ set(HEADER_FILES ${INC_DIR}/nektar_interface/particle_cell_mapping/particle_cell_mapping_3d.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/particle_cell_mapping_newton.hpp + ${INC_DIR}/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/x_map_newton.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp ${INC_DIR}/nektar_interface/particle_interface.hpp diff --git a/include/nektar_interface/particle_cell_mapping/coarse_lookup_map.hpp b/include/nektar_interface/particle_cell_mapping/coarse_lookup_map.hpp index a2b102ca..f5c0b8a2 100644 --- a/include/nektar_interface/particle_cell_mapping/coarse_lookup_map.hpp +++ b/include/nektar_interface/particle_cell_mapping/coarse_lookup_map.hpp @@ -3,6 +3,7 @@ #include "../bounding_box_intersection.hpp" #include "../utility_mesh_cartesian.hpp" +#include "x_map_bounding_box.hpp" #include #include diff --git a/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp b/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp index 541cdbf1..eb7a640d 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp @@ -9,6 +9,5 @@ #include "newton_quad_embed_3d.hpp" #include "newton_tet.hpp" #include "newton_triangle_embed_3d.hpp" -#include "particle_cell_mapping_newton.hpp" #endif diff --git a/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp b/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp new file mode 100644 index 00000000..0d0a3ec9 --- /dev/null +++ b/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp @@ -0,0 +1,36 @@ +#ifndef __NESO_PARTICLE_CELL_MAPPING_X_MAP_BOUNDING_BOX_HPP__ +#define __NESO_PARTICLE_CELL_MAPPING_X_MAP_BOUNDING_BOX_HPP__ + +#include +#include + +namespace { +namespace SD = Nektar::SpatialDomains; +} + +namespace NESO::BoundingBox { + +/** + * Return a Nektar++ style bounding box for the geometry object. Padding is + * added to each end of each dimension. i.e. a padding of 5% (pad_rel = 0.05) + * at each end is 10% globally. + * + * @param sycl_target Compute device to compute bounding box on. + * @param geom Geometry object to get bounding box for. + * @param grid_size Resolution of grid to use on each face of the collapsed + * reference space. Default 32. + * @param pad_rel Relative padding to add to computed bounding box, default + * 0.05, i.e. 5%. + * @param pad_abs Absolute padding to add to computed bounding box, default + * 0.0. + * @returns Bounding box in format [minx, miny, minz, maxx, maxy, maxz]; + */ +std::array +get_bounding_box(Particles::SYCLTargetSharedPtr sycl_target, + SD::Geometry3DSharedPtr geom, std::size_t grid_size = 32, + const Particles::REAL pad_rel = 0.05, + const Particles::REAL pad_abs = 0.0); + +} // namespace NESO::BoundingBox + +#endif diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index a6bb838b..b6b5aba4 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -273,13 +273,21 @@ template class XMapNewton { } /** - * Return a Nektar++ style bounding box for the geometry object. + * Return a Nektar++ style bounding box for the geometry object. Padding is + * added to each end of each dimension. i.e. a padding of 5% (pad_rel = 0.05) + * at each end is 10% globally. * * @param grid_size Resolution of grid to use on each face of the collapsed * reference space. Default 32. + * @param pad_rel Relative padding to add to computed bounding box, default + * 0.05, i.e. 5%. + * @param pad_abs Absolute padding to add to computed bounding box, default + * 0.0. * @returns Bounding box in format [minx, miny, minz, maxx, maxy, maxz]; */ - std::array get_bounding_box(std::size_t grid_size = 32) { + std::array get_bounding_box(std::size_t grid_size = 32, + const REAL pad_rel = 0.05, + const REAL pad_abs = 0.0) { char *k_map_data; if (this->dh_data) { k_map_data = this->dh_data->d_buffer.ptr; @@ -289,6 +297,7 @@ template class XMapNewton { NESOASSERT(k_fdata != nullptr, "Bad pointer"); const std::size_t num_bytes_local = std::max(this->num_bytes_local, sizeof(REAL)); + NESOASSERT(this->ndim == 3, "Only implemented in 3D"); // Get a local size which is a power of 2. const std::size_t local_size = @@ -406,7 +415,7 @@ template class XMapNewton { sycl::atomic_ref ar(k_fdata[dimx + 3]); - ar.fetch_max(local_mem[0]); + ar.fetch_max(static_cast(local_mem[0])); } // Tree reduce the minimum local_mem[local_id] = f[dimx]; @@ -421,7 +430,7 @@ template class XMapNewton { sycl::atomic_ref ar(k_fdata[dimx]); - ar.fetch_min(local_mem[0]); + ar.fetch_min(static_cast(local_mem[0])); } } }); @@ -433,6 +442,13 @@ template class XMapNewton { for (int cx = 0; cx < 6; cx++) { output[cx] = this->dh_fdata->h_buffer.ptr[cx]; } + + for (int dx = 0; dx < this->ndim; dx++) { + const REAL width = output.at(dx + 3) - output.at(dx); + const REAL padding = pad_rel * width + pad_abs; + output.at(dx) -= padding; + output.at(dx + 3) += padding; + } return output; } }; diff --git a/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp b/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp new file mode 100644 index 00000000..b547e281 --- /dev/null +++ b/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp @@ -0,0 +1,18 @@ +#include +#include +#include + +namespace NESO::BoundingBox { + +std::array get_bounding_box(SYCLTargetSharedPtr sycl_target, + SD::Geometry3DSharedPtr geom, + std::size_t grid_size, + const REAL pad_rel, const REAL pad_abs) { + + NESOASSERT(geom != nullptr, "Bad geometry object passed."); + + Newton::XMapNewton x_map(sycl_target, geom); + return x_map.get_bounding_box(grid_size, pad_rel, pad_abs); +} + +} // namespace NESO::BoundingBox diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 82ba32f2..ce3adbe9 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -378,7 +378,24 @@ TEST(ParticleGeometryInterfaceCurved, MakeCurvedHex) { } TEST(ParticleGeometryInterfaceCurved, BoundingBox) { - auto sycl_target = std::make_shared(0, MPI_COMM_WORLD); + + { + auto xmapx = [&](auto eta) { + return eta[0] + (0.2 - 0.1 * eta[2] * eta[2]) - 2.0; + }; + auto xmapy = [&](auto eta) { + return eta[1] + 0.1 * eta[0] + 0.1 * eta[2] * eta[2]; + }; + auto xmapz = [&](auto eta) { + return eta[2] + 0.2 * eta[0] * eta[0] + 0.2 * eta[1] * eta[1]; + }; + + const int num_modes = 3; + auto h = make_hex_geom(num_modes, xmapx, xmapy, xmapz); + + auto bb = BoundingBox::get_bounding_box(sycl_target, h, 32, 0.05, 0.0); + } + sycl_target->free(); } From 9c54c973e80d678b1ae5c87c32f749a862d90409 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 9 Dec 2024 17:44:56 +0000 Subject: [PATCH 51/66] fixed local memory type issue --- .../particle_cell_mapping/x_map_newton.hpp | 22 ++++++++++++------- ..._particle_geometry_interface_3d_curved.cpp | 20 +++++++++-------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index b6b5aba4..8b754270 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -395,42 +395,48 @@ template class XMapNewton { k_newton_type.newton_residual( k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f, f + 1, f + 2, &local_mem[local_id * num_bytes_local]); + idx.barrier(sycl::access::fence_space::local_space); + REAL *local_mem_real = + static_cast(static_cast(&local_mem[0])); + // Do the reductions, we pessimistically do not use the builtin // SYCL functions as we have used all the local memory already // and the SYCL reduction functions also use local memory. for (int dimx = 0; dimx < 3; dimx++) { // Tree reduce the maximum - local_mem[local_id] = f[dimx]; + local_mem_real[local_id] = f[dimx]; for (int ix = local_size_l / 2; ix > 0; ix >>= 1) { idx.barrier(sycl::access::fence_space::local_space); if (local_id < ix) { - local_mem[local_id] = sycl::max(local_mem[local_id + ix], - local_mem[local_id]); + local_mem_real[local_id] = + sycl::max(local_mem_real[local_id + ix], + local_mem_real[local_id]); } } if (local_id == 0) { sycl::atomic_ref ar(k_fdata[dimx + 3]); - ar.fetch_max(static_cast(local_mem[0])); + auto check = ar.fetch_max(local_mem_real[0]); } // Tree reduce the minimum - local_mem[local_id] = f[dimx]; + local_mem_real[local_id] = f[dimx]; for (int ix = local_size_l / 2; ix > 0; ix >>= 1) { idx.barrier(sycl::access::fence_space::local_space); if (local_id < ix) { - local_mem[local_id] = sycl::min(local_mem[local_id + ix], - local_mem[local_id]); + local_mem_real[local_id] = + sycl::min(local_mem_real[local_id + ix], + local_mem_real[local_id]); } } if (local_id == 0) { sycl::atomic_ref ar(k_fdata[dimx]); - ar.fetch_min(static_cast(local_mem[0])); + auto check = ar.fetch_min(local_mem_real[0]); } } }); diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index ce3adbe9..cca4d59e 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -380,21 +380,23 @@ TEST(ParticleGeometryInterfaceCurved, MakeCurvedHex) { TEST(ParticleGeometryInterfaceCurved, BoundingBox) { auto sycl_target = std::make_shared(0, MPI_COMM_WORLD); + // Test a linear mapped box { - auto xmapx = [&](auto eta) { - return eta[0] + (0.2 - 0.1 * eta[2] * eta[2]) - 2.0; - }; - auto xmapy = [&](auto eta) { - return eta[1] + 0.1 * eta[0] + 0.1 * eta[2] * eta[2]; - }; - auto xmapz = [&](auto eta) { - return eta[2] + 0.2 * eta[0] * eta[0] + 0.2 * eta[1] * eta[1]; - }; + auto xmapx = [&](auto eta) { return eta[0] + 1; }; + auto xmapy = [&](auto eta) { return eta[1] * 2 - 4; }; + auto xmapz = [&](auto eta) { return eta[2] * 0.5 + 7; }; const int num_modes = 3; auto h = make_hex_geom(num_modes, xmapx, xmapy, xmapz); auto bb = BoundingBox::get_bounding_box(sycl_target, h, 32, 0.05, 0.0); + + nprint_variable(bb[0]); + nprint_variable(bb[1]); + nprint_variable(bb[2]); + nprint_variable(bb[3]); + nprint_variable(bb[4]); + nprint_variable(bb[5]); } sycl_target->free(); From f65918a32cb34eed0d984f8f282becd41020e85f Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 10 Dec 2024 14:56:23 +0000 Subject: [PATCH 52/66] added linear tests for bounding box computation --- CMakeLists.txt | 1 + .../geometry_transport/utility_geometry.hpp | 25 ++++++++ .../x_map_bounding_box.hpp | 21 ++++--- .../x_map_bounding_box.cpp | 37 +++++++++-- ..._particle_geometry_interface_3d_curved.cpp | 62 ++++++++++++++++--- 5 files changed, 124 insertions(+), 22 deletions(-) create mode 100644 include/nektar_interface/geometry_transport/utility_geometry.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index adc1053c..62a7f100 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -167,6 +167,7 @@ set(HEADER_FILES ${INC_DIR}/nektar_interface/geometry_transport/geometry_transport_2d.hpp ${INC_DIR}/nektar_interface/geometry_transport/geometry_transport_3d.hpp ${INC_DIR}/nektar_interface/geometry_transport/geometry_types_3d.hpp + ${INC_DIR}/nektar_interface/geometry_transport/utility_geometry.hpp ${INC_DIR}/nektar_interface/geometry_transport/halo_extension.hpp ${INC_DIR}/nektar_interface/geometry_transport/packed_geom_2d.hpp ${INC_DIR}/nektar_interface/geometry_transport/packed_geoms_2d.hpp diff --git a/include/nektar_interface/geometry_transport/utility_geometry.hpp b/include/nektar_interface/geometry_transport/utility_geometry.hpp new file mode 100644 index 00000000..3c82fc91 --- /dev/null +++ b/include/nektar_interface/geometry_transport/utility_geometry.hpp @@ -0,0 +1,25 @@ +#ifndef _NESO_GEOMETRY_TRANSPORT_UTILITY_GEOMETRY_HPP_ +#define _NESO_GEOMETRY_TRANSPORT_UTILITY_GEOMETRY_HPP_ + +#include + +namespace NESO { + +/** + * @returns True if the geometry object is linear. + */ +template +inline bool geometry_is_linear(std::shared_ptr geom) { + const int ndim = geom->GetCoordim(); + const auto xmap = geom->GetXmap(); + for (int dimx = 0; dimx < ndim; dimx++) { + if (xmap->GetBasisNumModes(dimx) != 2) { + return false; + } + } + return true; +} + +} // namespace NESO + +#endif diff --git a/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp b/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp index 0d0a3ec9..16644d51 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp @@ -1,6 +1,8 @@ #ifndef __NESO_PARTICLE_CELL_MAPPING_X_MAP_BOUNDING_BOX_HPP__ #define __NESO_PARTICLE_CELL_MAPPING_X_MAP_BOUNDING_BOX_HPP__ +#include "../geometry_transport/utility_geometry.hpp" +#include "../parameter_store.hpp" #include #include @@ -15,21 +17,22 @@ namespace NESO::BoundingBox { * added to each end of each dimension. i.e. a padding of 5% (pad_rel = 0.05) * at each end is 10% globally. * + * Parameters: + * get_bounding_box/linear_pad_rel + * get_bounding_box/linear_pad_abs + * get_bounding_box/nonlinear_pad_rel + * get_bounding_box/nonlinear_pad_abs + * get_bounding_box/nonlinear_grid_size_factor + * * @param sycl_target Compute device to compute bounding box on. * @param geom Geometry object to get bounding box for. - * @param grid_size Resolution of grid to use on each face of the collapsed - * reference space. Default 32. - * @param pad_rel Relative padding to add to computed bounding box, default - * 0.05, i.e. 5%. - * @param pad_abs Absolute padding to add to computed bounding box, default - * 0.0. + * @param parameter_store ParameterStore containing parameters. * @returns Bounding box in format [minx, miny, minz, maxx, maxy, maxz]; */ std::array get_bounding_box(Particles::SYCLTargetSharedPtr sycl_target, - SD::Geometry3DSharedPtr geom, std::size_t grid_size = 32, - const Particles::REAL pad_rel = 0.05, - const Particles::REAL pad_abs = 0.0); + SD::Geometry3DSharedPtr geom, + ParameterStoreSharedPtr parameter_store); } // namespace NESO::BoundingBox diff --git a/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp b/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp index b547e281..7c25537f 100644 --- a/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp +++ b/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp @@ -4,14 +4,41 @@ namespace NESO::BoundingBox { -std::array get_bounding_box(SYCLTargetSharedPtr sycl_target, - SD::Geometry3DSharedPtr geom, - std::size_t grid_size, - const REAL pad_rel, const REAL pad_abs) { +std::array +get_bounding_box(Particles::SYCLTargetSharedPtr sycl_target, + SD::Geometry3DSharedPtr geom, + ParameterStoreSharedPtr parameter_store) { NESOASSERT(geom != nullptr, "Bad geometry object passed."); - + const bool is_linear = geometry_is_linear(geom); + const std::size_t max_num_modes = + static_cast(geom->GetXmap()->EvalBasisNumModesMax()); Newton::XMapNewton x_map(sycl_target, geom); + + REAL pad_rel = 0.0; + REAL pad_abs = 0.0; + std::size_t grid_size = 2; + + if (is_linear) { + pad_rel = + parameter_store->get("get_bounding_box/linear_pad_rel", 0.0); + pad_abs = + parameter_store->get("get_bounding_box/linear_pad_abs", 0.0); + grid_size = 2; + } else { + pad_rel = + parameter_store->get("get_bounding_box/nonlinear_pad_rel", 0.05); + pad_abs = + parameter_store->get("get_bounding_box/nonlinear_pad_abs", 0.0); + const auto grid_size_factor = parameter_store->get( + "get_bounding_box/nonlinear_grid_size_factor", 4); + grid_size = static_cast(grid_size_factor) * max_num_modes; + } + + NESOASSERT(grid_size >= 2, "Bad bounding box grid size (< 2)."); + NESOASSERT(pad_rel >= 0.0, "Bad bounding box pad_rel (< 0.0)"); + NESOASSERT(pad_abs >= 0.0, "Bad bounding box pad_abs (< 0.0)"); + return x_map.get_bounding_box(grid_size, pad_rel, pad_abs); } diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index cca4d59e..67d6e648 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -379,6 +379,39 @@ TEST(ParticleGeometryInterfaceCurved, MakeCurvedHex) { TEST(ParticleGeometryInterfaceCurved, BoundingBox) { auto sycl_target = std::make_shared(0, MPI_COMM_WORLD); + const REAL k_tol = 1.0e-12; + auto lambda_test = [&](const std::array &bb, + const std::array correct) { + ASSERT_NEAR(bb[0], correct[0], k_tol); + ASSERT_NEAR(bb[3], correct[3], k_tol); + ASSERT_NEAR(bb[1], correct[1], k_tol); + ASSERT_NEAR(bb[4], correct[4], k_tol); + ASSERT_NEAR(bb[2], correct[2], k_tol); + ASSERT_NEAR(bb[5], correct[5], k_tol); + }; + + auto lambda_get_linear_bb = [&](auto geom) -> std::array { + const int num_verts = geom->GetNumVerts(); + const int ndim = geom->GetCoordim(); + Array coords(3); + std::array bb; + std::fill(bb.begin(), bb.end(), 0.0); + std::fill(bb.begin(), bb.begin() + ndim, + std::numeric_limits::max()); + std::fill(bb.begin() + 3, bb.begin() + 3 + ndim, + std::numeric_limits::lowest()); + + for (int vx = 0; vx < num_verts; vx++) { + auto point = geom->GetVertex(vx); + point->GetCoords(coords); + for (int dx = 0; dx < ndim; dx++) { + bb.at(dx) = std::min(bb.at(dx), coords[dx]); + bb.at(dx + 3) = std::max(bb.at(dx + 3), coords[dx]); + } + } + + return bb; + }; // Test a linear mapped box { @@ -386,17 +419,30 @@ TEST(ParticleGeometryInterfaceCurved, BoundingBox) { auto xmapy = [&](auto eta) { return eta[1] * 2 - 4; }; auto xmapz = [&](auto eta) { return eta[2] * 0.5 + 7; }; - const int num_modes = 3; + const int num_modes = 2; auto h = make_hex_geom(num_modes, xmapx, xmapy, xmapz); - auto bb = BoundingBox::get_bounding_box(sycl_target, h, 32, 0.05, 0.0); + auto config = std::make_shared(); + auto bb = BoundingBox::get_bounding_box(sycl_target, h, config); + + lambda_test(bb, {0.0, -6.0, 6.5, 2.0, -2.0, 7.5}); + lambda_test(bb, lambda_get_linear_bb(h)); + } + + // Test a bilinear mapped box + { + auto xmapx = [&](auto eta) { return eta[0] + 0.1 * eta[1] + 1; }; + auto xmapy = [&](auto eta) { return eta[1] * 2 - 4 + eta[2] * 0.2; }; + auto xmapz = [&](auto eta) { + return eta[2] * 0.5 + 7 + eta[0] * 0.1 + eta[1] * 0.2; + }; + + const int num_modes = 2; + auto h = make_hex_geom(num_modes, xmapx, xmapy, xmapz); - nprint_variable(bb[0]); - nprint_variable(bb[1]); - nprint_variable(bb[2]); - nprint_variable(bb[3]); - nprint_variable(bb[4]); - nprint_variable(bb[5]); + auto config = std::make_shared(); + auto bb = BoundingBox::get_bounding_box(sycl_target, h, config); + lambda_test(bb, lambda_get_linear_bb(h)); } sycl_target->free(); From bdd4f9153d32834d3a955c263ae8978a02b90ccf Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 10 Dec 2024 16:02:49 +0000 Subject: [PATCH 53/66] added a set of quadratic xmaps for bounding box computation tests --- include/nektar_interface/utility_mesh.hpp | 14 +++---- ..._particle_geometry_interface_3d_curved.cpp | 41 ++++++++++++++++++- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/include/nektar_interface/utility_mesh.hpp b/include/nektar_interface/utility_mesh.hpp index 7c519658..dc8b86a2 100644 --- a/include/nektar_interface/utility_mesh.hpp +++ b/include/nektar_interface/utility_mesh.hpp @@ -18,13 +18,13 @@ namespace NESO { * @param num_modes Number of modes in the coordinate mapping for the Xmap, i.e. * polynomial order plus 1. * @param xmapx Callable that defines the X map in the x direction with - * signature NekDouble(NekDouble[3]) where the single argument is a + * signature NekDouble(std::array) where the single argument is a * subscriptable type.; * @param xmapy Callable that defines the X map in the y direction with - * signature NekDouble(NekDouble[3]) where the single argument is a + * signature NekDouble(std::array) where the single argument is a * subscriptable type.; * @param xmapz Callable that defines the X map in the z direction with - * signature NekDouble(NekDouble[3]) where the single argument is a + * signature NekDouble(std::array) where the single argument is a * subscriptable type.; * @returns HexGeom constructed from X maps. */ @@ -82,10 +82,10 @@ make_hex_geom(const int num_modes, T xmapx, U xmapy, V xmapz) { * (slider)" */ - NekDouble coords_vertices[8][3] = {{-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, - {1.0, 1.0, -1.0}, {-1.0, 1.0, -1.0}, - {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, - {1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}}; + std::array coords_vertices[8] = { + {-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, {1.0, 1.0, -1.0}, + {-1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, + {1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}}; int map_edge_to_vertices[12][2] = { {0, 1}, {1, 2}, {2, 3}, {3, 0}, diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 67d6e648..981f8e35 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -379,7 +379,7 @@ TEST(ParticleGeometryInterfaceCurved, MakeCurvedHex) { TEST(ParticleGeometryInterfaceCurved, BoundingBox) { auto sycl_target = std::make_shared(0, MPI_COMM_WORLD); - const REAL k_tol = 1.0e-12; + REAL k_tol = 1.0e-12; auto lambda_test = [&](const std::array &bb, const std::array correct) { ASSERT_NEAR(bb[0], correct[0], k_tol); @@ -445,5 +445,44 @@ TEST(ParticleGeometryInterfaceCurved, BoundingBox) { lambda_test(bb, lambda_get_linear_bb(h)); } + // quadratic maps + k_tol = 1.0e-2; + { + auto lambda_id0 = [](auto eta) { return eta[0]; }; + auto lambda_id1 = [](auto eta) { return eta[1]; }; + auto lambda_id2 = [](auto eta) { return eta[2]; }; + + auto config = std::make_shared(); + config->set("get_bounding_box/nonlinear_pad_rel", 0.0); + config->set("get_bounding_box/nonlinear_pad_abs", 0.0); + config->set("get_bounding_box/nonlinear_grid_size_factor", 5); + + for (int dx : {0, 1, 2}) { + + std::function)> xmap[3] = { + lambda_id0, lambda_id1, lambda_id2}; + + for (auto a : {-0.4, 0.4}) { + const int dy = (dx + 1) % 3; + auto xmapdx = [&](auto eta) { + return eta[dx] + a * (1.0 - eta[dy] * eta[dy]); + }; + xmap[dx] = xmapdx; + + const int num_modes = 3; + auto h = make_hex_geom(num_modes, xmap[0], xmap[1], xmap[2]); + auto ll = lambda_get_linear_bb(h); + auto bb = BoundingBox::get_bounding_box(sycl_target, h, config); + + if (a > 0.0) { + ll[dx + 3] += a; + } else { + ll[dx] += a; + } + lambda_test(bb, ll); + } + } + } + sycl_target->free(); } From 8a9e8082dbaf50cc9af21b297d8bd97d5f1e0bc2 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 10 Dec 2024 16:35:44 +0000 Subject: [PATCH 54/66] made utility bounding box function accept 2D geoms such that it can be a drop in replacement --- .../geometry_transport/utility_geometry.hpp | 2 +- .../particle_cell_mapping/x_map_bounding_box.hpp | 2 +- .../particle_cell_mapping/x_map_newton.hpp | 1 - .../particle_cell_mapping/x_map_bounding_box.cpp | 11 +++++++++-- .../test_particle_geometry_interface_3d_curved.cpp | 6 +++--- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/include/nektar_interface/geometry_transport/utility_geometry.hpp b/include/nektar_interface/geometry_transport/utility_geometry.hpp index 3c82fc91..979e9a48 100644 --- a/include/nektar_interface/geometry_transport/utility_geometry.hpp +++ b/include/nektar_interface/geometry_transport/utility_geometry.hpp @@ -10,8 +10,8 @@ namespace NESO { */ template inline bool geometry_is_linear(std::shared_ptr geom) { - const int ndim = geom->GetCoordim(); const auto xmap = geom->GetXmap(); + const int ndim = xmap->GetBase().size(); for (int dimx = 0; dimx < ndim; dimx++) { if (xmap->GetBasisNumModes(dimx) != 2) { return false; diff --git a/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp b/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp index 16644d51..b44ab8cc 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp @@ -31,7 +31,7 @@ namespace NESO::BoundingBox { */ std::array get_bounding_box(Particles::SYCLTargetSharedPtr sycl_target, - SD::Geometry3DSharedPtr geom, + SD::GeometrySharedPtr geom, ParameterStoreSharedPtr parameter_store); } // namespace NESO::BoundingBox diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 8b754270..c9a92890 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -297,7 +297,6 @@ template class XMapNewton { NESOASSERT(k_fdata != nullptr, "Bad pointer"); const std::size_t num_bytes_local = std::max(this->num_bytes_local, sizeof(REAL)); - NESOASSERT(this->ndim == 3, "Only implemented in 3D"); // Get a local size which is a power of 2. const std::size_t local_size = diff --git a/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp b/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp index 7c25537f..c49e79ff 100644 --- a/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp +++ b/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp @@ -6,13 +6,20 @@ namespace NESO::BoundingBox { std::array get_bounding_box(Particles::SYCLTargetSharedPtr sycl_target, - SD::Geometry3DSharedPtr geom, + SD::GeometrySharedPtr geom, ParameterStoreSharedPtr parameter_store) { NESOASSERT(geom != nullptr, "Bad geometry object passed."); + + auto xmap = geom->GetXmap(); + const int ndim = xmap->GetBase().size(); + if (ndim < 3) { + return geom->GetBoundingBox(); + } + const bool is_linear = geometry_is_linear(geom); const std::size_t max_num_modes = - static_cast(geom->GetXmap()->EvalBasisNumModesMax()); + static_cast(xmap->EvalBasisNumModesMax()); Newton::XMapNewton x_map(sycl_target, geom); REAL pad_rel = 0.0; diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 981f8e35..5abbadaf 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -413,7 +413,7 @@ TEST(ParticleGeometryInterfaceCurved, BoundingBox) { return bb; }; - // Test a linear mapped box + // Test a linear mapped hex { auto xmapx = [&](auto eta) { return eta[0] + 1; }; auto xmapy = [&](auto eta) { return eta[1] * 2 - 4; }; @@ -429,7 +429,7 @@ TEST(ParticleGeometryInterfaceCurved, BoundingBox) { lambda_test(bb, lambda_get_linear_bb(h)); } - // Test a bilinear mapped box + // Test a bilinear mapped hex { auto xmapx = [&](auto eta) { return eta[0] + 0.1 * eta[1] + 1; }; auto xmapy = [&](auto eta) { return eta[1] * 2 - 4 + eta[2] * 0.2; }; @@ -445,7 +445,7 @@ TEST(ParticleGeometryInterfaceCurved, BoundingBox) { lambda_test(bb, lambda_get_linear_bb(h)); } - // quadratic maps + // quadratic mapped hex k_tol = 1.0e-2; { auto lambda_id0 = [](auto eta) { return eta[0]; }; From b0e52c2213d3bcdb3e6ca89ed1b277547d01a4a5 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 10 Dec 2024 16:49:57 +0000 Subject: [PATCH 55/66] reordered head files to make slightly more sense --- .../particle_cell_mapping/map_particles_3d.hpp | 2 +- .../particle_cell_mapping/map_particles_newton.hpp | 1 + .../particle_cell_mapping/newton_generic_3d.hpp | 3 +-- .../nektar_interface/particle_cell_mapping/newton_hex.hpp | 3 ++- .../particle_cell_mapping/newton_triangle_embed_3d.hpp | 6 ++++-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_3d.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_3d.hpp index e71e1cf1..ed146f7b 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_3d.hpp @@ -20,7 +20,7 @@ #include #include -#include "newton_geom_interfaces.hpp" +#include "particle_cell_mapping_newton.hpp" using namespace Nektar::SpatialDomains; using namespace NESO; diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp index 77a99da1..d1b4cf72 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -10,6 +10,7 @@ #include "coarse_mappers_base.hpp" #include "mapping_newton_iteration_base.hpp" #include "nektar_interface/parameter_store.hpp" +#include "newton_geom_interfaces.hpp" #include "particle_cell_mapping_common.hpp" #include "x_map_newton_kernel.hpp" diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index 2b95fd2e..a3ee2e3c 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -3,8 +3,7 @@ #include "../bary_interpolation/bary_evaluation.hpp" #include "../coordinate_mapping.hpp" -#include "generated_linear/linear_newton_implementation.hpp" -#include "particle_cell_mapping_newton.hpp" +#include "mapping_newton_iteration_base.hpp" #include using namespace NESO; diff --git a/include/nektar_interface/particle_cell_mapping/newton_hex.hpp b/include/nektar_interface/particle_cell_mapping/newton_hex.hpp index c7ea0588..061d71aa 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_hex.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_hex.hpp @@ -2,9 +2,10 @@ #define ___NESO_PARTICLE_MAPPING_NEWTON_HEX_H__ #include "generated_linear/linear_newton_implementation.hpp" -#include "particle_cell_mapping_newton.hpp" #include +#include "mapping_newton_iteration_base.hpp" +using namespace Nektar; using namespace NESO; using namespace NESO::Particles; diff --git a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp index 75701a82..da4aae53 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp @@ -1,11 +1,13 @@ #ifndef ___NESO_PARTICLE_MAPPING_NEWTON_TRIANGLE_EMBED_3D_H__ #define ___NESO_PARTICLE_MAPPING_NEWTON_TRIANGLE_EMBED_3D_H__ -#include "generated_linear/linear_newton_implementation.hpp" #include "nektar_interface/special_functions.hpp" -#include "particle_cell_mapping_newton.hpp" + +#include "generated_linear/linear_newton_implementation.hpp" #include +#include "mapping_newton_iteration_base.hpp" +using namespace Nektar; using namespace NESO; using namespace NESO::Particles; From a7c725daefb6bfa3e3ad0aeccd616a3ee06ba944 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 16 Dec 2024 12:02:04 +0000 Subject: [PATCH 56/66] helper interfaces for BoundingBox::get_bounding_box --- .../bounding_box_intersection.hpp | 3 +- .../x_map_bounding_box.hpp | 22 +++++++++++- .../x_map_bounding_box.cpp | 35 +++++++++++++------ 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/include/nektar_interface/bounding_box_intersection.hpp b/include/nektar_interface/bounding_box_intersection.hpp index e8c431d1..678bd04e 100644 --- a/include/nektar_interface/bounding_box_intersection.hpp +++ b/include/nektar_interface/bounding_box_intersection.hpp @@ -100,7 +100,8 @@ expand_bounding_box_array(std::array &bounding_box_in, /** * Extend the bounds of a bounding box to include the given element. * - * @param element Nektar++ element that includes a GetBoundingBox method. + * @param element Nektar++ element for which BoundingBox::get_bounding_box can + * be called. * @param bounding_box Bounding box to extend using element. */ template diff --git a/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp b/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp index b44ab8cc..8bb22c03 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_bounding_box.hpp @@ -32,7 +32,27 @@ namespace NESO::BoundingBox { std::array get_bounding_box(Particles::SYCLTargetSharedPtr sycl_target, SD::GeometrySharedPtr geom, - ParameterStoreSharedPtr parameter_store); + ParameterStoreSharedPtr parameter_store = nullptr); + +/** + * Return a Nektar++ style bounding box for the geometry object. Padding is + * added to each end of each dimension. i.e. a padding of 5% (pad_rel = 0.05) + * at each end is 10% globally. + * + * Parameters: + * get_bounding_box/linear_pad_rel + * get_bounding_box/linear_pad_abs + * get_bounding_box/nonlinear_pad_rel + * get_bounding_box/nonlinear_pad_abs + * get_bounding_box/nonlinear_grid_size_factor + * + * @param geom Geometry object to get bounding box for. + * @param parameter_store ParameterStore containing parameters. + * @returns Bounding box in format [minx, miny, minz, maxx, maxy, maxz]; + */ +std::array +get_bounding_box(SD::GeometrySharedPtr geom, + ParameterStoreSharedPtr parameter_store = nullptr); } // namespace NESO::BoundingBox diff --git a/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp b/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp index c49e79ff..ee52e0c2 100644 --- a/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp +++ b/src/nektar_interface/particle_cell_mapping/x_map_bounding_box.cpp @@ -27,18 +27,24 @@ get_bounding_box(Particles::SYCLTargetSharedPtr sycl_target, std::size_t grid_size = 2; if (is_linear) { - pad_rel = - parameter_store->get("get_bounding_box/linear_pad_rel", 0.0); - pad_abs = - parameter_store->get("get_bounding_box/linear_pad_abs", 0.0); + if (parameter_store != nullptr) { + pad_rel = + parameter_store->get("get_bounding_box/linear_pad_rel", 0.0); + pad_abs = + parameter_store->get("get_bounding_box/linear_pad_abs", 0.0); + } grid_size = 2; } else { - pad_rel = - parameter_store->get("get_bounding_box/nonlinear_pad_rel", 0.05); - pad_abs = - parameter_store->get("get_bounding_box/nonlinear_pad_abs", 0.0); - const auto grid_size_factor = parameter_store->get( - "get_bounding_box/nonlinear_grid_size_factor", 4); + pad_rel = 0.0; + INT grid_size_factor = 4; + if (parameter_store != nullptr) { + pad_rel = parameter_store->get("get_bounding_box/nonlinear_pad_rel", + 0.05); + pad_abs = + parameter_store->get("get_bounding_box/nonlinear_pad_abs", 0.0); + grid_size_factor = parameter_store->get( + "get_bounding_box/nonlinear_grid_size_factor", 4); + } grid_size = static_cast(grid_size_factor) * max_num_modes; } @@ -49,4 +55,13 @@ get_bounding_box(Particles::SYCLTargetSharedPtr sycl_target, return x_map.get_bounding_box(grid_size, pad_rel, pad_abs); } +std::array +get_bounding_box(SD::GeometrySharedPtr geom, + ParameterStoreSharedPtr parameter_store) { + auto sycl_target = std::make_shared(0, MPI_COMM_SELF, 0); + auto bb = get_bounding_box(sycl_target, geom, parameter_store); + sycl_target->free(); + return bb; +} + } // namespace NESO::BoundingBox From 87d9c6018368e5a9cc4415495c1c4aa2ddbd4993 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 16 Dec 2024 12:04:14 +0000 Subject: [PATCH 57/66] removed some dead code marked as to-remove --- src/nektar_interface/function_evaluation.cpp | 1 - .../test_particle_advection.cpp | 175 ------------------ .../test_particle_function_evaluation_3d.cpp | 130 ------------- 3 files changed, 306 deletions(-) diff --git a/src/nektar_interface/function_evaluation.cpp b/src/nektar_interface/function_evaluation.cpp index 8ed52725..4010915f 100644 --- a/src/nektar_interface/function_evaluation.cpp +++ b/src/nektar_interface/function_evaluation.cpp @@ -1,4 +1,3 @@ -#define NESO_PARTICLES_PROFILING_REGION // TODO REMOVE #include namespace NESO { diff --git a/test/integration/nektar_interface/test_particle_advection.cpp b/test/integration/nektar_interface/test_particle_advection.cpp index e1d36947..515d2ba2 100644 --- a/test/integration/nektar_interface/test_particle_advection.cpp +++ b/test/integration/nektar_interface/test_particle_advection.cpp @@ -353,178 +353,3 @@ INSTANTIATE_TEST_SUITE_P( // like (err_x * err_x // + err_y * err_y) < 1.0e-8 ))); - -// TODO REMOVE START -class FooBar : public testing::TestWithParam< - std::tuple> {}; -TEST_P(FooBar, Advection3D) { - // Test advecting particles between ranks - - std::tuple param = GetParam(); - - const int N_total = 100000; - const double tol = std::get<2>(param); - - TestUtilities::TestResourceSession resource_session( - static_cast(std::get<1>(param)), - static_cast(std::get<0>(param))); - - // Create session reader. - auto session = resource_session.session; - auto graph = SpatialDomains::MeshGraphIO::Read(session); - - auto mesh = std::make_shared(graph); - extend_halos_fixed_offset(1, mesh); - auto sycl_target = std::make_shared(0, mesh->get_comm()); - - auto config = std::make_shared(); - config->set("MapParticlesNewton/newton_tol", 1.0e-12); - config->set("MapParticlesNewton/contained_tol", 1.0e-2); - - auto nektar_graph_local_mapper = - std::make_shared(sycl_target, mesh, config); - - auto domain = std::make_shared(mesh, nektar_graph_local_mapper); - - const int ndim = 3; - ParticleSpec particle_spec{ParticleProp(Sym("P"), ndim, true), - ParticleProp(Sym("P_ORIG"), ndim), - ParticleProp(Sym("V"), 3), - ParticleProp(Sym("CELL_ID"), 1, true), - ParticleProp(Sym("ID"), 1)}; - - auto A = std::make_shared(domain, particle_spec, sycl_target); - - NektarCartesianPeriodic pbc(sycl_target, graph, A->position_dat); - - CellIDTranslation cell_id_translation(sycl_target, A->cell_id_dat, mesh); - - const int rank = sycl_target->comm_pair.rank_parent; - const int size = sycl_target->comm_pair.size_parent; - - std::mt19937 rng_pos(52234234 + rank); - std::mt19937 rng_vel(52234231 + rank); - std::mt19937 rng_rank(18241); - - int rstart, rend; - get_decomp_1d(size, N_total, rank, &rstart, &rend); - const int N = rend - rstart; - - int N_check = -1; - MPICHK(MPI_Allreduce(&N, &N_check, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD)); - NESOASSERT(N_check == N_total, "Error creating particles"); - - const int Nsteps = 20; - const REAL dt = 0.1; - const int cell_count = domain->mesh->get_cell_count(); - - if (N > 0) { - auto positions = - uniform_within_extents(N, ndim, pbc.global_extent, rng_pos); - auto velocities = - NESO::Particles::normal_distribution(N, 3, 0.0, 0.5, rng_vel); - std::uniform_int_distribution uniform_dist( - 0, sycl_target->comm_pair.size_parent - 1); - ParticleSet initial_distribution(N, A->get_particle_spec()); - for (int px = 0; px < N; px++) { - for (int dimx = 0; dimx < ndim; dimx++) { - const double pos_orig = positions[dimx][px] + pbc.global_origin[dimx]; - initial_distribution[Sym("P")][px][dimx] = pos_orig; - initial_distribution[Sym("P_ORIG")][px][dimx] = pos_orig; - } - for (int dimx = 0; dimx < 3; dimx++) { - initial_distribution[Sym("V")][px][dimx] = velocities[dimx][px]; - } - initial_distribution[Sym("CELL_ID")][px][0] = 0; - initial_distribution[Sym("ID")][px][0] = px; - const auto px_rank = uniform_dist(rng_rank); - initial_distribution[Sym("NESO_MPI_RANK")][px][0] = px_rank; - } - A->add_particles_local(initial_distribution); - } - reset_mpi_ranks((*A)[Sym("NESO_MPI_RANK")]); - - MeshHierarchyGlobalMap mesh_hierarchy_global_map( - sycl_target, domain->mesh, A->position_dat, A->cell_id_dat, - A->mpi_rank_dat); - - auto lambda_advect = [&] { - auto t0 = profile_timestamp(); - particle_loop( - A, - [=](auto P, auto V) { - for (int dimx = 0; dimx < ndim; dimx++) { - P.at(dimx) += dt * V.at(dimx); - } - }, - Access::write(Sym("P")), Access::read(Sym("V"))) - ->execute(); - sycl_target->profile_map.inc("Advect", "Execute", 1, - profile_elapsed(t0, profile_timestamp())); - }; - - H5Part h5part("trajectory.h5part", A, Sym("P"), - Sym("NESO_MPI_RANK"), - Sym("NESO_REFERENCE_POSITIONS")); - - write_vtk_cells_owned("owned_cells", mesh); - - for (int stepx = 0; stepx < 2; stepx++) { - pbc.execute(); - mesh_hierarchy_global_map.execute(); - A->hybrid_move(); - cell_id_translation.execute(); - A->cell_move(); - lambda_advect(); - h5part.write(); - h5part.close(); - } - sycl_target->profile_map.enable(); - sycl_target->profile_map.reset(); - auto t0 = profile_timestamp(); - REAL T = 0.0; - for (int stepx = 0; stepx < Nsteps; stepx++) { - pbc.execute(); - mesh_hierarchy_global_map.execute(); - A->hybrid_move(); - cell_id_translation.execute(); - A->cell_move(); - - lambda_advect(); - T += dt; - - auto tt = profile_elapsed(t0, profile_timestamp()); - - if (!rank) { - nprint(stepx, tt / (((stepx + 1)) * N_total)); - } - // h5part.write(); - } - sycl_target->profile_map.write_events_json("newton_test_events", rank); - - // h5part.close(); - mesh->free(); -} - -INSTANTIATE_TEST_SUITE_P( - MultipleMeshes, FooBar, - testing::Values( - std::tuple( - "reference_all_types_cube/conditions.xml", - "reference_all_types_cube/linear_non_regular_0.5.xml", - 1.0e-4 // The non-linear exit tolerance in Nektar is - // like (err_x * err_x - // + err_y * err_y) < 1.0e-8 - ), - std::tuple( - "reference_all_types_cube/conditions.xml", - "reference_all_types_cube/mixed_ref_cube_0.5.xml", 1.0e-10), - std::tuple( - "reference_all_types_cube/conditions.xml", - "reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml", - 1.0e-4 // The non-linear exit tolerance in Nektar is - // like (err_x * err_x - // + err_y * err_y) < 1.0e-8 - ))); - -// TODO REMOVE END diff --git a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp index f8d3e317..2e109bb9 100644 --- a/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp +++ b/test/unit/nektar_interface/test_particle_function_evaluation_3d.cpp @@ -1,4 +1,3 @@ -#define NESO_PARTICLES_PROFILING_REGION // TODO REMOVE #include "nektar_interface/function_evaluation.hpp" #include "nektar_interface/particle_interface.hpp" #include "nektar_interface/utilities.hpp" @@ -385,132 +384,3 @@ TEST(BaryInterpolation, Evaluation3DDisContFieldPrismTet) { "reference_prism_tet_cube/conditions.xml", "reference_prism_tet_cube/prism_tet_cube_0.5_perturbed.xml", 1.0e-7); } - -// TODO REMOVE START - -template -static inline void evaluation_marco(std::string condtions_file_s, - std::string mesh_file_s, const double tol) { - - const int N_total = 1200000; - - std::filesystem::path source_file = __FILE__; - std::filesystem::path source_dir = source_file.parent_path(); - std::filesystem::path test_resources_dir = - source_dir / "../../test_resources"; - - std::filesystem::path condtions_file_basename{condtions_file_s}; - std::filesystem::path mesh_file_basename{mesh_file_s}; - std::filesystem::path conditions_file = - test_resources_dir / condtions_file_basename; - std::filesystem::path mesh_file = test_resources_dir / mesh_file_basename; - - int argc = 3; - char *argv[3]; - copy_to_cstring(std::string("test_particle_geometry_interface"), &argv[0]); - copy_to_cstring(std::string(conditions_file), &argv[1]); - copy_to_cstring(std::string(mesh_file), &argv[2]); - - LibUtilities::SessionReaderSharedPtr session; - SpatialDomains::MeshGraphSharedPtr graph; - // Create session reader. - session = LibUtilities::SessionReader::CreateInstance(argc, argv); - graph = SpatialDomains::MeshGraphIO::Read(session); - - auto mesh = std::make_shared(graph); - auto sycl_target = std::make_shared(0, mesh->get_comm()); - - std::mt19937 rng{182348}; - - auto nektar_graph_local_mapper = - std::make_shared(sycl_target, mesh); - auto domain = std::make_shared(mesh, nektar_graph_local_mapper); - - const int ndim = 3; - ParticleSpec particle_spec{ParticleProp(Sym("P"), ndim, true), - ParticleProp(Sym("CELL_ID"), 1, true), - ParticleProp(Sym("E"), 1), - ParticleProp(Sym("DEDX"), ndim), - ParticleProp(Sym("ID"), 1)}; - - auto A = std::make_shared(domain, particle_spec, sycl_target); - - NektarCartesianPeriodic pbc(sycl_target, graph, A->position_dat); - auto cell_id_translation = - std::make_shared(sycl_target, A->cell_id_dat, mesh); - const int rank = sycl_target->comm_pair.rank_parent; - const int size = sycl_target->comm_pair.size_parent; - - std::mt19937 rng_pos(52234234 + rank); - int rstart, rend; - get_decomp_1d(size, N_total, rank, &rstart, &rend); - const int N = rend - rstart; - int N_check = -1; - MPICHK(MPI_Allreduce(&N, &N_check, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD)); - NESOASSERT(N_check == N_total, "Error creating particles"); - const int cell_count = domain->mesh->get_cell_count(); - if (N > 0) { - auto positions = - uniform_within_extents(N, ndim, pbc.global_extent, rng_pos); - - ParticleSet initial_distribution(N, A->get_particle_spec()); - for (int px = 0; px < N; px++) { - for (int dimx = 0; dimx < ndim; dimx++) { - const double pos_orig = positions[dimx][px] + pbc.global_origin[dimx]; - initial_distribution[Sym("P")][px][dimx] = pos_orig; - } - - initial_distribution[Sym("CELL_ID")][px][0] = 0; - initial_distribution[Sym("ID")][px][0] = px; - } - A->add_particles_local(initial_distribution); - } - reset_mpi_ranks((*A)[Sym("NESO_MPI_RANK")]); - - pbc.execute(); - A->hybrid_move(); - cell_id_translation->execute(); - A->cell_move(); - - auto field = std::make_shared(session, graph, "u"); - - auto lambda_f = [&](const NekDouble x, const NekDouble y, const NekDouble z) { - return std::pow((x + 1.0) * (x - 1.0) * (y + 1.0) * (y - 1.0) * (z + 1.0) * - (z - 1.0), - 4); - }; - - interpolate_onto_nektar_field_3d(lambda_f, field); - NESOCellsToNektarExp map_cells_to_exp(field, cell_id_translation); - - // auto field_evaluate = std::make_shared>( - // field, A, cell_id_translation); - // field_evaluate->evaluate(Sym("E")); - auto field_deriv_evaluate = std::make_shared>( - field, A, cell_id_translation, true); - - for (int cellx = 0; cellx < 2; cellx++) { - field_deriv_evaluate->evaluate(Sym("DEDX")); - } - - sycl_target->profile_map.enable(); - for (int cellx = 0; cellx < 40; cellx++) { - field_deriv_evaluate->evaluate(Sym("DEDX")); - } - sycl_target->profile_map.write_events_json("bary_evaluation", rank); - - A->free(); - mesh->free(); - - delete[] argv[0]; - delete[] argv[1]; - delete[] argv[2]; -} - -TEST(Marco, Polo) { - evaluation_marco( - "reference_hex_cube/conditions.xml", - "reference_hex_cube/hex_cube_0.5.xml", 1.0e-7); -} - -// TODO REMOVE END From d6d62aabfb3726b94c6560cb14ded26ad1532747 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 16 Dec 2024 12:11:00 +0000 Subject: [PATCH 58/66] populated some API docstrings which were TODOs --- .../bary_interpolation/bary_evaluation.hpp | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp index 1b86d79c..b485678f 100644 --- a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -49,7 +49,18 @@ inline void preprocess_weights(const int num_phys, const REAL coord, } /** - * TODO + * For quadrature point r_i with weight bw_i compute bw_i / (r - r_i). + * + * @param num_phys The number of quadrature points for the element and + * dimension for which this computation is performed. + * @param[in] coord The evauation points, size N, in the dimension of interest. + * @param[in] z_values A length num_phys array containing the quadrature + * points. + * @param[in] z_values A length num_phys array containing the quadrature + * weights. + * @param[in, out] div_values Array of length num_phys * N which will be + * populated with the bw_i/(r - r_i) values. Ordering is particle then + * component. */ template inline void @@ -361,7 +372,23 @@ inline void compute_dir_210_interlaced(const int num_functions, } /** - * TODO + * Computes Bary interpolation over three dimensions. Evaluates N functions + * with interlaced quadrature point values. See function + * preprocess_weights_block. + * + * @param[in] num_functions Number of functions to evaluate. + * @param[in] num_phys0 Number of quadrature points in dimension 0. + * @param[in] num_phys1 Number of quadrature points in dimension 1. + * @param[in] num_phys2 Number of quadrature points in dimension 2. + * @param[in] physvals Array of function values at quadrature points interlaced + * values for each function to evaluate. + * @param[in] div_space0 The output of preprocess_weights applied to dimension + * 0. + * @param[in] div_space1 The output of preprocess_weights applied to + * dimension 1. + * @param[in] div_space2 The output of preprocess_weights applied to + * dimension 2. + * @param[in, out] output Output function evaluations. */ template inline void compute_dir_210_interlaced_block( From fd18d3ad6b1c3bcfcc6734590a7440307cec2d04 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 17 Dec 2024 10:58:33 +0000 Subject: [PATCH 59/66] Added more robust self checking for new Bary interpolation. --- .../function_bary_evaluation.hpp | 46 ++++++++++++++++++- .../geometry_transport/utility_geometry.hpp | 34 ++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/include/nektar_interface/function_bary_evaluation.hpp b/include/nektar_interface/function_bary_evaluation.hpp index 5b6693ae..b33e59cf 100644 --- a/include/nektar_interface/function_bary_evaluation.hpp +++ b/include/nektar_interface/function_bary_evaluation.hpp @@ -484,6 +484,9 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { v_cell_info.reserve(neso_cell_count); this->max_num_phys = 0; + // Temporary map for testing values are consistent between cells. + std::map> map_test_coeffs; + for (int neso_cellx = 0; neso_cellx < neso_cell_count; neso_cellx++) { const int nektar_geom_id = cell_id_translation->map_to_nektar[neso_cellx]; const int expansion_id = geom_to_exp[nektar_geom_id]; @@ -496,11 +499,16 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { for (int dimx = 0; dimx < 3; dimx++) { std::get<1>(key)[dimx] = 0; } + std::size_t size_sum = 0; for (int dimx = 0; dimx < this->ndim; dimx++) { - std::get<1>(key)[dimx] = + const std::size_t tmp_size = static_cast(expansion->GetBase()[dimx]->GetZ().size()); + std::get<1>(key)[dimx] = tmp_size; + size_sum += tmp_size; } if (this->map_cells_to_info.count(key) == 0) { + map_test_coeffs[key].reserve(2 * size_sum); + CellInfo cell_info; cell_info.shape_type_int = std::get<0>(key); for (int dx = 0; dx < 3; dx++) { @@ -520,9 +528,11 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { std::vector tmp_reals(2 * size); for (int cx = 0; cx < size; cx++) { tmp_reals.at(cx) = z[cx]; + map_test_coeffs.at(key).push_back(z[cx]); } for (int cx = 0; cx < size; cx++) { tmp_reals.at(cx + size) = bw[cx]; + map_test_coeffs.at(key).push_back(bw[cx]); } auto ptr = std::make_shared>(this->sycl_target, tmp_reals); @@ -534,6 +544,40 @@ template class BaryEvaluateBase : GeomToExpansionBuilder { } this->map_cells_to_info[key] = cell_info; + } else { + // Test that the held values that we reuse are actually the same. + std::vector to_test; + to_test.reserve(2 * size_sum); + for (int dimx = 0; dimx < this->ndim; dimx++) { + auto base = expansion->GetBase(); + const auto &z = base[dimx]->GetZ(); + const auto &bw = base[dimx]->GetBaryWeights(); + NESOASSERT(z.size() == bw.size(), + "Expected these two sizes to match."); + const auto size = z.size(); + for (int cx = 0; cx < size; cx++) { + to_test.push_back(z[cx]); + } + for (int cx = 0; cx < size; cx++) { + to_test.push_back(bw[cx]); + } + } + NESOASSERT(to_test.size() == map_test_coeffs.at(key).size(), + "Size missmatch in coeff checking."); + const std::size_t size = to_test.size(); + auto lambda_rel_err = [](const REAL a, const REAL b) { + const REAL err_abs = std::abs(a - b); + const REAL abs_a = std::abs(a); + const REAL err_rel = abs_a > 0.0 ? err_abs / abs_a : err_abs; + return std::min(err_rel, err_abs); + }; + + for (std::size_t ix = 0; ix < size; ix++) { + NESOASSERT(lambda_rel_err(to_test.at(ix), + map_test_coeffs.at(key).at(ix)) < 1.0e-10, + "Big missmatch in coefficients detected. Please raise an " + "issue on the git repository."); + } } // Get the generic info for this cell type and number of modes diff --git a/include/nektar_interface/geometry_transport/utility_geometry.hpp b/include/nektar_interface/geometry_transport/utility_geometry.hpp index 979e9a48..bcc23999 100644 --- a/include/nektar_interface/geometry_transport/utility_geometry.hpp +++ b/include/nektar_interface/geometry_transport/utility_geometry.hpp @@ -1,7 +1,9 @@ #ifndef _NESO_GEOMETRY_TRANSPORT_UTILITY_GEOMETRY_HPP_ #define _NESO_GEOMETRY_TRANSPORT_UTILITY_GEOMETRY_HPP_ +#include #include +#include namespace NESO { @@ -20,6 +22,38 @@ inline bool geometry_is_linear(std::shared_ptr geom) { return true; } +/** + * @param geom Geometry object. + * @returns String describing geometry. + */ +template +inline std::string get_geometry_name(GEOM_TYPE geom) { + using namespace Nektar::LibUtilities; + + const auto shape_type = geom->GetShapeType(); + + if (shape_type == ShapeType::eTriangle) { + return "Triangle"; + } + if (shape_type == ShapeType::eQuadrilateral) { + return "Quadrilateral"; + } + if (shape_type == ShapeType::eHexahedron) { + return "Hexahedron"; + } + if (shape_type == ShapeType::ePrism) { + return "Prism"; + } + if (shape_type == ShapeType::eTetrahedron) { + return "Tetrahedron"; + } + if (shape_type == ShapeType::ePyramid) { + return "Pyramid"; + } + + return "Unknown ShapeType"; +} + } // namespace NESO #endif From d72602a6958cc69a124395d38b5e990f573ce87d Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 17 Dec 2024 14:47:26 +0000 Subject: [PATCH 60/66] removed bad test mesh and added an initial torus mesh in its place --- .../bary_interpolation/bary_evaluation.hpp | 2 +- .../particle_cell_mapping_common.hpp | 11 - include/nektar_interface/utility_mesh.hpp | 3 +- .../map_particles_3d.cpp | 8 +- .../map_particles_common.cpp | 3 +- .../map_particles_host.cpp | 9 + .../test_particle_advection.cpp | 57 +- .../mixed_ref_cube_0.5_perturbed_order_2.xml | 4771 ----------------- test/test_resources/torus/conditions.xml | 46 + .../torus/quarter_torus_tets_order_2.xml | 4082 ++++++++++++++ ..._particle_geometry_interface_3d_curved.cpp | 3 +- 11 files changed, 4166 insertions(+), 4829 deletions(-) delete mode 100644 test/test_resources/reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml create mode 100644 test/test_resources/torus/conditions.xml create mode 100644 test/test_resources/torus/quarter_torus_tets_order_2.xml diff --git a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp index b485678f..08f37983 100644 --- a/include/nektar_interface/bary_interpolation/bary_evaluation.hpp +++ b/include/nektar_interface/bary_interpolation/bary_evaluation.hpp @@ -372,7 +372,7 @@ inline void compute_dir_210_interlaced(const int num_functions, } /** - * Computes Bary interpolation over three dimensions. Evaluates N functions + * Computes Bary interpolation over three dimensions. Evaluates N particles * with interlaced quadrature point values. See function * preprocess_weights_block. * diff --git a/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp b/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp index 4045c973..0620f83c 100644 --- a/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp +++ b/include/nektar_interface/particle_cell_mapping/particle_cell_mapping_common.hpp @@ -172,17 +172,6 @@ inline bool contains_point_3d(std::shared_ptr geom, Array &global_coord, Array &local_coord, const NekDouble tol) { bool contained = geom->ContainsPoint(global_coord, local_coord, tol); - // TODO REMOVE START - if (contained) { - Array test_coord(3); - test_coord[0] = geom->GetCoord(0, local_coord); - test_coord[1] = geom->GetCoord(1, local_coord); - test_coord[2] = geom->GetCoord(2, local_coord); - nprint("P:", global_coord[0], global_coord[1], global_coord[2], - "L:", local_coord[0], local_coord[1], local_coord[2], - "T:", test_coord[0], test_coord[1], test_coord[2]); - } - // TODO REMOVE END return contained; } diff --git a/include/nektar_interface/utility_mesh.hpp b/include/nektar_interface/utility_mesh.hpp index dc8b86a2..156824cf 100644 --- a/include/nektar_interface/utility_mesh.hpp +++ b/include/nektar_interface/utility_mesh.hpp @@ -242,7 +242,8 @@ make_hex_geom(const int num_modes, T xmapx, U xmapy, V xmapz) { auto hex = std::make_shared(0, quads); hex->GetGeomFactors(); hex->Setup(); - + NESOWARN(hex->GetMetricInfo()->IsValid(), + "Created HexGeom has a negative Jacobian."); return hex; } diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp index d2a3c4cb..0aa6dc4e 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp @@ -112,9 +112,6 @@ void MapParticles3D::map(ParticleGroup &particle_group, const int map_cell) { map_newton_initial(this->map_particles_3d_deformed_non_linear, particle_group, map_cell); - bool particles_not_mapped = - this->map_particles_common->check_map(particle_group, map_cell); - map_newton_final(std::get<0>(this->map_particles_3d_deformed_linear), particle_group, map_cell); map_newton_final(std::get<1>(this->map_particles_3d_deformed_linear), @@ -129,7 +126,7 @@ void MapParticles3D::map(ParticleGroup &particle_group, const int map_cell) { if (map_cell > -1) { // if there are particles not yet mapped this may be an error depending on // which stage of NESO-Particles hybrid move we are at. - particles_not_mapped = + bool particles_not_mapped = this->map_particles_common->check_map(particle_group, map_cell); if (this->map_particles_host && particles_not_mapped) { @@ -140,7 +137,7 @@ void MapParticles3D::map(ParticleGroup &particle_group, const int map_cell) { } particles_not_mapped = - this->map_particles_common->check_map(particle_group, map_cell); + this->map_particles_common->check_map(particle_group); if (particles_not_mapped) { nprint( @@ -154,6 +151,7 @@ void MapParticles3D::map(ParticleGroup &particle_group, const int map_cell) { auto sym_cell = cell_id_dat->sym; auto sym_positions = positions_dat->sym; const auto ndim = particle_group.domain->mesh->get_ndim(); + nprint("rank:", this->sycl_target->comm_pair.rank_parent); for (int cx = 0; cx < cell_count; cx++) { auto P = particle_group.get_cell(sym_positions, cx); auto C = particle_group.get_cell(sym_cell, cx); diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_common.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_common.cpp index 9539e19d..92053f0d 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_common.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_common.cpp @@ -28,7 +28,8 @@ bool MapParticlesCommon::check_map(ParticleGroup &particle_group, // If the return flag is true there are particles which were not binned into // cells. If the return flag is false all particles were binned into cells. - return this->ep->get_flag(); + const bool flag = this->ep->get_flag(); + return flag; } } // namespace NESO diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_host.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_host.cpp index d39e6893..63a4dcce 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_host.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_host.cpp @@ -82,6 +82,10 @@ void MapParticlesHost::map(ParticleGroup &particle_group, const int map_cell) { // Is this particle already binned into a cell? if ((mpi_ranks)[1][rowx] < 0) { + if (Debug::enabled(Debug::MOVEMENT_LEVEL)) { + nprint("MapParticlesHost::map"); + nprint("\tcell:", cellx, "layer:", rowx); + } // copy the particle position into a nektar++ point format for (int dimx = 0; dimx < ndim; dimx++) { @@ -89,6 +93,11 @@ void MapParticlesHost::map(ParticleGroup &particle_group, const int map_cell) { local_coord[dimx] = ref_particle_positions[dimx][rowx]; } + if (Debug::enabled(Debug::MOVEMENT_LEVEL)) { + nprint("\tglobal_coord:", global_coord[0], global_coord[1], + global_coord[2]); + } + // update the PointGeom point->UpdatePosition(global_coord[0], global_coord[1], global_coord[2]); diff --git a/test/integration/nektar_interface/test_particle_advection.cpp b/test/integration/nektar_interface/test_particle_advection.cpp index 515d2ba2..f038b32d 100644 --- a/test/integration/nektar_interface/test_particle_advection.cpp +++ b/test/integration/nektar_interface/test_particle_advection.cpp @@ -80,10 +80,6 @@ TEST(ParticleGeometryInterface, Advection2D) { } reset_mpi_ranks((*A)[Sym("NESO_MPI_RANK")]); - MeshHierarchyGlobalMap mesh_hierarchy_global_map( - sycl_target, domain->mesh, A->position_dat, A->cell_id_dat, - A->mpi_rank_dat); - auto lambda_advect = [&] { auto t0 = profile_timestamp(); particle_loop( @@ -139,7 +135,6 @@ TEST(ParticleGeometryInterface, Advection2D) { for (int stepx = 0; stepx < Nsteps; stepx++) { pbc.execute(); - mesh_hierarchy_global_map.execute(); A->hybrid_move(); cell_id_translation.execute(); A->cell_move(); @@ -175,6 +170,9 @@ TEST_P(ParticleAdvection3D, Advection3D) { auto session = resource_session.session; auto graph = SpatialDomains::MeshGraphIO::Read(session); + std::map> geoms_3d; + get_all_elements_3d(graph, geoms_3d); + auto mesh = std::make_shared(graph); extend_halos_fixed_offset(1, mesh); auto sycl_target = std::make_shared(0, mesh->get_comm()); @@ -248,10 +246,6 @@ TEST_P(ParticleAdvection3D, Advection3D) { } reset_mpi_ranks((*A)[Sym("NESO_MPI_RANK")]); - MeshHierarchyGlobalMap mesh_hierarchy_global_map( - sycl_target, domain->mesh, A->position_dat, A->cell_id_dat, - A->mpi_rank_dat); - auto lambda_advect = [&] { auto t0 = profile_timestamp(); particle_loop( @@ -266,8 +260,6 @@ TEST_P(ParticleAdvection3D, Advection3D) { sycl_target->profile_map.inc("Advect", "Execute", 1, profile_elapsed(t0, profile_timestamp())); }; - std::map> geoms_3d; - get_all_elements_3d(graph, geoms_3d); auto lambda_check_owning_cell = [&] { Array global_coord(3); @@ -310,14 +302,9 @@ TEST_P(ParticleAdvection3D, Advection3D) { } }; - // H5Part h5part("trajectory.h5part", A, Sym("P"), - // Sym("NESO_MPI_RANK"), - // Sym("NESO_REFERENCE_POSITIONS")); - REAL T = 0.0; for (int stepx = 0; stepx < Nsteps; stepx++) { pbc.execute(); - mesh_hierarchy_global_map.execute(); A->hybrid_move(); cell_id_translation.execute(); A->cell_move(); @@ -325,31 +312,27 @@ TEST_P(ParticleAdvection3D, Advection3D) { lambda_advect(); T += dt; - - // h5part.write(); } - // h5part.close(); mesh->free(); } INSTANTIATE_TEST_SUITE_P( MultipleMeshes, ParticleAdvection3D, - testing::Values( - std::tuple( - "reference_all_types_cube/conditions.xml", - "reference_all_types_cube/linear_non_regular_0.5.xml", - 1.0e-4 // The non-linear exit tolerance in Nektar is - // like (err_x * err_x - // + err_y * err_y) < 1.0e-8 - ), - std::tuple( - "reference_all_types_cube/conditions.xml", - "reference_all_types_cube/mixed_ref_cube_0.5.xml", 1.0e-10), - std::tuple( - "reference_all_types_cube/conditions.xml", - "reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml", - 1.0e-4 // The non-linear exit tolerance in Nektar is - // like (err_x * err_x - // + err_y * err_y) < 1.0e-8 - ))); + testing::Values(std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/linear_non_regular_0.5.xml", + 1.0e-4 // The non-linear exit tolerance in Nektar is + // like (err_x * err_x + // + err_y * err_y) < 1.0e-8 + ), + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/mixed_ref_cube_0.5.xml", + 1.0e-10), + std::tuple( + "reference_all_types_cube/conditions.xml", "foo.xml", + 1.0e-4 // The non-linear exit tolerance in Nektar is + // like (err_x * err_x + // + err_y * err_y) < 1.0e-8 + ))); diff --git a/test/test_resources/reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml b/test/test_resources/reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml deleted file mode 100644 index 8219335a..00000000 --- a/test/test_resources/reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml +++ /dev/null @@ -1,4771 +0,0 @@ - - - - - -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 - -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 - -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 - -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 - -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 - -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 - -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - -5.00000000e-01 1.37639899e-12 -1.00000000e+00 - -1.00000000e+00 2.75279799e-12 -1.00000000e+00 - -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 - -1.00000000e+00 2.75279799e-12 -8.00000000e-01 - -5.00312350e-01 3.13724879e-02 -5.99415152e-01 - -1.00000000e+00 2.75279799e-12 -6.00000000e-01 - -5.00000000e-01 5.00000000e-01 -1.00000000e+00 - -1.00000000e+00 5.00000000e-01 -1.00000000e+00 - -4.72256518e-01 4.55448912e-01 -8.33711630e-01 - -1.00000000e+00 5.00000000e-01 -8.00000000e-01 - -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - -1.00000000e+00 5.00000000e-01 -6.00000000e-01 - -5.00000000e-01 1.00000000e+00 -1.00000000e+00 - -1.00000000e+00 1.00000000e+00 -1.00000000e+00 - -5.00000000e-01 1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 1.00000000e+00 -8.00000000e-01 - -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 1.00000000e+00 -6.00000000e-01 - -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 - -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 - -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 - 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 - -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 - 0.00000000e+00 0.00000000e+00 -1.00000000e+00 - -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 - -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - 1.37639899e-12 5.00000000e-01 -1.00000000e+00 - 2.81216416e-02 5.47228351e-01 -7.57921741e-01 - 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - 2.75279799e-12 1.00000000e+00 -1.00000000e+00 - 2.75279799e-12 1.00000000e+00 -8.00000000e-01 - 2.75279799e-12 1.00000000e+00 -6.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 - 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 - 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 - 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 - 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 - 5.09344874e-01 3.09144506e-02 -8.04652537e-01 - 5.23944619e-01 1.85747848e-02 -5.96055755e-01 - 5.00000000e-01 5.00000000e-01 -1.00000000e+00 - 4.76425748e-01 5.49663539e-01 -7.93911671e-01 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 - 5.00000000e-01 1.00000000e+00 -1.00000000e+00 - 5.00000000e-01 1.00000000e+00 -8.00000000e-01 - 5.00000000e-01 1.00000000e+00 -6.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 - 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 - 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 - 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 - 1.00000000e+00 5.00000000e-01 -1.00000000e+00 - 1.00000000e+00 5.00000000e-01 -8.00000000e-01 - 1.00000000e+00 5.00000000e-01 -6.00000000e-01 - 1.00000000e+00 1.00000000e+00 -1.00000000e+00 - 1.00000000e+00 1.00000000e+00 -8.00000000e-01 - 1.00000000e+00 1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 - -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 - 5.00000000e-01 1.00000000e+00 -2.00000000e-01 - 1.00000000e+00 1.00000000e+00 -2.00000000e-01 - 1.00000000e+00 7.50000000e-01 -4.00000000e-01 - 7.50000000e-01 1.00000000e+00 -4.00000000e-01 - 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - -2.53076790e-01 7.99260743e-01 -4.64658113e-01 - 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 - 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 7.31572411e-01 2.07606548e-01 -4.59504821e-01 - -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 - 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 - -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -7.60981297e-01 2.83096054e-01 -4.53794791e-01 - -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - -2.69993006e-01 2.24633383e-01 -3.42712104e-01 - 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 - -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 - 2.75226154e-01 2.62309674e-01 -3.04722194e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 - -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -1.00000000e+00 1.00000000e+00 -2.00000000e-01 - -7.50000000e-01 1.00000000e+00 -4.00000000e-01 - -1.00000000e+00 7.50000000e-01 -4.00000000e-01 - -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 - -7.71303906e-01 7.42798488e-01 -4.51592940e-01 - 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 7.58754489e-01 7.58424515e-01 -4.31851638e-01 - 2.75279799e-12 1.00000000e+00 -2.00000000e-01 - -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - 1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 2.50000000e-01 -4.00000000e-01 - -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 - 2.50000000e-01 1.00000000e+00 -4.00000000e-01 - -1.00000000e+00 2.50000000e-01 -4.00000000e-01 - 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 - 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 - -2.50000000e-01 1.00000000e+00 -4.00000000e-01 - 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 - -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 - 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 - -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 - -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 - -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 - -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 - -1.00000000e+00 -1.00000000e+00 2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 - -1.00000000e+00 -5.00000000e-01 2.00000000e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 - -1.00000000e+00 2.75282575e-12 -5.31227839e-13 - -5.00266360e-01 -1.67846048e-02 4.37459152e-02 - -1.00000000e+00 2.75279799e-12 2.00000000e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 - -1.00000000e+00 5.00000000e-01 -5.31227839e-13 - -4.54327930e-01 4.86669001e-01 -4.97810569e-02 - -1.00000000e+00 5.00000000e-01 2.00000000e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 - -1.00000000e+00 1.00000000e+00 -5.31241717e-13 - -5.00000000e-01 1.00000000e+00 -5.31241717e-13 - -1.00000000e+00 1.00000000e+00 2.00000000e-01 - -5.00000000e-01 1.00000000e+00 2.00000000e-01 - -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 - -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 - -1.34542997e-02 5.28119076e-03 -4.78164736e-02 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 - -2.11337044e-02 5.20175598e-01 1.44520351e-02 - -5.74150632e-03 4.80713344e-01 2.07813459e-01 - 2.75282575e-12 1.00000000e+00 -5.31227839e-13 - 2.75279799e-12 1.00000000e+00 2.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 - 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - 5.00000000e-01 -1.00000000e+00 2.00000000e-01 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 - 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 - 4.74690996e-01 4.58616508e-01 1.67721786e-02 - 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 5.00000000e-01 1.00000000e+00 -5.31227839e-13 - 5.00000000e-01 1.00000000e+00 2.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 - 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 - 1.00000000e+00 -1.00000000e+00 2.00000000e-01 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 - 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 - 1.00000000e+00 5.00000000e-01 -5.31241717e-13 - 1.00000000e+00 5.00000000e-01 2.00000000e-01 - 1.00000000e+00 1.00000000e+00 -5.31241717e-13 - 1.00000000e+00 1.00000000e+00 2.00000000e-01 - -7.50000000e-01 -1.00000000e+00 4.00000000e-01 - -1.00000000e+00 -7.50000000e-01 4.00000000e-01 - 1.00000000e+00 7.50000000e-01 4.00000000e-01 - 7.50000000e-01 1.00000000e+00 4.00000000e-01 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 - -1.11217671e-02 4.85990029e-01 5.72847359e-01 - -2.53733289e-01 7.78555773e-01 5.11047110e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 - 2.50599317e-01 -7.83894535e-01 5.11804036e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 - 7.04885116e-01 2.42741400e-01 4.57337152e-01 - -4.54143370e-01 -4.71697648e-01 6.06228169e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 - -7.69033054e-01 -2.83268701e-01 5.03354564e-01 - -7.63437341e-01 2.29532918e-01 4.45102704e-01 - -2.95099817e-01 -7.31729472e-01 4.69924715e-01 - 7.73208263e-01 -2.59692901e-01 4.77175444e-01 - 2.31960145e-01 7.26079517e-01 4.47497104e-01 - -2.58094392e-01 2.82537068e-01 3.64273615e-01 - 2.25942245e-01 -2.63270065e-01 3.92407990e-01 - -2.32508956e-01 -2.34291873e-01 3.74551790e-01 - 2.70125392e-01 2.53421154e-01 3.09013047e-01 - -4.84577644e-02 4.06855736e-02 5.60664410e-01 - 7.50000000e-01 -1.00000000e+00 4.00000000e-01 - 1.00000000e+00 -7.50000000e-01 4.00000000e-01 - 1.00000000e+00 -5.00000000e-01 6.00000000e-01 - 7.89872088e-01 -7.06620648e-01 4.93373476e-01 - -1.00000000e+00 5.00000000e-01 6.00000000e-01 - -7.42991857e-01 7.43456068e-01 4.63979586e-01 - 5.00000000e-01 1.00000000e+00 6.00000000e-01 - 7.30868887e-01 7.76702907e-01 5.01983983e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 - -7.43450159e-01 -7.74711926e-01 4.35008075e-01 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 - -2.75279799e-12 -1.00000000e+00 6.00000000e-01 - 1.00000000e+00 -2.75279799e-12 6.00000000e-01 - -1.00000000e+00 2.75279799e-12 6.00000000e-01 - -5.00000000e-01 1.00000000e+00 6.00000000e-01 - 5.00000000e-01 -1.00000000e+00 6.00000000e-01 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 - -1.00000000e+00 -5.00000000e-01 6.00000000e-01 - 1.00000000e+00 -2.50000000e-01 4.00000000e-01 - -2.50000000e-01 -1.00000000e+00 4.00000000e-01 - -1.00000000e+00 2.50000000e-01 4.00000000e-01 - 2.50000000e-01 -1.00000000e+00 4.00000000e-01 - -2.50000000e-01 1.00000000e+00 4.00000000e-01 - -1.00000000e+00 7.50000000e-01 4.00000000e-01 - -1.00000000e+00 -2.50000000e-01 4.00000000e-01 - 1.00000000e+00 2.50000000e-01 4.00000000e-01 - -7.50000000e-01 1.00000000e+00 4.00000000e-01 - 2.50000000e-01 1.00000000e+00 4.00000000e-01 - -1.00000000e+00 -1.00000000e+00 6.00000000e-01 - 1.00000000e+00 1.00000000e+00 6.00000000e-01 - 1.00000000e+00 -1.00000000e+00 6.00000000e-01 - -1.00000000e+00 1.00000000e+00 6.00000000e-01 - -1.00000000e+00 -1.00000000e+00 8.00000000e-01 - -5.00000000e-01 -1.00000000e+00 8.00000000e-01 - -5.18510442e-01 -4.61975434e-01 7.65918784e-01 - -1.00000000e+00 -5.00000000e-01 8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 1.00000000e+00 - -5.00000000e-01 -5.00000000e-01 1.00000000e+00 - -1.00000000e+00 -5.00000000e-01 1.00000000e+00 - -4.96184639e-01 -3.41758945e-02 7.94093507e-01 - -1.00000000e+00 2.75282575e-12 8.00000000e-01 - -5.00000000e-01 1.37639899e-12 1.00000000e+00 - -1.00000000e+00 2.75279799e-12 1.00000000e+00 - -4.90548406e-01 5.30132674e-01 8.30068751e-01 - -1.00000000e+00 5.00000000e-01 8.00000000e-01 - -5.00000000e-01 5.00000000e-01 1.00000000e+00 - -1.00000000e+00 5.00000000e-01 1.00000000e+00 - -5.00000000e-01 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 1.00000000e+00 8.00000000e-01 - -5.00000000e-01 1.00000000e+00 1.00000000e+00 - -1.00000000e+00 1.00000000e+00 1.00000000e+00 - -2.75282575e-12 -1.00000000e+00 8.00000000e-01 - 4.47838296e-02 -5.46141782e-01 8.07112459e-01 - -2.75279799e-12 -1.00000000e+00 1.00000000e+00 - -1.37639899e-12 -5.00000000e-01 1.00000000e+00 - -3.53396575e-02 -3.65929367e-02 8.03489850e-01 - 0.00000000e+00 0.00000000e+00 1.00000000e+00 - 4.04523035e-02 5.23334239e-01 7.85315811e-01 - 1.37639899e-12 5.00000000e-01 1.00000000e+00 - 2.75282575e-12 1.00000000e+00 8.00000000e-01 - 2.75279799e-12 1.00000000e+00 1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 8.00000000e-01 - 5.12293954e-01 -5.47020830e-01 8.46585454e-01 - 5.00000000e-01 -1.00000000e+00 1.00000000e+00 - 5.00000000e-01 -5.00000000e-01 1.00000000e+00 - 5.08559128e-01 4.68350764e-02 8.47523900e-01 - 5.00000000e-01 -1.37645451e-12 1.00000000e+00 - 5.36295327e-01 5.28286707e-01 7.83714183e-01 - 5.00000000e-01 5.00000000e-01 1.00000000e+00 - 5.00000000e-01 1.00000000e+00 8.00000000e-01 - 5.00000000e-01 1.00000000e+00 1.00000000e+00 - 1.00000000e+00 -1.00000000e+00 8.00000000e-01 - 1.00000000e+00 -5.00000000e-01 8.00000000e-01 - 1.00000000e+00 -1.00000000e+00 1.00000000e+00 - 1.00000000e+00 -5.00000000e-01 1.00000000e+00 - 1.00000000e+00 -2.75282575e-12 8.00000000e-01 - 1.00000000e+00 -2.75279799e-12 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 8.00000000e-01 - 1.00000000e+00 5.00000000e-01 1.00000000e+00 - 1.00000000e+00 1.00000000e+00 8.00000000e-01 - 1.00000000e+00 1.00000000e+00 1.00000000e+00 - - - 0 1 - 1 2 - 2 3 - 3 0 - 0 4 - 1 5 - 2 6 - 3 7 - 4 5 - 5 6 - 6 7 - 7 4 - 4 8 - 5 9 - 6 10 - 7 11 - 8 9 - 9 10 - 10 11 - 11 8 - 2 12 - 12 13 - 13 3 - 12 14 - 13 15 - 6 14 - 14 15 - 15 7 - 14 16 - 15 17 - 10 16 - 16 17 - 17 11 - 12 18 - 18 19 - 19 13 - 18 20 - 19 21 - 14 20 - 20 21 - 21 15 - 20 22 - 21 23 - 16 22 - 22 23 - 23 17 - 18 24 - 24 25 - 25 19 - 24 26 - 25 27 - 20 26 - 26 27 - 27 21 - 26 28 - 27 29 - 22 28 - 28 29 - 29 23 - 1 30 - 30 31 - 31 2 - 30 32 - 31 33 - 5 32 - 32 33 - 33 6 - 32 34 - 33 35 - 9 34 - 34 35 - 35 10 - 31 36 - 36 12 - 36 37 - 33 37 - 37 14 - 37 38 - 35 38 - 38 16 - 36 39 - 39 18 - 39 40 - 37 40 - 40 20 - 40 41 - 38 41 - 41 22 - 39 42 - 42 24 - 42 43 - 40 43 - 43 26 - 43 44 - 41 44 - 44 28 - 30 45 - 45 46 - 46 31 - 45 47 - 46 48 - 32 47 - 47 48 - 48 33 - 47 49 - 48 50 - 34 49 - 49 50 - 50 35 - 46 51 - 51 36 - 51 52 - 48 52 - 52 37 - 52 53 - 50 53 - 53 38 - 51 54 - 54 39 - 54 55 - 52 55 - 55 40 - 55 56 - 53 56 - 56 41 - 54 57 - 57 42 - 57 58 - 55 58 - 58 43 - 58 59 - 56 59 - 59 44 - 45 60 - 60 61 - 61 46 - 60 62 - 61 63 - 47 62 - 62 63 - 63 48 - 62 64 - 63 65 - 49 64 - 64 65 - 65 50 - 61 66 - 66 51 - 66 67 - 63 67 - 67 52 - 67 68 - 65 68 - 68 53 - 66 69 - 69 54 - 69 70 - 67 70 - 70 55 - 70 71 - 68 71 - 71 56 - 69 72 - 72 57 - 72 73 - 70 73 - 73 58 - 73 74 - 71 74 - 74 59 - 76 75 - 76 77 - 75 77 - 78 75 - 78 76 - 78 77 - 80 79 - 80 81 - 79 81 - 79 82 - 80 82 - 82 81 - 22 83 - 83 41 - 84 41 - 22 84 - 84 83 - 50 85 - 35 85 - 35 86 - 50 86 - 85 86 - 56 87 - 53 87 - 53 88 - 56 88 - 87 88 - 10 89 - 16 89 - 16 90 - 10 90 - 89 90 - 53 85 - 50 91 - 53 91 - 85 91 - 16 92 - 22 92 - 93 22 - 93 16 - 93 92 - 35 94 - 10 94 - 95 10 - 95 35 - 95 94 - 41 96 - 56 96 - 56 97 - 41 97 - 96 97 - 98 22 - 98 41 - 83 98 - 50 99 - 35 99 - 85 99 - 10 100 - 16 100 - 89 100 - 56 101 - 53 101 - 87 101 - 102 16 - 102 38 - 98 38 - 16 98 - 102 98 - 102 53 - 101 38 - 101 102 - 100 38 - 102 100 - 35 102 - 35 100 - 38 99 - 99 53 - 102 99 - 38 83 - 41 101 - 83 101 - 98 92 - 100 94 - 96 101 - 104 103 - 105 104 - 105 103 - 106 103 - 104 106 - 105 106 - 9 76 - 10 76 - 9 107 - 76 107 - 10 107 - 92 23 - 108 22 - 23 108 - 92 108 - 65 109 - 50 109 - 65 110 - 109 110 - 50 110 - 76 95 - 9 95 - 23 93 - 109 91 - 65 91 - 59 96 - 56 111 - 59 111 - 96 111 - 59 97 - 44 112 - 41 112 - 112 84 - 44 84 - 113 34 - 35 113 - 113 86 - 34 86 - 44 97 - 112 97 - 95 34 - 113 95 - 87 68 - 88 68 - 17 89 - 17 90 - 93 17 - 93 89 - 68 91 - 91 87 - 28 114 - 22 114 - 108 114 - 108 28 - 49 115 - 50 115 - 115 110 - 49 110 - 28 84 - 84 114 - 86 49 - 86 115 - 11 94 - 11 107 - 94 107 - 71 96 - 71 111 - 71 88 - 96 88 - 11 90 - 94 90 - 116 80 - 79 116 - 116 81 - 117 75 - 117 76 - 117 78 - 96 87 - 96 118 - 118 87 - 88 118 - 76 119 - 9 119 - 119 95 - 59 79 - 120 79 - 120 59 - 79 97 - 120 97 - 23 103 - 121 103 - 23 121 - 93 103 - 121 93 - 122 109 - 122 65 - 122 91 - 77 9 - 77 107 - 82 59 - 79 111 - 82 111 - 123 113 - 123 34 - 123 86 - 124 112 - 124 44 - 84 124 - 106 23 - 108 103 - 106 108 - 65 125 - 109 125 - 125 110 - 17 126 - 127 126 - 127 17 - 90 126 - 127 90 - 105 114 - 105 28 - 105 108 - 128 115 - 128 49 - 128 110 - 116 71 - 81 71 - 111 116 - 111 81 - 117 11 - 78 11 - 107 117 - 107 78 - 119 34 - 119 113 - 44 120 - 120 112 - 124 28 - 124 114 - 123 49 - 123 115 - 11 127 - 127 117 - 117 90 - 121 17 - 121 126 - 93 126 - 78 8 - 107 8 - 29 105 - 108 29 - 128 64 - 64 110 - 74 81 - 111 74 - 118 68 - 71 118 - 29 106 - 64 125 - 8 77 - 82 74 - 68 122 - 109 85 - 85 110 - 129 35 - 85 129 - 129 86 - 92 83 - 84 92 - 76 94 - 112 83 - 113 129 - 89 94 - 95 129 - 83 97 - 114 92 - 115 85 - 85 87 - 89 92 - 129 94 - 96 83 - 129 99 - 102 129 - 100 129 - 102 87 - 99 87 - 102 89 - 98 89 - 102 83 - 105 92 - 128 85 - 130 87 - 130 96 - 130 118 - 130 116 - 96 116 - 118 116 - 131 115 - 85 131 - 131 128 - 104 114 - 104 92 - 92 103 - 109 130 - 87 109 - 122 130 - 87 122 - 92 102 - 85 102 - 83 87 - 89 129 - 96 79 - 89 126 - 117 94 - 125 128 - 75 8 - 74 80 - 29 104 - 131 64 - 131 125 - 109 128 - 131 109 - 103 89 - 94 113 - 112 96 - 76 113 - 79 112 - 126 94 - 68 130 - 83 114 - 115 129 - 126 103 - 117 126 - 112 114 - 113 115 - 132 133 - 133 76 - 132 75 - 132 134 - 133 134 - 134 117 - 135 134 - 135 133 - 135 94 - 136 137 - 137 133 - 136 132 - 136 138 - 137 138 - 138 134 - 139 138 - 139 137 - 139 135 - 134 140 - 140 126 - 135 140 - 141 140 - 141 135 - 141 89 - 138 142 - 142 140 - 139 142 - 143 142 - 143 139 - 143 141 - 140 144 - 144 103 - 141 144 - 145 144 - 145 141 - 145 92 - 142 146 - 146 144 - 143 146 - 147 146 - 147 143 - 147 145 - 144 148 - 148 104 - 145 148 - 149 148 - 149 114 - 149 145 - 146 150 - 150 148 - 147 150 - 151 150 - 151 149 - 151 147 - 133 152 - 152 113 - 152 135 - 153 135 - 153 152 - 153 129 - 137 154 - 154 152 - 154 139 - 155 139 - 155 154 - 155 153 - 153 141 - 156 141 - 156 153 - 156 102 - 155 143 - 157 143 - 157 155 - 157 156 - 156 145 - 158 145 - 158 156 - 158 83 - 157 147 - 159 147 - 159 157 - 159 158 - 158 149 - 160 149 - 160 112 - 160 158 - 159 151 - 161 151 - 161 160 - 161 159 - 152 162 - 162 115 - 162 153 - 163 153 - 163 162 - 163 85 - 154 164 - 164 162 - 164 155 - 165 155 - 165 164 - 165 163 - 163 156 - 166 156 - 166 163 - 166 87 - 165 157 - 167 157 - 167 165 - 167 166 - 166 158 - 168 158 - 168 166 - 168 96 - 167 159 - 169 159 - 169 167 - 169 168 - 168 160 - 170 160 - 170 79 - 170 168 - 169 161 - 171 161 - 171 170 - 171 169 - 162 172 - 172 131 - 172 163 - 173 172 - 173 109 - 173 163 - 164 174 - 174 172 - 174 165 - 175 174 - 175 173 - 175 165 - 173 166 - 176 173 - 176 130 - 176 166 - 175 167 - 177 175 - 177 176 - 177 167 - 176 168 - 178 176 - 178 116 - 178 168 - 177 169 - 179 177 - 179 178 - 179 169 - 178 170 - 180 178 - 180 80 - 180 170 - 179 171 - 181 179 - 181 180 - 181 171 - 182 136 - 137 182 - 183 137 - 183 136 - 183 182 - 184 171 - 181 184 - 185 181 - 185 171 - 185 184 - 147 186 - 186 187 - 147 187 - 147 188 - 188 186 - 188 187 - 189 165 - 190 165 - 189 190 - 189 191 - 191 165 - 190 191 - 192 167 - 193 167 - 193 192 - 192 194 - 167 194 - 193 194 - 143 195 - 196 195 - 143 196 - 197 143 - 197 195 - 197 196 - 196 147 - 196 186 - 147 198 - 196 198 - 186 198 - 155 195 - 189 155 - 189 195 - 199 195 - 155 199 - 189 199 - 190 167 - 192 190 - 190 200 - 167 200 - 192 200 - 187 169 - 193 187 - 193 169 - 201 169 - 201 187 - 201 193 - 202 186 - 202 147 - 202 187 - 165 203 - 189 203 - 190 203 - 195 204 - 143 204 - 196 204 - 167 205 - 192 205 - 193 205 - 196 157 - 196 206 - 206 157 - 202 157 - 196 202 - 202 206 - 204 157 - 204 206 - 189 157 - 206 189 - 189 204 - 192 157 - 192 206 - 206 203 - 157 203 - 192 203 - 206 187 - 157 187 - 205 206 - 205 157 - 205 187 - 155 204 - 167 203 - 205 169 - 175 207 - 174 207 - 208 174 - 208 175 - 208 207 - 209 165 - 209 190 - 165 210 - 209 210 - 190 210 - 146 211 - 186 211 - 186 146 - 212 146 - 212 211 - 186 212 - 209 200 - 165 200 - 198 211 - 198 146 - 213 169 - 193 213 - 214 169 - 214 213 - 214 193 - 215 139 - 195 215 - 195 139 - 216 139 - 215 216 - 195 216 - 215 199 - 139 199 - 213 201 - 217 161 - 187 161 - 217 187 - 217 188 - 188 161 - 218 154 - 189 154 - 189 218 - 218 191 - 154 191 - 201 161 - 217 201 - 199 154 - 199 218 - 219 167 - 192 219 - 219 194 - 220 143 - 196 220 - 220 197 - 143 198 - 220 198 - 219 200 - 221 151 - 151 186 - 221 186 - 221 212 - 212 151 - 222 164 - 190 164 - 190 222 - 222 210 - 164 210 - 191 164 - 222 191 - 188 151 - 188 221 - 223 169 - 223 193 - 214 223 - 224 139 - 224 195 - 224 216 - 194 169 - 223 194 - 139 197 - 197 224 - 138 183 - 179 184 - 165 225 - 167 225 - 200 225 - 215 137 - 215 226 - 226 137 - 137 199 - 226 199 - 227 211 - 227 146 - 227 198 - 213 171 - 185 213 - 214 171 - 185 214 - 182 215 - 137 216 - 216 182 - 218 228 - 154 228 - 191 228 - 229 217 - 229 161 - 188 229 - 230 146 - 230 211 - 212 230 - 175 209 - 208 209 - 210 175 - 210 208 - 142 220 - 231 220 - 231 142 - 142 197 - 231 197 - 177 219 - 219 232 - 177 232 - 177 194 - 232 194 - 233 221 - 151 233 - 233 212 - 207 222 - 207 164 - 207 210 - 223 179 - 223 184 - 214 179 - 214 184 - 154 226 - 226 218 - 234 161 - 217 234 - 201 234 - 229 151 - 229 221 - 228 164 - 222 228 - 232 179 - 223 232 - 194 179 - 235 224 - 235 183 - 224 183 - 216 235 - 216 183 - 236 223 - 236 184 - 214 236 - 222 237 - 207 237 - 237 210 - 238 221 - 233 238 - 212 238 - 220 224 - 231 224 - 218 222 - 219 223 - 221 217 - 235 215 - 182 235 - 238 211 - 238 230 - 237 209 - 237 208 - 213 236 - 236 185 - 209 219 - 225 219 - 225 209 - 217 213 - 234 213 - 215 218 - 211 220 - 227 220 - 147 212 - 187 159 - 188 159 - 191 155 - 201 159 - 203 155 - 202 159 - 139 204 - 205 159 - 143 202 - 147 233 - 207 165 - 231 138 - 139 231 - 175 225 - 150 233 - 139 183 - 225 177 - 227 142 - 143 227 - 171 234 - 234 169 - 230 233 - 136 235 - 236 181 - 174 237 - 238 150 - 150 230 - 146 233 - 224 138 - 235 239 - 215 240 - 195 241 - 224 242 - 239 240 - 240 241 - 241 242 - 242 239 - 239 243 - 240 244 - 241 245 - 242 246 - 243 244 - 244 245 - 245 246 - 246 243 - 196 247 - 220 248 - 241 247 - 247 248 - 248 242 - 247 249 - 248 250 - 245 249 - 249 250 - 250 246 - 186 251 - 211 252 - 247 251 - 251 252 - 252 248 - 251 253 - 252 254 - 249 253 - 253 254 - 254 250 - 221 255 - 238 256 - 251 255 - 255 256 - 256 252 - 255 257 - 256 258 - 253 257 - 257 258 - 258 254 - 218 259 - 189 260 - 240 259 - 259 260 - 260 241 - 259 261 - 260 262 - 244 261 - 261 262 - 262 245 - 206 263 - 260 263 - 263 247 - 263 264 - 262 264 - 264 249 - 187 265 - 263 265 - 265 251 - 265 266 - 264 266 - 266 253 - 217 267 - 265 267 - 267 255 - 267 268 - 266 268 - 268 257 - 222 269 - 190 270 - 259 269 - 269 270 - 270 260 - 269 271 - 270 272 - 261 271 - 271 272 - 272 262 - 192 273 - 270 273 - 273 263 - 273 274 - 272 274 - 274 264 - 193 275 - 273 275 - 275 265 - 275 276 - 274 276 - 276 266 - 213 277 - 275 277 - 277 267 - 277 278 - 276 278 - 278 268 - 237 279 - 209 280 - 269 279 - 279 280 - 280 270 - 279 281 - 280 282 - 271 281 - 281 282 - 282 272 - 219 283 - 280 283 - 283 273 - 283 284 - 282 284 - 284 274 - 223 285 - 283 285 - 285 275 - 285 286 - 284 286 - 286 276 - 236 287 - 285 287 - 287 277 - 287 288 - 286 288 - 288 278 - - - 170 171 172 - 170 174 173 - 171 175 174 - 172 175 173 - 176 177 178 - 176 180 179 - 177 181 180 - 178 181 179 - 87 182 183 - 87 185 184 - 182 186 185 - 183 186 184 - 108 187 188 - 108 190 189 - 187 191 190 - 188 191 189 - 123 192 193 - 123 195 194 - 192 196 195 - 193 196 194 - 30 197 198 - 30 200 199 - 197 201 200 - 198 201 199 - 115 202 187 - 115 204 203 - 202 205 204 - 187 205 203 - 43 206 207 - 43 209 208 - 206 210 209 - 207 210 208 - 71 211 212 - 71 214 213 - 211 215 214 - 212 215 213 - 124 216 217 - 124 219 218 - 216 220 219 - 217 220 218 - 87 222 221 - 183 223 222 - 182 223 221 - 108 225 224 - 188 226 225 - 187 226 224 - 30 228 227 - 198 229 228 - 197 229 227 - 123 231 230 - 193 232 231 - 192 232 230 - 79 233 234 - 79 236 235 - 233 237 236 - 234 237 235 - 116 234 238 - 116 239 231 - 234 240 239 - 238 240 231 - 79 241 228 - 234 242 241 - 233 242 228 - 78 243 234 - 78 244 241 - 243 242 244 - 116 246 245 - 238 247 246 - 234 247 245 - 86 183 248 - 86 249 239 - 183 250 249 - 248 250 239 - 86 235 222 - 248 223 235 - 78 245 225 - 243 247 225 - 43 221 236 - 207 251 221 - 206 251 236 - 115 224 246 - 202 226 246 - 71 227 244 - 212 252 227 - 211 252 244 - 124 230 249 - 217 253 230 - 216 253 249 - 254 255 256 - 254 258 257 - 255 259 258 - 256 259 257 - 260 261 17 - 260 263 262 - 261 264 263 - 17 264 262 - 44 265 207 - 44 267 266 - 265 268 267 - 207 268 266 - 269 270 145 - 269 272 271 - 270 273 272 - 145 273 271 - 260 275 274 - 17 213 275 - 261 213 274 - 44 208 276 - 265 210 276 - 269 278 277 - 145 203 278 - 270 203 277 - 131 279 217 - 131 281 280 - 279 282 281 - 217 282 280 - 131 218 283 - 279 220 283 - 284 94 285 - 284 287 286 - 94 184 287 - 285 184 286 - 288 70 289 - 288 291 290 - 70 189 291 - 289 189 290 - 284 293 292 - 285 219 293 - 94 219 292 - 288 295 294 - 289 214 295 - 70 214 294 - 153 193 296 - 153 194 297 - 296 196 297 - 31 198 298 - 31 199 299 - 298 201 299 - 31 300 209 - 298 301 300 - 198 301 209 - 153 302 204 - 296 303 302 - 193 303 204 - 304 56 305 - 304 307 306 - 56 266 307 - 305 266 306 - 308 107 309 - 308 311 310 - 107 273 311 - 309 273 310 - 304 313 312 - 305 185 313 - 56 185 312 - 308 315 314 - 309 190 315 - 107 190 314 - 18 212 316 - 18 264 317 - 212 318 264 - 316 318 317 - 161 217 319 - 161 280 320 - 319 282 320 - 161 321 195 - 319 322 321 - 217 322 195 - 18 323 200 - 316 324 323 - 212 324 200 - 325 326 176 - 325 327 177 - 326 178 327 - 170 328 329 - 328 330 173 - 329 330 174 - 331 332 333 - 331 322 196 - 332 334 322 - 333 334 196 - 260 335 336 - 335 337 274 - 336 337 275 - 338 339 340 - 338 341 283 - 339 342 341 - 340 342 283 - 343 344 345 - 343 346 276 - 344 347 346 - 345 347 276 - 269 348 349 - 348 350 277 - 349 350 278 - 260 351 171 - 351 352 262 - 171 352 263 - 338 353 179 - 338 281 354 - 353 355 281 - 179 355 354 - 288 356 357 - 356 358 290 - 357 358 291 - 284 359 360 - 359 361 286 - 360 361 287 - 343 362 257 - 343 267 363 - 362 364 267 - 257 364 363 - 269 365 366 - 365 367 271 - 366 367 272 - 368 369 370 - 368 371 299 - 369 372 371 - 370 372 299 - 304 373 374 - 373 375 306 - 374 375 307 - 308 376 377 - 376 378 310 - 377 378 311 - 379 327 380 - 379 381 320 - 327 382 381 - 380 382 320 - 383 330 384 - 383 385 317 - 330 386 385 - 384 386 317 - 288 387 388 - 387 337 294 - 388 337 295 - 284 389 390 - 389 342 292 - 390 342 293 - 304 391 392 - 391 361 312 - 392 361 313 - 308 393 394 - 393 358 314 - 394 358 315 - 383 395 396 - 383 323 397 - 395 372 323 - 396 372 397 - 368 398 399 - 368 300 400 - 398 347 300 - 399 347 400 - 19 384 401 - 19 317 402 - 401 386 402 - 57 374 403 - 57 307 404 - 403 375 404 - 143 377 405 - 143 311 406 - 405 378 406 - 168 380 407 - 168 320 408 - 407 382 408 - 95 360 391 - 95 287 312 - 160 409 410 - 160 297 321 - 409 334 297 - 410 334 321 - 32 370 395 - 32 299 323 - 106 357 393 - 106 291 314 - 58 411 362 - 58 404 267 - 411 364 404 - 144 412 365 - 144 406 271 - 412 367 406 - 16 413 351 - 16 402 262 - 413 352 402 - 169 414 353 - 169 408 281 - 414 355 408 - 152 349 415 - 152 278 302 - 415 350 302 - 69 336 387 - 69 275 294 - 45 345 398 - 45 276 300 - 132 340 389 - 132 283 292 - 270 416 187 - 416 417 272 - 187 417 273 - 418 188 419 - 418 189 420 - 419 191 420 - 207 421 182 - 207 422 185 - 421 186 422 - 416 205 277 - 261 423 212 - 423 318 263 - 285 183 424 - 424 186 286 - 289 418 425 - 425 420 290 - 192 217 331 - 212 426 197 - 426 201 324 - 425 427 295 - 418 427 214 - 424 428 293 - 183 428 219 - 423 215 274 - 305 207 429 - 429 268 306 - 309 187 430 - 430 417 310 - 429 422 313 - 430 191 315 - 202 193 431 - 431 303 205 - 198 432 206 - 432 210 301 - 211 418 433 - 433 427 215 - 183 434 216 - 434 220 428 - 418 435 225 - 419 226 435 - 421 223 251 - 426 229 252 - 331 253 232 - 418 436 243 - 418 437 244 - 436 242 437 - 436 247 435 - 238 193 438 - 193 439 246 - 438 439 247 - 438 232 240 - 198 440 233 - 198 441 236 - 440 237 441 - 440 242 229 - 234 442 248 - 442 223 237 - 442 250 240 - 431 439 226 - 432 251 441 - 433 437 252 - 434 253 250 - 429 443 373 - 443 375 268 - 430 444 376 - 444 378 417 - 445 331 446 - 445 333 447 - 446 332 447 - 448 446 449 - 448 447 450 - 449 332 450 - 451 430 452 - 451 376 453 - 452 444 453 - 454 429 455 - 454 373 255 - 455 443 255 - 254 455 456 - 456 443 256 - 457 458 445 - 457 348 459 - 458 460 348 - 445 460 459 - 461 421 442 - 461 251 237 - 436 462 419 - 462 226 247 - 442 463 438 - 463 232 250 - 464 440 436 - 464 229 437 - 462 438 431 - 432 461 440 - 426 464 433 - 463 434 331 - 343 456 265 - 456 268 363 - 456 210 346 - 338 465 279 - 465 282 354 - 465 220 341 - 368 298 466 - 466 201 371 - 466 301 400 - 383 316 467 - 467 318 385 - 379 319 449 - 449 282 381 - 467 324 397 - 405 468 412 - 468 367 378 - 413 401 175 - 175 386 352 - 403 259 411 - 259 364 375 - 407 181 414 - 181 355 382 - 469 172 413 - 469 173 401 - 470 407 177 - 470 414 180 - 471 403 255 - 471 411 258 - 472 405 453 - 472 412 473 - 453 468 473 - 256 375 363 - 178 354 382 - 174 386 263 - 474 366 468 - 474 272 378 - 416 474 444 - 475 453 474 - 475 473 366 - 475 452 416 - 476 456 432 - 476 346 301 - 458 303 277 - 460 350 303 - 416 431 458 - 477 433 425 - 477 215 295 - 424 478 434 - 478 220 293 - 479 388 335 - 479 295 274 - 479 423 477 - 480 390 339 - 480 293 341 - 480 465 478 - 481 466 426 - 481 371 324 - 482 296 445 - 482 409 447 - 296 333 409 - 429 483 421 - 483 186 313 - 484 419 430 - 484 420 315 - 485 399 344 - 485 400 346 - 485 476 466 - 296 415 460 - 482 459 415 - 329 263 385 - 329 467 423 - 326 449 465 - 326 381 354 - 379 450 410 - 319 332 410 - 486 481 467 - 486 371 397 - 486 396 369 - 487 424 483 - 487 286 313 - 487 392 359 - 488 394 356 - 488 315 290 - 488 425 484 - 489 493 492 - 493 496 495 - 498 502 501 - 502 505 504 - 507 495 509 - 509 511 510 - 513 504 515 - 515 517 516 - 519 510 521 - 521 523 522 - 525 516 527 - 527 529 528 - 531 522 533 - 534 533 536 - 537 528 539 - 540 539 542 - 543 545 496 - 545 547 546 - 549 551 505 - 551 553 552 - 511 546 555 - 555 557 556 - 517 552 559 - 559 561 560 - 523 556 563 - 563 565 564 - 529 560 567 - 567 569 568 - 536 564 571 - 572 571 574 - 542 568 575 - 576 575 578 - 579 581 547 - 581 583 582 - 585 587 553 - 587 589 588 - 557 582 591 - 591 593 592 - 561 588 595 - 595 597 596 - 565 592 599 - 599 601 600 - 569 596 603 - 603 605 604 - 574 600 607 - 608 607 610 - 578 604 611 - 612 611 614 - 615 617 583 - 618 620 617 - 621 623 589 - 624 626 623 - 620 627 593 - 628 630 627 - 626 631 597 - 632 634 631 - 630 635 601 - 636 638 635 - 634 639 605 - 640 642 639 - 643 610 638 - 644 646 643 - 647 614 642 - 648 650 647 - 498 651 652 - 498 654 653 - 651 655 654 - 652 655 653 - 650 656 657 - 650 659 658 - 656 660 659 - 657 660 658 - 661 662 663 - 661 665 664 - 662 666 665 - 663 666 664 - 667 668 669 - 667 671 670 - 668 672 671 - 669 672 670 - 673 674 675 - 673 677 676 - 674 678 677 - 675 678 676 - 679 680 681 - 679 683 682 - 680 684 683 - 681 684 682 - 685 686 661 - 685 688 687 - 686 689 688 - 661 689 687 - 690 691 692 - 690 694 693 - 691 695 694 - 692 695 693 - 696 673 697 - 696 699 698 - 673 700 699 - 697 700 698 - 701 702 703 - 701 705 704 - 702 706 705 - 703 706 704 - 661 708 707 - 663 709 708 - 662 709 707 - 667 711 710 - 669 712 711 - 668 712 710 - 679 714 713 - 681 715 714 - 680 715 713 - 673 717 716 - 675 718 717 - 674 718 716 - 719 720 721 - 719 723 722 - 720 724 723 - 721 724 722 - 719 725 715 - 721 726 725 - 720 726 715 - 727 728 721 - 727 729 725 - 728 726 729 - 721 730 731 - 721 733 732 - 730 734 733 - 731 734 732 - 721 735 736 - 735 709 724 - 736 709 722 - 721 738 737 - 736 739 738 - 735 739 737 - 731 717 737 - 730 717 738 - 727 733 711 - 728 732 711 - 685 708 723 - 686 707 723 - 690 713 740 - 692 729 713 - 691 729 740 - 696 712 741 - 697 734 712 - 673 734 741 - 701 742 739 - 703 718 742 - 702 718 739 - 624 743 744 - 624 746 745 - 743 747 746 - 744 747 745 - 748 749 668 - 748 751 750 - 749 752 751 - 668 752 750 - 753 754 755 - 753 757 756 - 754 758 757 - 755 758 756 - 748 760 759 - 668 698 760 - 749 698 759 - 753 762 761 - 755 689 762 - 754 689 761 - 763 764 703 - 763 766 765 - 764 767 766 - 703 767 765 - 768 769 770 - 768 772 771 - 769 773 772 - 770 773 771 - 768 775 774 - 770 693 775 - 769 693 774 - 763 704 776 - 764 706 776 - 777 778 779 - 777 781 780 - 778 666 781 - 779 666 780 - 782 783 784 - 782 786 785 - 783 670 786 - 784 670 785 - 777 788 787 - 779 705 788 - 778 705 787 - 782 790 789 - 784 695 790 - 783 695 789 - 791 673 792 - 791 677 793 - 792 676 793 - 794 681 795 - 794 682 796 - 795 684 796 - 794 798 797 - 795 688 798 - 681 688 797 - 791 799 699 - 792 700 799 - 800 801 802 - 800 804 803 - 801 758 804 - 802 758 803 - 805 806 807 - 805 809 808 - 806 752 809 - 807 752 808 - 805 811 810 - 807 672 811 - 806 672 810 - 800 813 812 - 802 665 813 - 801 665 812 - 814 703 815 - 814 765 816 - 815 767 816 - 817 770 818 - 817 771 819 - 818 773 819 - 814 821 820 - 815 678 821 - 703 678 820 - 817 823 822 - 818 683 823 - 770 683 822 - 502 824 653 - 501 824 654 - 648 657 825 - 647 656 825 - 597 826 827 - 597 760 699 - 826 828 760 - 827 828 699 - 829 830 831 - 829 774 832 - 830 833 774 - 831 833 832 - 753 834 835 - 834 836 761 - 835 836 762 - 837 659 838 - 837 839 766 - 659 840 839 - 838 840 766 - 829 652 841 - 829 842 772 - 652 843 842 - 841 843 772 - 782 844 845 - 844 846 785 - 845 846 786 - 777 847 848 - 847 849 780 - 848 849 781 - 753 850 851 - 850 852 756 - 851 852 757 - 853 746 854 - 853 855 751 - 746 856 855 - 854 856 751 - 857 858 859 - 857 796 860 - 858 861 796 - 859 861 860 - 862 863 864 - 862 793 865 - 863 866 793 - 864 866 865 - 800 867 868 - 867 869 803 - 868 869 804 - 805 870 871 - 870 872 808 - 871 872 809 - 873 874 825 - 873 816 875 - 874 876 816 - 825 876 875 - 782 877 878 - 877 833 789 - 878 833 790 - 777 879 880 - 879 881 787 - 880 881 788 - 800 882 883 - 882 849 812 - 883 849 813 - 805 884 885 - 884 846 810 - 885 846 811 - 873 886 887 - 873 888 821 - 886 866 888 - 887 866 821 - 889 890 891 - 889 892 819 - 890 893 892 - 891 893 819 - 894 895 874 - 894 896 816 - 895 876 896 - 897 898 870 - 897 899 808 - 898 872 899 - 900 901 867 - 900 902 803 - 901 869 902 - 903 904 858 - 903 823 796 - 904 861 823 - 905 885 844 - 905 811 785 - 906 887 863 - 906 821 793 - 907 883 847 - 907 813 780 - 908 841 909 - 908 772 892 - 909 843 892 - 910 851 911 - 910 757 902 - 911 852 902 - 912 854 913 - 912 751 899 - 913 856 899 - 914 838 915 - 914 766 896 - 915 840 896 - 916 917 918 - 916 799 759 - 917 828 799 - 918 828 759 - 919 880 920 - 919 788 776 - 920 881 776 - 921 878 830 - 921 790 774 - 922 923 834 - 922 798 761 - 923 836 798 - 528 755 661 - 528 756 924 - 661 758 924 - 568 663 925 - 568 664 926 - 925 666 926 - 588 667 691 - 588 671 927 - 691 670 927 - 528 687 762 - 578 925 778 - 578 926 781 - 553 691 783 - 553 927 786 - 605 703 674 - 605 820 677 - 517 770 679 - 517 822 682 - 578 787 928 - 925 705 928 - 553 789 694 - 542 661 801 - 542 924 804 - 589 668 806 - 589 750 809 - 589 810 671 - 542 812 664 - 529 681 685 - 529 797 687 - 597 696 668 - 604 925 701 - 604 928 704 - 552 690 770 - 552 694 775 - 588 929 710 - 691 711 929 - 568 930 708 - 925 709 930 - 517 714 931 - 770 713 931 - 605 716 742 - 561 691 727 - 561 740 725 - 561 733 929 - 569 925 736 - 569 932 738 - 925 739 932 - 569 722 930 - 560 681 719 - 560 933 722 - 681 723 933 - 560 725 714 - 596 673 730 - 596 741 733 - 596 738 716 - 529 708 933 - 597 710 741 - 604 742 932 - 552 931 740 - 542 868 934 - 934 869 924 - 589 871 935 - 935 872 750 - 513 936 859 - 504 937 936 - 515 937 859 - 626 938 826 - 631 827 938 - 540 939 868 - 539 934 939 - 621 744 871 - 623 935 744 - 626 935 743 - 505 940 653 - 504 940 824 - 632 941 938 - 634 827 941 - 525 942 835 - 516 943 942 - 527 943 835 - 612 879 944 - 611 945 879 - 614 945 944 - 595 710 733 - 567 722 708 - 559 740 714 - 603 716 932 - 853 748 626 - 626 750 855 - 829 768 505 - 505 771 842 - 837 763 614 - 614 765 839 - 505 775 832 - 857 516 794 - 516 682 860 - 862 634 791 - 634 677 865 - 873 642 814 - 642 765 875 - 642 820 888 - 898 913 747 - 747 856 872 - 909 655 890 - 655 893 843 - 901 911 946 - 946 852 869 - 895 915 660 - 660 840 876 - 947 909 651 - 947 890 654 - 948 657 895 - 948 658 915 - 949 744 898 - 949 745 913 - 950 939 901 - 950 951 911 - 939 946 951 - 743 872 855 - 940 893 771 - 653 893 842 - 656 876 839 - 952 946 850 - 952 869 756 - 528 934 952 - 537 952 939 - 537 850 951 - 748 918 826 - 853 938 918 - 527 797 762 - 943 836 797 - 551 789 775 - 611 704 787 - 945 881 704 - 549 831 877 - 549 832 789 - 763 920 945 - 837 944 920 - 639 820 865 - 515 822 860 - 937 861 822 - 575 926 812 - 587 810 927 - 794 943 923 - 857 923 942 - 862 917 941 - 791 827 917 - 647 839 875 - 953 504 817 - 953 824 891 - 817 940 891 - 817 937 904 - 953 904 936 - 640 888 865 - 640 864 886 - 585 810 786 - 585 845 884 - 576 848 882 - 576 781 812 - 0 1 2 3 - 0 5 8 4 - 1 6 9 5 - 2 6 10 7 - 3 7 11 4 - 8 9 10 11 - 8 13 16 12 - 9 14 17 13 - 10 14 18 15 - 11 15 19 12 - 16 17 18 19 - 2 20 21 22 - 20 23 25 6 - 21 23 26 24 - 22 24 27 7 - 10 25 26 27 - 25 28 30 14 - 26 28 31 29 - 27 29 32 15 - 18 30 31 32 - 21 33 34 35 - 33 36 38 23 - 34 36 39 37 - 35 37 40 24 - 26 38 39 40 - 38 41 43 28 - 39 41 44 42 - 40 42 45 29 - 31 43 44 45 - 34 46 47 48 - 46 49 51 36 - 47 49 52 50 - 48 50 53 37 - 39 51 52 53 - 51 54 56 41 - 52 54 57 55 - 53 55 58 42 - 44 56 57 58 - 59 60 61 1 - 59 62 64 5 - 60 63 65 62 - 61 63 66 6 - 64 65 66 9 - 64 67 69 13 - 65 68 70 67 - 66 68 71 14 - 69 70 71 17 - 61 72 73 20 - 72 74 75 63 - 73 74 76 23 - 66 75 76 25 - 75 77 78 68 - 76 77 79 28 - 71 78 79 30 - 73 80 81 33 - 80 82 83 74 - 81 82 84 36 - 76 83 84 38 - 83 85 86 77 - 84 85 87 41 - 79 86 87 43 - 81 88 89 46 - 88 90 91 82 - 89 90 92 49 - 84 91 92 51 - 91 93 94 85 - 92 93 95 54 - 87 94 95 56 - 96 97 98 60 - 96 99 101 62 - 97 100 102 99 - 98 100 103 63 - 101 102 103 65 - 101 104 106 67 - 102 105 107 104 - 103 105 108 68 - 106 107 108 70 - 98 109 110 72 - 109 111 112 100 - 110 111 113 74 - 103 112 113 75 - 112 114 115 105 - 113 114 116 77 - 108 115 116 78 - 110 117 118 80 - 117 119 120 111 - 118 119 121 82 - 113 120 121 83 - 120 122 123 114 - 121 122 124 85 - 116 123 124 86 - 118 125 126 88 - 125 127 128 119 - 126 127 129 90 - 121 128 129 91 - 128 130 131 122 - 129 130 132 93 - 124 131 132 94 - 133 134 135 97 - 133 136 138 99 - 134 137 139 136 - 135 137 140 100 - 138 139 140 102 - 138 141 143 104 - 139 142 144 141 - 140 142 145 105 - 143 144 145 107 - 135 146 147 109 - 146 148 149 137 - 147 148 150 111 - 140 149 150 112 - 149 151 152 142 - 150 151 153 114 - 145 152 153 115 - 147 154 155 117 - 154 156 157 148 - 155 156 158 119 - 150 157 158 120 - 157 159 160 151 - 158 159 161 122 - 153 160 161 123 - 155 162 163 125 - 162 164 165 156 - 163 164 166 127 - 158 165 166 128 - 165 167 168 159 - 166 167 169 130 - 161 168 169 131 - 489 490 170 491 - 490 329 494 493 - 491 328 494 492 - 490 423 497 496 - 494 467 497 495 - 498 499 489 500 - 499 493 503 502 - 500 492 503 501 - 499 496 506 505 - 503 495 506 504 - 507 494 486 508 - 508 481 497 509 - 497 426 512 511 - 508 466 512 510 - 513 503 507 514 - 514 509 506 515 - 506 511 518 517 - 514 510 518 516 - 519 508 485 520 - 520 476 512 521 - 512 432 524 523 - 520 456 524 522 - 525 514 519 526 - 526 521 518 527 - 518 523 530 529 - 526 522 530 528 - 531 520 254 532 - 532 455 524 533 - 534 532 454 535 - 535 429 524 536 - 537 526 531 538 - 538 533 530 539 - 540 538 534 541 - 541 536 530 542 - 543 544 479 490 - 544 477 497 545 - 544 425 548 547 - 497 433 548 546 - 549 550 543 499 - 550 545 506 551 - 550 547 554 553 - 506 546 554 552 - 512 464 548 555 - 548 436 558 557 - 512 440 558 556 - 518 555 554 559 - 554 557 562 561 - 518 556 562 560 - 524 461 558 563 - 558 442 566 565 - 524 421 566 564 - 530 563 562 567 - 562 565 570 569 - 530 564 570 568 - 535 483 566 571 - 572 535 487 573 - 573 424 566 574 - 541 571 570 575 - 576 541 572 577 - 577 574 570 578 - 579 580 488 544 - 580 484 548 581 - 580 430 584 583 - 548 419 584 582 - 585 586 579 550 - 586 581 554 587 - 586 583 590 589 - 554 582 590 588 - 558 462 584 591 - 584 431 594 593 - 558 438 594 592 - 562 591 590 595 - 590 593 598 597 - 562 592 598 596 - 566 463 594 599 - 594 331 602 601 - 566 434 602 600 - 570 599 598 603 - 598 601 606 605 - 570 600 606 604 - 573 478 602 607 - 608 573 480 609 - 609 465 602 610 - 577 607 606 611 - 612 577 608 613 - 613 610 606 614 - 615 616 451 580 - 616 452 584 617 - 618 619 475 616 - 619 416 584 620 - 621 622 615 586 - 622 617 590 623 - 624 625 618 622 - 625 620 590 626 - 619 458 594 627 - 628 629 457 619 - 629 445 594 630 - 625 627 598 631 - 632 633 628 625 - 633 630 598 634 - 629 446 602 635 - 636 637 448 629 - 637 449 602 638 - 633 635 606 639 - 640 641 636 633 - 641 638 606 642 - 643 609 326 637 - 644 645 325 637 - 645 176 609 646 - 647 613 643 641 - 648 649 644 641 - 649 646 613 650 - 769 908 889 818 - 680 818 903 795 - 686 795 922 754 - 802 754 910 900 - 784 921 769 692 - 728 692 680 720 - 735 720 686 662 - 779 662 802 907 - 807 905 784 669 - 697 669 728 731 - 675 731 735 702 - 764 702 779 919 - 912 897 807 749 - 916 749 697 792 - 906 792 675 815 - 894 815 764 914 - 908 955 958 954 - 769 956 959 955 - 818 956 960 957 - 889 957 961 954 - 958 959 960 961 - 958 963 966 962 - 959 964 967 963 - 960 964 968 965 - 961 965 969 962 - 966 967 968 969 - 680 970 972 956 - 795 970 973 971 - 903 971 974 957 - 960 972 973 974 - 972 975 977 964 - 973 975 978 976 - 974 976 979 965 - 968 977 978 979 - 686 980 982 970 - 754 980 983 981 - 922 981 984 971 - 973 982 983 984 - 982 985 987 975 - 983 985 988 986 - 984 986 989 976 - 978 987 988 989 - 802 990 992 980 - 900 990 993 991 - 910 991 994 981 - 983 992 993 994 - 992 995 997 985 - 993 995 998 996 - 994 996 999 986 - 988 997 998 999 - 921 1000 1002 955 - 784 1001 1003 1000 - 692 1001 1004 956 - 1002 1003 1004 959 - 1002 1005 1007 963 - 1003 1006 1008 1005 - 1004 1006 1009 964 - 1007 1008 1009 967 - 728 1010 1011 1001 - 720 1010 1012 970 - 1004 1011 1012 972 - 1011 1013 1014 1006 - 1012 1013 1015 975 - 1009 1014 1015 977 - 735 1016 1017 1010 - 662 1016 1018 980 - 1012 1017 1018 982 - 1017 1019 1020 1013 - 1018 1019 1021 985 - 1015 1020 1021 987 - 779 1022 1023 1016 - 907 1022 1024 990 - 1018 1023 1024 992 - 1023 1025 1026 1019 - 1024 1025 1027 995 - 1021 1026 1027 997 - 905 1028 1030 1000 - 807 1029 1031 1028 - 669 1029 1032 1001 - 1030 1031 1032 1003 - 1030 1033 1035 1005 - 1031 1034 1036 1033 - 1032 1034 1037 1006 - 1035 1036 1037 1008 - 697 1038 1039 1029 - 731 1038 1040 1010 - 1032 1039 1040 1011 - 1039 1041 1042 1034 - 1040 1041 1043 1013 - 1037 1042 1043 1014 - 675 1044 1045 1038 - 702 1044 1046 1016 - 1040 1045 1046 1017 - 1045 1047 1048 1041 - 1046 1047 1049 1019 - 1043 1048 1049 1020 - 764 1050 1051 1044 - 919 1050 1052 1022 - 1046 1051 1052 1023 - 1051 1053 1054 1047 - 1052 1053 1055 1025 - 1049 1054 1055 1026 - 897 1056 1058 1028 - 912 1057 1059 1056 - 749 1057 1060 1029 - 1058 1059 1060 1031 - 1058 1061 1063 1033 - 1059 1062 1064 1061 - 1060 1062 1065 1034 - 1063 1064 1065 1036 - 916 1066 1067 1057 - 792 1066 1068 1038 - 1060 1067 1068 1039 - 1067 1069 1070 1062 - 1068 1069 1071 1041 - 1065 1070 1071 1042 - 906 1072 1073 1066 - 815 1072 1074 1044 - 1068 1073 1074 1045 - 1073 1075 1076 1069 - 1074 1075 1077 1047 - 1071 1076 1077 1048 - 894 1078 1079 1072 - 914 1078 1080 1050 - 1074 1079 1080 1051 - 1079 1081 1082 1075 - 1080 1081 1083 1053 - 1077 1082 1083 1054 - - - 0 1 2 3 4 5 - 5 6 7 8 9 10 - 11 3 12 13 14 15 - 15 8 16 17 18 19 - 20 13 21 22 23 24 - 24 17 25 26 27 28 - 29 22 30 31 32 33 - 33 26 34 35 36 37 - 38 39 40 41 2 42 - 42 43 44 45 7 46 - 47 41 48 49 12 50 - 50 45 51 52 16 53 - 54 49 55 56 21 57 - 57 52 58 59 25 60 - 61 56 62 63 30 64 - 64 59 65 66 34 67 - 68 69 70 71 40 72 - 72 73 74 75 44 76 - 77 71 78 79 48 80 - 80 75 81 82 51 83 - 84 79 85 86 55 87 - 87 82 88 89 58 90 - 91 86 92 93 62 94 - 94 89 95 96 65 97 - 98 99 100 101 70 102 - 102 103 104 105 74 106 - 107 101 108 109 78 110 - 110 105 111 112 81 113 - 114 109 115 116 85 117 - 117 112 118 119 88 120 - 121 116 122 123 92 124 - 124 119 125 126 95 127 - 1224 1240 1241 1242 1243 1244 - 1244 1245 1246 1247 1248 1249 - 1225 1242 1250 1251 1252 1253 - 1253 1247 1254 1255 1256 1257 - 1226 1251 1258 1259 1260 1261 - 1261 1255 1262 1263 1264 1265 - 1227 1259 1266 1267 1268 1269 - 1269 1263 1270 1271 1272 1273 - 1228 1274 1275 1276 1241 1277 - 1277 1278 1279 1280 1246 1281 - 1229 1276 1282 1283 1250 1284 - 1284 1280 1285 1286 1254 1287 - 1230 1283 1288 1289 1258 1290 - 1290 1286 1291 1292 1262 1293 - 1231 1289 1294 1295 1266 1296 - 1296 1292 1297 1298 1270 1299 - 1232 1300 1301 1302 1275 1303 - 1303 1304 1305 1306 1279 1307 - 1233 1302 1308 1309 1282 1310 - 1310 1306 1311 1312 1285 1313 - 1234 1309 1314 1315 1288 1316 - 1316 1312 1317 1318 1291 1319 - 1235 1315 1320 1321 1294 1322 - 1322 1318 1323 1324 1297 1325 - 1236 1326 1327 1328 1301 1329 - 1329 1330 1331 1332 1305 1333 - 1237 1328 1334 1335 1308 1336 - 1336 1332 1337 1338 1311 1339 - 1238 1335 1340 1341 1314 1342 - 1342 1338 1343 1344 1317 1345 - 1239 1341 1346 1347 1320 1348 - 1348 1344 1349 1350 1323 1351 -

10 410 223 287 382

-

19 296 149 264 400

-

28 266 157 235 421

-

37 225 274 385 404

-

46 419 259 161 233

-

53 210 192 188 174

-

60 181 201 168 205

-

67 137 248 394 282

-

76 402 285 141 252

-

83 171 208 194 203

-

90 185 177 213 198

-

97 165 244 423 256

-

106 388 407 231 278

-

113 238 416 269 153

-

120 261 396 293 145

-

127 291 391 413 241

-

1224 891 1042 1020 942

-

1225 802 947 1033 917

-

1226 806 919 1063 884

-

1227 926 877 1045 1030

-

1228 910 1061 895 811

-

1229 841 859 828 838

-

1230 847 834 857 822

-

1231 901 790 935 1040

-

1232 932 1036 905 795

-

1233 862 824 855 845

-

1234 830 852 851 866

-

1235 897 818 907 1058

-

1236 1048 1027 930 873

-

1237 1054 881 815 922

-

1238 1038 914 799 944

-

1239 1024 939 887 1051

- 604 605 606 302 607 - 606 608 609 590 610 - 611 612 613 605 614 - 613 615 616 608 617 - 618 619 610 595 620 - 620 621 622 575 623 - 624 625 617 619 626 - 626 627 628 621 629 - 630 631 623 586 632 - 632 633 634 560 635 - 636 637 629 631 638 - 638 639 640 633 641 - 642 643 635 502 644 - 645 646 644 499 647 - 648 649 641 643 650 - 651 652 650 646 653 - 654 655 656 571 609 - 656 657 658 565 659 - 660 661 662 655 616 - 662 663 664 657 665 - 622 666 659 518 667 - 667 668 669 514 670 - 628 671 665 666 672 - 672 673 674 668 675 - 634 676 670 517 677 - 677 678 679 508 680 - 640 681 675 676 682 - 682 683 684 678 685 - 647 686 680 580 687 - 688 689 687 598 690 - 653 691 685 686 692 - 693 694 692 689 695 - 696 697 698 603 658 - 698 699 700 582 701 - 702 703 704 697 664 - 704 705 706 699 707 - 669 708 701 510 709 - 709 710 711 516 712 - 674 713 707 708 714 - 714 715 716 710 717 - 679 718 712 512 719 - 719 720 721 519 722 - 684 723 717 718 724 - 724 725 726 720 727 - 690 728 722 567 729 - 730 731 729 574 732 - 695 733 727 728 734 - 735 736 734 731 737 - 738 739 740 496 700 - 741 742 743 559 740 - 744 745 746 739 706 - 747 748 749 742 746 - 743 750 751 564 711 - 752 753 754 504 751 - 749 755 756 750 716 - 757 758 759 753 756 - 754 760 761 490 721 - 762 763 764 493 761 - 759 765 766 760 726 - 767 768 769 763 766 - 770 771 732 591 764 - 772 773 774 299 770 - 775 776 737 771 769 - 777 778 779 773 775 - 128 129 130 131 - 132 133 134 135 - 136 137 138 139 - 140 141 142 143 - 144 145 146 147 - 148 149 150 151 - 152 153 154 155 - 156 157 158 159 - 160 161 162 163 - 164 165 166 167 - 136 168 169 170 - 140 171 172 173 - 148 174 175 176 - 144 177 178 179 - 180 181 182 183 - 184 185 186 187 - 180 188 189 190 - 191 192 193 189 - 184 194 195 196 - 197 198 199 200 - 197 201 202 169 - 191 203 196 204 - 156 205 206 207 - 152 208 173 209 - 160 210 211 212 - 164 213 214 215 - 216 217 218 219 - 220 221 222 223 - 224 225 226 227 - 228 229 230 231 - 220 232 233 234 - 224 235 159 236 - 228 237 238 239 - 240 241 242 243 - 240 244 167 245 - 246 247 248 249 - 250 251 252 253 - 246 254 255 256 - 250 257 258 259 - 260 261 147 262 - 263 264 151 265 - 263 266 267 268 - 260 269 270 271 - 272 273 274 275 - 276 277 278 279 - 272 280 281 282 - 276 283 284 285 - 286 287 288 289 - 290 291 243 292 - 290 293 294 295 - 286 296 297 298 - 299 300 301 132 - 302 129 303 304 - 305 306 307 308 - 309 232 310 311 - 312 313 314 315 - 316 317 318 319 - 320 237 321 322 - 323 221 324 325 - 326 327 328 329 - 330 251 331 332 - 333 247 334 335 - 336 337 338 339 - 340 229 341 342 - 343 344 345 346 - 347 273 348 349 - 350 277 351 352 - 353 354 355 356 - 357 358 359 360 - 361 257 362 363 - 364 254 365 366 - 367 280 368 369 - 370 283 371 372 - 373 374 375 376 - 377 378 379 380 - 381 382 360 383 - 384 385 349 386 - 387 388 352 389 - 390 391 356 392 - 393 394 335 368 - 395 396 397 398 - 399 400 346 375 - 401 402 332 371 - 403 404 405 338 - 406 407 408 341 - 409 410 411 324 - 412 413 414 328 - 415 416 322 417 - 418 419 311 362 - 420 421 319 379 - 422 423 315 365 - 424 230 425 426 - 427 428 143 429 - 430 431 432 138 - 424 239 155 433 - 434 222 435 288 - 436 249 139 437 - 438 253 428 439 - 440 146 295 306 - 441 298 442 150 - 438 258 443 444 - 436 255 445 446 - 434 234 163 447 - 448 275 227 449 - 450 279 426 451 - 448 281 452 431 - 450 284 453 142 - 454 154 271 455 - 456 268 457 158 - 458 162 444 459 - 460 446 461 166 - 427 462 463 172 - 430 206 170 464 - 441 211 176 465 - 440 179 466 214 - 467 468 469 193 - 467 462 204 470 - 471 195 472 473 - 471 187 474 178 - 475 476 477 182 - 475 175 190 478 - 479 183 480 202 - 479 186 200 481 - 454 209 482 472 - 456 476 207 483 - 458 212 484 468 - 460 199 215 485 - 486 449 487 348 - 488 451 489 351 - 490 491 305 492 - 493 494 492 495 - 496 497 488 498 - 499 500 486 501 - 502 216 501 503 - 504 505 506 507 - 508 509 464 480 - 510 470 511 463 - 512 481 513 474 - 514 515 478 469 - 516 511 473 482 - 517 483 509 477 - 518 465 515 484 - 519 513 485 466 - 520 337 521 226 - 520 317 236 522 - 523 327 524 242 - 523 313 245 525 - 526 344 265 527 - 526 378 528 267 - 529 358 289 530 - 531 354 292 532 - 529 374 533 297 - 534 389 535 408 - 536 411 383 537 - 538 386 539 405 - 540 392 541 414 - 542 543 131 536 - 544 545 540 134 - 546 547 538 218 - 548 549 534 550 - 503 521 551 487 - 219 551 339 539 - 135 552 329 541 - 130 325 537 553 - 554 555 342 535 - 556 425 555 489 - 557 558 550 554 - 559 557 498 556 - 560 561 522 457 - 506 562 563 321 - 564 433 455 562 - 565 566 459 443 - 567 445 568 461 - 569 570 363 310 - 571 570 447 566 - 572 573 366 314 - 574 573 525 568 - 575 576 527 442 - 577 578 579 491 - 579 262 308 397 - 580 452 581 432 - 582 583 429 453 - 584 585 380 318 - 586 585 561 528 - 587 270 417 563 - 577 588 507 587 - 304 589 553 359 - 590 589 530 435 - 591 592 532 524 - 301 592 552 355 - 531 593 495 594 - 594 294 398 307 - 595 596 576 533 - 597 596 376 345 - 598 599 437 581 - 600 599 369 334 - 601 602 372 331 - 603 602 439 583 - 780 781 782 783 - 784 785 786 787 - 788 789 790 791 - 792 793 794 795 - 796 797 798 799 - 800 801 802 803 - 804 805 806 807 - 808 809 810 811 - 812 813 814 815 - 816 817 818 819 - 788 820 821 822 - 792 823 824 825 - 800 826 827 828 - 796 829 830 831 - 832 833 834 835 - 832 836 837 838 - 839 840 841 837 - 842 843 844 845 - 846 835 847 848 - 846 849 850 851 - 842 849 852 853 - 839 854 843 855 - 804 856 820 857 - 808 858 859 860 - 812 861 862 863 - 816 864 865 866 - 867 868 869 870 - 871 872 873 874 - 875 876 877 878 - 871 879 880 881 - 875 882 883 884 - 885 886 887 888 - 889 890 891 892 - 889 893 894 895 - 885 896 819 897 - 898 899 900 901 - 902 903 904 905 - 898 906 907 908 - 902 909 910 911 - 912 913 797 914 - 915 916 803 917 - 915 918 919 920 - 912 921 922 814 - 923 924 925 926 - 927 928 929 930 - 927 931 932 933 - 923 934 935 936 - 937 938 888 939 - 940 941 892 942 - 937 943 944 945 - 940 946 947 948 - 612 781 949 950 - 778 951 784 952 - 953 954 955 956 - 957 958 959 960 - 961 882 962 963 - 964 965 966 967 - 968 969 970 971 - 972 903 973 974 - 975 899 976 977 - 978 876 979 980 - 981 982 983 984 - 985 986 987 988 - 989 990 991 992 - 993 924 994 995 - 996 928 997 998 - 999 1000 1001 1002 - 1003 909 1004 1005 - 1006 906 1007 1008 - 1009 934 1010 1011 - 1012 931 1013 1014 - 1015 1016 1017 1018 - 1019 1020 1021 1022 - 1023 1024 1025 1001 - 1026 1027 1028 997 - 1029 1030 1031 994 - 1032 1033 1034 987 - 1035 1036 1014 973 - 1037 1038 1018 991 - 1039 1040 1011 976 - 1041 1042 971 1043 - 1044 1045 980 1046 - 1047 1048 984 1049 - 1050 1051 967 1052 - 1053 1054 1055 1056 - 1057 1058 1008 1059 - 1060 1061 1005 959 - 1062 1063 1064 962 - 1065 1066 878 1067 - 1068 1069 791 1070 - 1071 1072 793 1073 - 1065 1074 807 883 - 1075 1076 1070 900 - 1077 1078 1073 904 - 1079 1080 945 798 - 1081 1082 948 801 - 1075 1083 908 1084 - 1077 1085 911 810 - 1086 1087 1067 925 - 1088 1089 874 929 - 1088 1090 933 794 - 1086 1091 936 789 - 1092 1093 920 805 - 1094 954 813 880 - 1095 1096 1084 817 - 1097 1098 809 894 - 1071 1099 1100 823 - 1068 1101 1102 821 - 1081 1103 826 1104 - 1079 1105 831 865 - 1106 1107 860 840 - 1106 1108 854 1100 - 1109 1110 1111 850 - 1109 1112 848 1102 - 1113 1114 1115 833 - 1113 1116 836 827 - 1117 1118 863 844 - 1117 1119 853 829 - 1092 1120 856 1115 - 1094 1121 825 861 - 1095 1122 864 1111 - 1097 1123 1104 858 - 1124 1087 995 1125 - 1126 1089 998 1127 - 625 1128 1129 1130 - 755 1131 1132 953 - 652 1133 1134 1124 - 745 1135 1136 1126 - 748 867 1137 1136 - 615 949 1138 1139 - 758 1140 1141 1132 - 637 1142 1143 1144 - 736 1145 1146 1147 - 713 1108 1099 1148 - 683 1149 1112 1101 - 715 1148 1121 1118 - 673 1150 1107 1116 - 681 1120 1114 1149 - 723 1110 1119 1151 - 671 1103 1123 1150 - 725 1151 1105 1122 - 1152 982 872 1153 - 1154 969 890 1155 - 1156 965 886 1157 - 1154 958 1158 893 - 1159 986 1160 916 - 1161 990 1162 913 - 1163 1000 1164 938 - 1163 1016 943 1165 - 1166 1028 1049 1167 - 1168 1043 1169 1021 - 1170 1031 1046 1171 - 1172 1025 1052 1173 - 1174 1175 1168 782 - 1176 1177 787 1172 - 1178 1179 870 1166 - 1180 1181 1182 1170 - 1137 1153 1127 1183 - 869 1183 1167 983 - 1138 1155 1184 1185 - 783 970 1185 1169 - 786 1186 1173 966 - 1187 1188 1171 979 - 1189 1066 1125 1188 - 1190 1191 1187 1182 - 649 1190 1189 1134 - 1192 879 1056 955 - 1152 1193 1131 1192 - 639 1194 1093 1074 - 1144 1194 963 1195 - 663 1196 1085 1098 - 1146 1197 1198 1007 - 733 1083 1096 1197 - 1199 1200 960 1004 - 661 1200 1196 1158 - 1201 896 1059 1198 - 1156 1202 1147 1201 - 765 1162 1203 1080 - 627 1204 1082 1160 - 1130 1204 988 1205 - 691 1091 1069 1206 - 705 1207 1090 1072 - 1208 918 1195 1064 - 1159 1209 1208 1143 - 1161 1210 1211 1141 - 1211 921 956 1055 - 776 1212 1157 1164 - 952 1212 1002 1186 - 1213 1214 1139 1215 - 1215 941 1022 1184 - 1216 946 1205 1034 - 1213 1217 1216 1129 - 768 1218 1165 1203 - 1219 1218 992 1017 - 703 1220 1207 1078 - 1221 1220 974 1013 - 1222 1223 977 1010 - 694 1223 1206 1076 -
- - -5.00000000e-01 1.00000000e+00 2.00000000e-01 -7.50000000e-01 1.00000000e+00 2.00000000e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 - -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 - -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.09737465e-01 7.67979309e-01 2.14852365e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -7.78681422e-01 7.97121596e-01 1.57212989e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 - -1.00000000e+00 1.00000000e+00 2.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 - -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 7.50000000e-01 2.00000000e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 - -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -4.84513376e-01 7.88613759e-01 -2.47734269e-02 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 - -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -7.50000000e-01 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 - -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -7.30225254e-01 7.83182848e-01 -4.97444001e-02 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 - -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -1.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 7.50000000e-01 -5.31234778e-13 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -5.49002019e-01 2.94878361e-01 2.22905724e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -7.11589479e-01 4.73335261e-01 2.49885800e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -7.81530511e-01 2.79380115e-01 2.11246802e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 - -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 - -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.50000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 - -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.71056834e-01 2.61828242e-01 -6.29466438e-03 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 - -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -7.83353594e-01 5.17147107e-01 -3.99209592e-02 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 - -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -7.67432407e-01 2.08191458e-01 2.61816764e-03 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 - -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 2.50000000e-01 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.39119198e-01 -2.18069642e-01 1.93502074e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -7.08701747e-01 4.85548346e-02 1.58550948e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -7.83341325e-01 -2.60070362e-01 1.68185936e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 - -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 - -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -2.50000000e-01 2.00000000e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 - -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -4.78043847e-01 -2.07629733e-01 4.50886922e-02 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 - -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -7.40704078e-01 3.39288150e-02 -3.48449259e-02 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 - -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -7.98649990e-01 -2.91977690e-01 3.76771938e-02 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 - -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -2.50000000e-01 -5.31234778e-13 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.98466940e-01 -7.73475031e-01 1.66920868e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -7.56224055e-01 -4.89237272e-01 2.39317721e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 - -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -7.32136997e-01 -7.68847575e-01 2.25254060e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 - -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -7.50000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 - -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 - -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -7.50000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 - -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.79675664e-01 -7.95380719e-01 -4.19450610e-02 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 - -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -7.39628005e-01 -5.05700884e-01 1.87812797e-02 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 - -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -7.38622456e-01 -7.20629057e-01 2.58153547e-02 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 - -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -1.00000000e+00 -7.50000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 - -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -1.00000000e+00 -1.00000000e+00 -1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -7.50000000e-01 -1.00000000e+00 -5.31234778e-13 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 - -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 -1.00000000e+00 -1.00000000e+00 -4.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -7.50000000e-01 -2.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -8.75000000e-01 -3.00000000e-01 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -1.00000000e+00 -4.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 8.75000000e-01 -1.00000000e+00 -3.00000000e-01 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 - 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 7.56483320e-01 -7.26132381e-01 -2.14701945e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 7.50000000e-01 -1.00000000e+00 -2.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 1.00000000e+00 -2.75279799e-12 -4.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 - 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 1.00000000e+00 -1.25000000e-01 -3.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 1.00000000e+00 -2.50000000e-01 -2.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 1.00000000e+00 2.50000000e-01 -2.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 1.00000000e+00 1.25000000e-01 -3.00000000e-01 1.00000000e+00 2.50000000e-01 -4.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 7.94944168e-01 2.92358944e-01 -1.63669585e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 7.39298995e-01 1.55739606e-02 -2.39746917e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 2.65193359e-01 -7.92393562e-01 -1.72384452e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -2.21100213e-01 -2.43016960e-01 -1.67879521e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 -1.04563744e-01 -3.61871620e-01 -2.40774353e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -3.13512953e-02 -2.10861610e-01 -2.14981457e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 1.73721039e-01 -4.08463583e-01 -2.45647782e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 - -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 -2.22977063e-01 -5.36870853e-01 -1.64641576e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -1.45052688e-01 -6.47041747e-01 -3.04023342e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 -9.44557460e-03 -7.85213296e-01 -1.62867646e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 1.55742707e-01 -6.61512446e-01 -3.85684693e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 - 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 2.18684050e-01 -4.94833636e-01 -2.33971621e-01 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 2.21203398e-02 -5.21803958e-01 -3.94111106e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 - 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 9.08318818e-01 -7.87317970e-01 -2.91492849e-01 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 - 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 8.66567845e-01 -9.10133041e-01 -4.03891725e-01 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 - 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 6.43275542e-01 -7.40778770e-01 -3.05336119e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 8.75000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 7.37605445e-01 -8.93310935e-01 -4.14129112e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 6.25000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - 7.50000000e-01 -1.00000000e+00 -4.00000000e-01 6.25000000e-01 -1.00000000e+00 -3.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 -1.00000000e+00 -3.75000000e-01 -3.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -1.00000000e+00 -3.75000000e-01 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 - -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 -9.05637358e-01 -2.98827051e-01 -4.64781721e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 - -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 -1.00000000e+00 -1.25000000e-01 -5.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 - -1.00000000e+00 -2.50000000e-01 -4.00000000e-01 -1.00000000e+00 -1.25000000e-01 -3.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -1.00000000e+00 -2.50000000e-01 -2.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -1.00000000e+00 2.50000000e-01 -2.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -7.94536143e-01 -2.68885321e-01 -1.66434791e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -7.12930596e-01 3.88167636e-02 -1.73466694e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -8.44982441e-01 1.39476319e-01 -3.57473627e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - -1.00000000e+00 2.50000000e-01 -4.00000000e-01 -1.00000000e+00 1.25000000e-01 -3.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 -8.99788703e-01 -1.51290305e-01 -3.62214191e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -1.00000000e+00 2.75279799e-12 -4.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -8.75000000e-01 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 - 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 8.70128598e-01 -7.71109545e-01 -4.56909981e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 1.00000000e+00 -6.25000000e-01 -3.00000000e-01 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 1.00000000e+00 -6.25000000e-01 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -4.00000000e-01 - -2.50000000e-01 1.00000000e+00 -4.00000000e-01 -3.75000000e-01 1.00000000e+00 -3.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -2.50000000e-01 1.00000000e+00 -4.00000000e-01 -3.75000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -2.07202930e-01 8.40581579e-01 -4.63741255e-01 -2.50000000e-01 1.00000000e+00 -4.00000000e-01 - -2.50000000e-01 1.00000000e+00 -4.00000000e-01 -1.25000000e-01 1.00000000e+00 -5.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 - -2.50000000e-01 1.00000000e+00 -4.00000000e-01 -1.25000000e-01 1.00000000e+00 -3.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 - 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 3.75000000e-01 -1.00000000e+00 -3.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 3.75000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 2.05405232e-01 -9.05212150e-01 -4.22345879e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 - 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 1.25000000e-01 -1.00000000e+00 -5.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 - 2.50000000e-01 -1.00000000e+00 -4.00000000e-01 1.25000000e-01 -1.00000000e+00 -3.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 - 4.93990198e-01 1.96586961e-02 -2.00936210e-01 7.78082039e-01 -8.69006607e-02 -2.85786131e-01 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 1.00000000e+00 -1.25000000e-01 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 - 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 8.86034502e-01 -2.57631946e-01 -4.45623957e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 - 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 1.00000000e+00 -3.75000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - 1.00000000e+00 -2.50000000e-01 -4.00000000e-01 1.00000000e+00 -3.75000000e-01 -3.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - -1.00000000e+00 2.50000000e-01 -4.00000000e-01 -1.00000000e+00 1.25000000e-01 -5.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 - -1.00000000e+00 2.50000000e-01 -4.00000000e-01 -8.60143449e-01 2.47528095e-01 -4.30263532e-01 -7.60981297e-01 2.83096054e-01 -4.53794791e-01 - -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -1.00000000e+00 3.75000000e-01 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -4.00000000e-01 - -1.00000000e+00 2.50000000e-01 -4.00000000e-01 -1.00000000e+00 3.75000000e-01 -3.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -1.00000000e+00 5.00000000e-01 -2.00000000e-01 -7.24152013e-01 2.00649807e-01 -2.38729769e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -7.04899767e-01 4.70385201e-01 -2.10375257e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -9.03785662e-01 3.42062288e-01 -3.77438268e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -1.00000000e+00 5.00000000e-01 -4.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 2.50000000e-01 1.00000000e+00 -4.00000000e-01 1.25000000e-01 1.00000000e+00 -3.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 - 2.75279799e-12 1.00000000e+00 -6.00000000e-01 1.25000000e-01 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -4.00000000e-01 - 2.50000000e-01 1.00000000e+00 -4.00000000e-01 2.43877563e-01 8.78312717e-01 -4.42839711e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - 2.50000000e-01 1.00000000e+00 -4.00000000e-01 3.75000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 - 2.50000000e-01 1.00000000e+00 -4.00000000e-01 3.75000000e-01 1.00000000e+00 -3.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 - 5.00000000e-01 1.00000000e+00 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -4.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 -1.25000000e-01 -1.00000000e+00 -3.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 - -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 -1.25000000e-01 -1.00000000e+00 -5.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 - -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 -2.33586216e-01 -8.51377197e-01 -4.03355688e-01 -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 - -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -3.75000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -3.75000000e-01 -1.00000000e+00 -3.00000000e-01 -2.50000000e-01 -1.00000000e+00 -4.00000000e-01 - 1.00000000e+00 2.50000000e-01 -4.00000000e-01 1.00000000e+00 3.75000000e-01 -3.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 5.00000000e-01 -6.00000000e-01 1.00000000e+00 3.75000000e-01 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -4.00000000e-01 - 1.00000000e+00 2.50000000e-01 -4.00000000e-01 1.00000000e+00 1.25000000e-01 -5.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 - 7.31572411e-01 2.07606548e-01 -4.59504821e-01 9.19150190e-01 2.37216883e-01 -4.57497205e-01 1.00000000e+00 2.50000000e-01 -4.00000000e-01 - 1.00000000e+00 2.50000000e-01 -4.00000000e-01 7.13524808e-01 1.53850957e-01 -2.82017554e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 7.74866743e-01 4.08288751e-01 -2.65520525e-01 1.00000000e+00 2.50000000e-01 -4.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -7.23830262e-01 -5.10947776e-01 -2.04324878e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -8.29703929e-01 -3.57328299e-01 -3.67601505e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 - -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 -8.30652517e-01 -6.73877375e-01 -3.51562377e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -1.00000000e+00 -5.00000000e-01 -4.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -1.00000000e+00 -6.25000000e-01 -3.00000000e-01 -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -7.19737040e-01 -7.37267268e-01 -1.68057480e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -1.00000000e+00 -7.50000000e-01 -2.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 7.94545669e-01 5.15331880e-01 -1.50795761e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 7.58754489e-01 7.58424515e-01 -4.31851638e-01 8.96911794e-01 6.11353850e-01 -3.79780400e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 5.00000000e-01 -2.00000000e-01 1.00000000e+00 5.00000000e-01 -4.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 - 1.00000000e+00 5.00000000e-01 -2.00000000e-01 1.00000000e+00 6.25000000e-01 -3.00000000e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 - 5.00000000e-01 1.00000000e+00 -2.00000000e-01 7.34916653e-01 7.05552036e-01 -1.88958584e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 5.00000000e-01 -2.00000000e-01 1.00000000e+00 7.50000000e-01 -2.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 - -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 2.50000000e-01 -1.00000000e+00 -2.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 5.36834601e-01 -7.39180893e-01 -1.78471564e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 4.03247957e-01 -9.16347904e-01 -3.51621441e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 6.01817794e-01 -9.13994419e-01 -3.43508256e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.65647435e-01 -7.30484621e-01 -4.00470720e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 5.00000000e-01 -1.00000000e+00 -4.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -2.50000000e-01 1.00000000e+00 -2.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - 3.63854332e-02 4.76218270e-01 -2.16523681e-01 -2.00554723e-01 7.20919671e-01 -2.28707058e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -7.50000000e-01 1.00000000e+00 -2.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 1.00000000e+00 -2.00000000e-01 -4.70185252e-01 7.09785934e-01 -1.98354831e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -6.25000000e-01 1.00000000e+00 -3.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -3.76962693e-01 9.22628987e-01 -3.76756448e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -6.22734218e-01 8.83360200e-01 -3.46947745e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -4.63100770e-01 7.49540541e-01 -3.68403048e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -5.00000000e-01 1.00000000e+00 -4.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -2.50000000e-01 -1.00000000e+00 -2.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 - -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -2.07140846e-01 -7.92509484e-01 -2.24986267e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 - -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 -1.51612638e-01 -8.33618654e-01 -2.96406331e-01 -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 - -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 1.12582796e-01 -9.07068655e-01 -3.83335460e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 3.17309013e-02 -7.26225246e-01 -4.48857860e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 - -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 -2.75279799e-12 -1.00000000e+00 -4.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 - 5.00000000e-01 1.00000000e+00 -2.00000000e-01 2.50000000e-01 1.00000000e+00 -2.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 - 2.75279799e-12 1.00000000e+00 -2.00000000e-01 2.63252585e-01 7.40363202e-01 -1.92816815e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -3.15411016e-02 7.00464728e-01 -2.42853436e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - 2.75279799e-12 1.00000000e+00 -2.00000000e-01 1.74323728e-01 8.47666699e-01 -3.38918361e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -1.09576225e-01 8.98602596e-01 -3.83046413e-01 -2.53076790e-01 7.99260743e-01 -4.64658113e-01 - 1.59455851e-02 5.49948037e-01 -5.66649946e-01 4.09179074e-02 7.34033466e-01 -3.89217812e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 - 2.75279799e-12 1.00000000e+00 -6.00000000e-01 2.75279799e-12 1.00000000e+00 -4.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 - 7.58754489e-01 7.58424515e-01 -4.31851638e-01 8.66469562e-01 8.33333553e-01 -5.67628657e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 - 7.58754489e-01 7.58424515e-01 -4.31851638e-01 8.26309332e-01 7.28272187e-01 -4.26994277e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 - 7.50000000e-01 1.00000000e+00 -4.00000000e-01 7.60932375e-01 8.57917254e-01 -4.48442345e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 - 5.00000000e-01 1.00000000e+00 -2.00000000e-01 6.38458620e-01 8.77424281e-01 -3.75363581e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 - 1.00000000e+00 5.00000000e-01 -6.00000000e-01 8.91997301e-01 6.72697925e-01 -5.70240818e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 5.97689296e-01 6.23848639e-01 -3.47379551e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 - 5.00000000e-01 1.00000000e+00 -6.00000000e-01 6.11466951e-01 8.62675785e-01 -5.08680422e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 6.02929102e-01 5.91969048e-01 -5.41059259e-01 7.58754489e-01 7.58424515e-01 -4.31851638e-01 - 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 5.83215727e-01 -5.80510263e-01 -3.27258795e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 8.47446355e-01 -8.68127316e-01 -4.89338687e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 5.76214501e-01 -8.49709837e-01 -5.72623137e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 6.08478501e-01 -6.18463179e-01 -5.70984505e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 9.07355102e-01 -6.37739277e-01 -3.07551473e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 8.44892315e-01 -6.23693327e-01 -5.71356441e-01 7.87919686e-01 -7.81122607e-01 -5.21757884e-01 - 4.93990198e-01 1.96586961e-02 -2.00936210e-01 7.33312257e-01 -2.43305887e-01 -1.54892254e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 7.62093252e-01 -5.48127444e-01 -1.80394090e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 9.18423791e-01 -3.51878331e-01 -3.82257230e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 7.89917875e-01 -5.11889809e-01 -3.58706330e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 1.00000000e+00 -5.00000000e-01 -4.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -8.90362310e-01 8.76352267e-01 -5.62154587e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 - -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -7.72171732e-01 8.92062587e-01 -4.14980355e-01 -7.71303906e-01 7.42798488e-01 -4.51592940e-01 - -1.00000000e+00 7.50000000e-01 -4.00000000e-01 -8.60654884e-01 7.72599795e-01 -4.33254900e-01 -7.71303906e-01 7.42798488e-01 -4.51592940e-01 - -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -8.86786132e-01 6.11211898e-01 -3.52673915e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -6.26849364e-01 8.72135665e-01 -4.92576183e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -5.89758562e-01 6.60541039e-01 -3.77661077e-01 -7.71303906e-01 7.42798488e-01 -4.51592940e-01 - -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -8.65257067e-01 6.39677674e-01 -5.61111799e-01 -7.71303906e-01 7.42798488e-01 -4.51592940e-01 - -7.71303906e-01 7.42798488e-01 -4.51592940e-01 -6.28794794e-01 5.78824049e-01 -5.84488135e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 -8.94054158e-01 -8.65974221e-01 -5.24246714e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 -9.03521683e-01 -7.28651092e-01 -4.34081915e-01 -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 - -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 -7.58274396e-01 -8.48907235e-01 -3.90686694e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 - -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -6.54407863e-01 -6.25883342e-01 -3.00696336e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 - -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -8.67891179e-01 -6.17673148e-01 -5.66040699e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -6.23060881e-01 -6.50874641e-01 -5.44710045e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 - -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -6.44770531e-01 -9.24447618e-01 -2.87707904e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 - -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -6.29625945e-01 -9.03171291e-01 -5.37345742e-01 -7.60502577e-01 -7.87352311e-01 -5.20569678e-01 - -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -1.00000000e+00 8.75000000e-01 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -4.00000000e-01 - -1.00000000e+00 7.50000000e-01 -4.00000000e-01 -1.00000000e+00 6.25000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 - -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -8.98693484e-01 9.06455438e-01 -4.29923885e-01 -1.00000000e+00 7.50000000e-01 -4.00000000e-01 - -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -1.00000000e+00 8.75000000e-01 -3.00000000e-01 -1.00000000e+00 7.50000000e-01 -4.00000000e-01 - -1.00000000e+00 7.50000000e-01 -4.00000000e-01 -1.00000000e+00 6.25000000e-01 -3.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 5.00000000e-01 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 - 5.00000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 7.50000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 2.88127504e-01 4.80366421e-01 -6.27498998e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.58568070e-01 2.90475700e-01 -5.61771941e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 - 4.76425748e-01 5.49663539e-01 -7.93911671e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 - 4.76425748e-01 5.49663539e-01 -7.93911671e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 - 5.09344874e-01 3.09144506e-02 -8.04652537e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 - 5.00000000e-01 5.00000000e-01 -1.00000000e+00 4.70494256e-01 5.00918977e-01 -8.78265196e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 - 5.00000000e-01 5.00000000e-01 -1.00000000e+00 2.50000000e-01 5.00000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 - 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 - 5.23944619e-01 1.85747848e-02 -5.96055755e-01 2.02005392e-01 1.35088691e-02 -5.71704179e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.74472946e-01 -2.55527072e-01 -6.17101064e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 - 5.09344874e-01 3.09144506e-02 -8.04652537e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 - 5.09344874e-01 3.09144506e-02 -8.04652537e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 - 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 - 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 - 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 2.50000000e-01 -6.88227253e-13 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 - 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 2.27888915e-01 -5.48643075e-01 -6.08178478e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 - 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 4.51723141e-01 -7.12445778e-01 -6.31796976e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 - 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 - -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 2.50000000e-01 -1.00000000e+00 -6.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -7.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 - 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 - 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 - -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 2.50000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -9.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 - 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -7.50000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 - -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 - 2.75279799e-12 1.00000000e+00 -6.00000000e-01 -2.50000000e-01 1.00000000e+00 -6.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - 1.59455851e-02 5.49948037e-01 -5.66649946e-01 -3.85304003e-02 7.30500373e-01 -6.37788061e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 - 2.75279799e-12 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -7.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 - 2.75279799e-12 1.00000000e+00 -8.00000000e-01 -2.50000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 - 2.81216416e-02 5.47228351e-01 -7.57921741e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 - 2.75279799e-12 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -9.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 - 2.75279799e-12 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 - 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.06459849e-12 7.50000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 - 1.59455851e-02 5.49948037e-01 -5.66649946e-01 -2.28613183e-01 5.45106914e-01 -6.46579701e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 4.76975638e-03 2.22747039e-01 -5.54198113e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 - -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 - 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 - 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -2.50000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 - 0.00000000e+00 0.00000000e+00 -1.00000000e+00 6.88199497e-13 2.50000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 - -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 -2.27518950e-01 -3.08139637e-02 -6.49633469e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 1.11083696e-02 -2.30119466e-01 -6.11745165e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 - 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 - 0.00000000e+00 0.00000000e+00 -1.00000000e+00 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 - 0.00000000e+00 0.00000000e+00 -1.00000000e+00 -2.50000000e-01 6.88199497e-13 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 - -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -6.88199497e-13 -2.50000000e-01 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 -2.63857307e-01 -5.34652399e-01 -6.28666006e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 - -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 3.60248665e-02 -7.15736638e-01 -5.56900182e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 - 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 - -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -2.50000000e-01 -1.00000000e+00 -6.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 - -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -7.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 - 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 - -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 - -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 - -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.50000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 - -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -9.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 - -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 - -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -2.06459849e-12 -7.50000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 - -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -5.37458717e-01 -2.20855384e-01 -6.15373185e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 - -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 -2.50000000e-01 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 - -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -9.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 - -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 - -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 - -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 - -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -7.50000000e-01 2.06459849e-12 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -1.00000000e+00 - -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 - -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -1.00000000e+00 -7.50000000e-01 -6.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -7.61949822e-01 -4.83182440e-01 -6.13761349e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -7.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -5.19284749e-01 -7.83778037e-01 -5.82806477e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 - -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 - -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -7.50000000e-01 -1.00000000e+00 -6.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 - -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 - -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 - -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -9.00000000e-01 -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -7.50000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 - -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 - -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 - -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -9.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -7.50000000e-01 -8.00000000e-01 -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -1.00000000e+00 -7.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -7.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 - -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -7.26284734e-01 -3.76036267e-02 -5.64749763e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 - -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -1.00000000e+00 -2.50000000e-01 -6.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -5.00000000e-01 2.50000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 - -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 - -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -1.00000000e+00 - -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 - -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 - -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -9.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 - -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 - -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 2.50000000e-01 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 - -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -5.26541160e-01 2.33288068e-01 -5.82433991e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -7.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 - -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -7.12353132e-01 4.56004138e-01 -5.52765752e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 - -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -1.00000000e+00 2.50000000e-01 -6.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 - -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 - -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 - -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 - -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -9.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 - -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -9.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 - -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -7.50000000e-01 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 7.50000000e-01 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 - -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -7.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -4.72348517e-01 7.55363920e-01 -5.93158920e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -7.00000000e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 - -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -7.50000000e-01 1.00000000e+00 -6.00000000e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -1.00000000e+00 7.50000000e-01 -6.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 - 5.00000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -9.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 - 4.76425748e-01 5.49663539e-01 -7.93911671e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 - 5.00000000e-01 1.00000000e+00 -8.00000000e-01 2.50000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 - 5.00000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -7.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 4.67519964e-01 7.42183049e-01 -6.00421251e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 - 5.00000000e-01 1.00000000e+00 -6.00000000e-01 2.50000000e-01 1.00000000e+00 -6.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 - 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 - 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 - 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -9.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 7.50000000e-01 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -9.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -7.50000000e-01 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 - 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 7.50000000e-01 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -7.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -7.50000000e-01 -6.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 7.71083683e-01 -4.83737049e-01 -6.24197292e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 - 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 - 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 7.50000000e-01 -2.06462625e-12 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 - 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -9.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -2.50000000e-01 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 - 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -7.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 1.00000000e+00 -2.50000000e-01 -6.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 7.75733836e-01 -1.61799598e-03 -6.49360986e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 - 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 - 1.00000000e+00 5.00000000e-01 -1.00000000e+00 7.50000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 - 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -9.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 2.50000000e-01 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 - 1.00000000e+00 5.00000000e-01 -8.00000000e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 - 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -7.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 - 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 1.00000000e+00 2.50000000e-01 -6.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 - 1.00000000e+00 5.00000000e-01 -6.00000000e-01 7.52729016e-01 4.70095302e-01 -6.25440659e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 - 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 - 1.00000000e+00 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 - 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -9.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 - 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 7.50000000e-01 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 - 1.00000000e+00 1.00000000e+00 -8.00000000e-01 7.50000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 - 1.00000000e+00 1.00000000e+00 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -7.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 - 1.00000000e+00 5.00000000e-01 -6.00000000e-01 1.00000000e+00 7.50000000e-01 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 - 1.00000000e+00 1.00000000e+00 -6.00000000e-01 7.50000000e-01 1.00000000e+00 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -4.61962375e-01 -7.75769656e-01 -4.18986981e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -5.00000000e-01 -1.00000000e+00 -4.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -7.50000000e-01 -1.00000000e+00 -2.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -8.75000000e-01 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 - -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 -6.25000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -6.25000000e-01 -1.00000000e+00 -3.00000000e-01 -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 -8.75000000e-01 -1.00000000e+00 -3.00000000e-01 -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 - -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -1.00000000e+00 -8.75000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -1.00000000e+00 -6.25000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -1.00000000e+00 -8.75000000e-01 -3.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -7.07395522e-01 -8.61682414e-01 -2.65465214e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 -7.50000000e-01 -4.00000000e-01 -8.54654207e-01 -8.60096890e-01 -4.37860559e-01 -7.50000000e-01 -1.00000000e+00 -4.00000000e-01 - 1.00000000e+00 1.00000000e+00 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -4.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 - 1.00000000e+00 1.00000000e+00 -2.00000000e-01 7.50000000e-01 1.00000000e+00 -2.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 - 1.00000000e+00 1.00000000e+00 -6.00000000e-01 1.00000000e+00 8.75000000e-01 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 - 1.00000000e+00 7.50000000e-01 -4.00000000e-01 1.00000000e+00 6.25000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 - 1.00000000e+00 1.00000000e+00 -2.00000000e-01 1.00000000e+00 8.75000000e-01 -3.00000000e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 - 5.00000000e-01 1.00000000e+00 -2.00000000e-01 7.30476792e-01 8.81397324e-01 -2.96849444e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 - 7.50000000e-01 1.00000000e+00 -4.00000000e-01 8.75000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 - 7.50000000e-01 1.00000000e+00 -4.00000000e-01 6.25000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 - 5.00000000e-01 1.00000000e+00 -2.00000000e-01 6.25000000e-01 1.00000000e+00 -3.00000000e-01 7.50000000e-01 1.00000000e+00 -4.00000000e-01 - 1.00000000e+00 1.00000000e+00 -2.00000000e-01 8.75000000e-01 1.00000000e+00 -3.00000000e-01 7.50000000e-01 1.00000000e+00 -4.00000000e-01 - 7.50000000e-01 1.00000000e+00 -4.00000000e-01 8.52044731e-01 9.16113998e-01 -3.66179284e-01 1.00000000e+00 7.50000000e-01 -4.00000000e-01 - -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -2.21732964e-01 4.79719971e-01 -3.70076789e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - 3.63854332e-02 4.76218270e-01 -2.16523681e-01 -4.18265360e-02 4.78403270e-01 -3.64136987e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 -4.36853675e-02 2.05847513e-01 -4.06370645e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -3.58354637e-01 8.72163683e-01 -5.14709975e-01 -2.53076790e-01 7.99260743e-01 -4.64658113e-01 - 2.75279799e-12 1.00000000e+00 -6.00000000e-01 -1.22554368e-01 8.60195143e-01 -5.09984662e-01 -2.53076790e-01 7.99260743e-01 -4.64658113e-01 - -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -1.01740213e-01 6.26675241e-01 -5.28118729e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -3.87438698e-01 6.32538659e-01 -4.92653939e-01 -2.53076790e-01 7.99260743e-01 -4.64658113e-01 - -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -1.53421091e-01 6.23691705e-01 -3.37542058e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.72512145e-01 -5.18652177e-01 -4.46006893e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.48473889e-01 -4.79889978e-01 -4.11511494e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.94303478e-01 -2.29205246e-01 -4.32826494e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 3.82340121e-01 -9.09886376e-01 -5.09722733e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 1.11729587e-01 -8.53908847e-01 -5.21916675e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 1.71349433e-01 -6.47101723e-01 -5.08768665e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.04628731e-01 -5.75769142e-01 -5.51630806e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 - 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 3.49729146e-01 -6.26628131e-01 -3.25356150e-01 2.73470139e-01 -7.02141379e-01 -5.21065923e-01 - 3.63854332e-02 4.76218270e-01 -2.16523681e-01 2.36689214e-01 2.40025704e-01 -2.25657165e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 5.01218023e-01 -2.35503536e-01 -2.00080801e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 4.93990198e-01 1.96586961e-02 -2.00936210e-01 7.71110748e-01 -2.12400300e-03 -4.48259950e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 4.65448608e-01 2.57621780e-01 -4.47886277e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.95317763e-01 4.97416036e-02 -4.44792549e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 1.00000000e+00 5.00000000e-01 -6.00000000e-01 8.52871326e-01 3.63196277e-01 -5.61308458e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 - 7.31572411e-01 2.07606548e-01 -4.59504821e-01 8.68047382e-01 1.57342590e-01 -5.85643384e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 - 5.23944619e-01 1.85747848e-02 -5.96055755e-01 6.13341229e-01 1.58255960e-01 -5.70852079e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 6.47129850e-01 3.68352614e-01 -5.63940719e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 - 4.93990198e-01 1.96586961e-02 -2.00936210e-01 6.13790942e-01 1.73918479e-01 -3.71582893e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 - -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -7.35497436e-01 5.29644797e-04 -3.53371882e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -4.90724046e-01 -2.47401221e-01 -4.27818541e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -4.92291921e-01 4.91813276e-02 -4.01279556e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -8.41323825e-01 -4.02355019e-01 -5.66095150e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 - -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -8.83758601e-01 -9.52780134e-02 -5.48469547e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 - -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -6.51400271e-01 -1.04985386e-01 -5.22368777e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -6.17858889e-01 -3.85766434e-01 -5.13467283e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 - -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -5.77826281e-01 -8.80338640e-02 -3.15524267e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 - 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 6.41386307e-01 -1.55676912e-01 -3.01926334e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 8.77298541e-01 -1.21106197e-01 -5.84950026e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 - 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 8.41075069e-01 -4.09959538e-01 -5.73093164e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 6.05627991e-01 -4.22662589e-01 -5.69547875e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 - 5.23944619e-01 1.85747848e-02 -5.96055755e-01 5.88268197e-01 -1.29346803e-01 -4.91054821e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 - 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 6.12081363e-01 -4.03546033e-01 -3.45414629e-01 7.83853761e-01 -2.55885689e-01 -4.49002557e-01 - -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -4.63290913e-01 2.52761197e-01 -2.45700557e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -2.53076790e-01 7.99260743e-01 -4.64658113e-01 -3.89278698e-01 6.11122280e-01 -3.61705808e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -2.47177004e-01 4.54761404e-01 -1.80487225e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -7.49696034e-01 5.31403850e-01 -4.19059676e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 - -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -5.14501293e-01 2.32691072e-01 -3.87277218e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -5.12924559e-01 4.66132291e-01 -4.04086748e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -6.42489463e-01 1.39517858e-01 -3.53339708e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -8.59570192e-01 1.17494759e-01 -5.77291177e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 - -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -9.00865088e-01 4.19883468e-01 -5.01735616e-01 -7.60981297e-01 2.83096054e-01 -4.53794791e-01 - -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -6.28268794e-01 3.63427986e-01 -5.69176508e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -5.90434958e-01 1.05209211e-01 -4.94318307e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 - -7.60981297e-01 2.83096054e-01 -4.53794791e-01 -6.07884214e-01 3.32235062e-01 -3.27651217e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -5.40207811e-01 -2.89915281e-01 -2.42605818e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -5.35733988e-01 -7.66681895e-01 -2.22966183e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -6.37254587e-01 -3.87881320e-01 -3.18660568e-01 -7.54093005e-01 -2.58295210e-01 -5.18169898e-01 - -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -7.48763334e-01 -5.24519933e-01 -3.53187929e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 -2.85046143e-01 -5.08898861e-01 -4.33724396e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -5.39879178e-01 -4.57913858e-01 -3.64817564e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -1.60523234e-01 -9.03030790e-01 -5.52241389e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -3.25882877e-01 -8.93874310e-01 -5.44211013e-01 -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 - -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -4.15119084e-01 -8.64464070e-01 -3.42660405e-01 -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 - -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -3.99971229e-01 -6.54707172e-01 -5.27787480e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 - -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -1.63465651e-01 -6.02378993e-01 -5.65078195e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 - -2.85002518e-01 -7.20535137e-01 -4.44462174e-01 -3.92881800e-01 -6.37164714e-01 -3.62944840e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 5.10729093e-01 7.60639709e-01 -2.14082050e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 2.61566778e-01 5.28349093e-01 -1.69349915e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 5.18687756e-01 2.90477718e-01 -2.36412455e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 5.81684558e-01 4.13894330e-01 -3.50593642e-01 7.31572411e-01 2.07606548e-01 -4.59504821e-01 - 1.00000000e+00 5.00000000e-01 -6.00000000e-01 7.11081851e-01 5.08205256e-01 -4.34076166e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - 5.00000000e-01 1.00000000e+00 -6.00000000e-01 5.34253639e-01 7.63704600e-01 -3.51994597e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - 1.59455851e-02 5.49948037e-01 -5.66649946e-01 2.31884826e-01 5.23940610e-01 -4.42250212e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 5.32716143e-01 4.63867816e-01 -4.41053554e-01 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - 3.63854332e-02 4.76218270e-01 -2.16523681e-01 8.26508586e-02 6.03898517e-01 -3.51040682e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - 5.00000000e-01 1.00000000e+00 -2.00000000e-01 3.28944967e-01 8.36442756e-01 -3.03853796e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - 2.75279799e-12 1.00000000e+00 -6.00000000e-01 1.46957448e-01 8.99894887e-01 -5.81777533e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - 5.00000000e-01 1.00000000e+00 -6.00000000e-01 3.86929530e-01 8.63386221e-01 -5.48717352e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 4.01637094e-01 6.35137167e-01 -5.00494214e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - 1.59455851e-02 5.49948037e-01 -5.66649946e-01 1.66086932e-01 5.90543458e-01 -5.60050136e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 4.23351663e-01 6.42884585e-01 -3.15189248e-01 2.41416679e-01 7.97160814e-01 -4.42635462e-01 - -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -3.52577489e-01 1.04251494e-01 -2.29259268e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -3.47707757e-01 3.94412343e-01 -4.72794633e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -1.42717862e-01 4.21847282e-01 -4.96961238e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - 3.63854332e-02 4.76218270e-01 -2.16523681e-01 -1.66625271e-01 4.12360051e-01 -2.87743656e-01 -2.69993006e-01 2.24633383e-01 -3.42712104e-01 - -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -1.26913535e-01 1.32065310e-01 -4.98229955e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -4.08133052e-01 1.66032917e-01 -4.73866689e-01 -2.69993006e-01 2.24633383e-01 -3.42712104e-01 - -2.69993006e-01 2.24633383e-01 -3.42712104e-01 -3.77095966e-01 3.71725793e-01 -3.15938363e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 3.64192245e-01 -1.32250109e-01 -2.43099017e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 3.52277623e-01 -3.32582615e-01 -4.35311775e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 1.69460623e-01 -3.52231887e-01 -4.29254709e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 - 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 4.19532876e-01 -3.79741341e-01 -2.64940315e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 - -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 1.26827359e-01 -1.50525201e-01 -4.46318333e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 - 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 3.68082769e-01 -1.74513271e-01 -4.50580273e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -3.68625639e-01 -4.21603349e-01 -4.45233408e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 - -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -4.17714071e-01 -1.03893967e-01 -5.19403635e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 - -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -4.19282025e-01 -1.08627669e-01 -2.69028540e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 - -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 -1.68783680e-01 -1.11087457e-01 -4.96905530e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 -9.73954041e-02 -3.61963022e-01 -5.09124723e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 - -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 -3.86084199e-01 -4.09588910e-01 -2.92066917e-01 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 3.55256023e-01 4.02578442e-01 -4.79479327e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 - 5.23944619e-01 1.85747848e-02 -5.96055755e-01 3.43832702e-01 1.03749380e-01 -4.27391900e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 - 4.93990198e-01 1.96586961e-02 -2.00936210e-01 4.14732122e-01 1.52549679e-01 -2.86597701e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 - 2.75226154e-01 2.62309674e-01 -3.04722194e-01 1.29877154e-01 1.67848848e-01 -5.08209442e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - 1.59455851e-02 5.49948037e-01 -5.66649946e-01 1.42479381e-01 4.14481917e-01 -5.08720597e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 - 3.63854332e-02 4.76218270e-01 -2.16523681e-01 1.51546676e-01 4.07959421e-01 -3.18688777e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 - 4.67506556e-01 4.75925385e-01 -1.86547676e-01 3.69956903e-01 3.31166015e-01 -2.98274695e-01 2.75226154e-01 2.62309674e-01 -3.04722194e-01 - 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 2.04134141e-01 -2.14922092e-01 -1.63726058e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 - -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -2.65034132e-01 2.49773560e-01 -1.54940107e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -3.44384684e-02 2.18713663e-01 -1.85579955e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -2.80153842e-01 -3.64863794e-02 -1.56716221e-01 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 2.39904708e-01 2.97034161e-02 -2.43450037e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -2.34144442e-01 -3.19940718e-02 -3.50775687e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -4.44830136e-02 2.44659298e-02 -3.83935749e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -7.72852083e-02 1.46619467e-01 -2.95184107e-01 -2.69993006e-01 2.24633383e-01 -3.42712104e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 2.58898766e-01 -3.13537170e-02 -4.39149031e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 - 2.75226154e-01 2.62309674e-01 -3.04722194e-01 1.52740817e-01 1.63706393e-01 -2.82813306e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -7.59225478e-02 -1.05546665e-01 -2.64504503e-01 -2.64509441e-01 -2.05893877e-01 -3.27945513e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.26893288e-02 -2.58742171e-01 -3.76706981e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 - 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 1.26923761e-01 -1.24938144e-01 -2.59447138e-01 2.97543655e-01 -2.03970776e-01 -3.34054560e-01 - -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -1.00000000e+00 1.00000000e+00 -4.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -7.80936772e-01 7.57720448e-01 -1.99463657e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -1.00000000e+00 7.50000000e-01 -2.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -6.46484367e-01 7.29307686e-01 -3.03146543e-01 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -8.75000000e-01 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -4.00000000e-01 - -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -6.25000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -8.75000000e-01 1.00000000e+00 -3.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 - -7.50000000e-01 1.00000000e+00 -4.00000000e-01 -8.90088910e-01 7.20161599e-01 -2.61749028e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 2.50000000e-01 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -2.50000000e-01 -1.00000000e+00 6.00000000e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.75279799e-12 4.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -2.50000000e-01 6.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 - -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.75279799e-12 4.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 - -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 2.50000000e-01 6.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 - -5.00000000e-01 1.00000000e+00 6.00000000e-01 -2.50000000e-01 1.00000000e+00 6.00000000e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 - 7.50000000e-01 -1.00000000e+00 4.00000000e-01 6.25000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 - -2.75279799e-12 -1.00000000e+00 6.00000000e-01 2.50000000e-01 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 4.00000000e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 6.25000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 - 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 2.50000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 - -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -6.25000000e-01 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 - -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 -2.50000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 - -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 4.00000000e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 7.86251314e-01 -1.34708864e-01 2.91552600e-01 1.00000000e+00 -2.50000000e-01 4.00000000e-01 - 7.73208263e-01 -2.59692901e-01 4.77175444e-01 8.78752283e-01 -2.29134588e-01 4.84291793e-01 1.00000000e+00 -2.50000000e-01 4.00000000e-01 - 1.00000000e+00 -2.50000000e-01 4.00000000e-01 1.00000000e+00 -1.25000000e-01 5.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 - 1.00000000e+00 -2.50000000e-01 4.00000000e-01 1.00000000e+00 -3.75000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -3.75000000e-01 3.00000000e-01 1.00000000e+00 -2.50000000e-01 4.00000000e-01 - 1.00000000e+00 -2.50000000e-01 4.00000000e-01 1.00000000e+00 -1.25000000e-01 3.00000000e-01 1.00000000e+00 -2.75279799e-12 2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -3.75000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 4.00000000e-01 - -2.50000000e-01 -1.00000000e+00 4.00000000e-01 -3.75000000e-01 -1.00000000e+00 3.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 - -2.50000000e-01 -1.00000000e+00 4.00000000e-01 -2.65668003e-01 -9.01093151e-01 4.73869320e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -1.25000000e-01 -1.00000000e+00 3.00000000e-01 -2.50000000e-01 -1.00000000e+00 4.00000000e-01 - -2.50000000e-01 -1.00000000e+00 4.00000000e-01 -1.25000000e-01 -1.00000000e+00 5.00000000e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 - -1.00000000e+00 2.50000000e-01 4.00000000e-01 -1.00000000e+00 3.75000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 - -1.00000000e+00 2.50000000e-01 4.00000000e-01 -1.00000000e+00 3.75000000e-01 3.00000000e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 - -1.00000000e+00 2.50000000e-01 4.00000000e-01 -8.48353683e-01 2.23570693e-01 4.29868458e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 - -1.00000000e+00 2.50000000e-01 4.00000000e-01 -1.00000000e+00 1.25000000e-01 5.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 - -1.00000000e+00 2.50000000e-01 4.00000000e-01 -1.00000000e+00 1.25000000e-01 3.00000000e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -7.10706699e-01 1.54516895e-01 3.46583661e-01 -1.00000000e+00 2.50000000e-01 4.00000000e-01 - -2.75279799e-12 -1.00000000e+00 6.00000000e-01 1.25000000e-01 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 4.00000000e-01 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 1.25000000e-01 -1.00000000e+00 3.00000000e-01 2.50000000e-01 -1.00000000e+00 4.00000000e-01 - 2.50599317e-01 -7.83894535e-01 5.11804036e-01 2.22338251e-01 -9.05389135e-01 4.34201650e-01 2.50000000e-01 -1.00000000e+00 4.00000000e-01 - 2.50000000e-01 -1.00000000e+00 4.00000000e-01 3.75000000e-01 -1.00000000e+00 3.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 - 5.00000000e-01 -1.00000000e+00 6.00000000e-01 3.75000000e-01 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 4.00000000e-01 - -2.50000000e-01 1.00000000e+00 4.00000000e-01 -1.25000000e-01 1.00000000e+00 5.00000000e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 - -2.50000000e-01 1.00000000e+00 4.00000000e-01 -1.25000000e-01 1.00000000e+00 3.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 - -2.53733289e-01 7.78555773e-01 5.11047110e-01 -2.43796533e-01 8.40363033e-01 4.65276888e-01 -2.50000000e-01 1.00000000e+00 4.00000000e-01 - -2.50000000e-01 1.00000000e+00 4.00000000e-01 -3.75000000e-01 1.00000000e+00 3.00000000e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 - -2.50000000e-01 1.00000000e+00 4.00000000e-01 -3.75000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 - -1.00000000e+00 7.50000000e-01 4.00000000e-01 -1.00000000e+00 6.25000000e-01 3.00000000e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 - -1.00000000e+00 7.50000000e-01 4.00000000e-01 -1.00000000e+00 6.25000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 - -7.42991857e-01 7.43456068e-01 4.63979586e-01 -8.61517128e-01 7.99768271e-01 4.42435006e-01 -1.00000000e+00 7.50000000e-01 4.00000000e-01 - -1.00000000e+00 1.00000000e+00 2.00000000e-01 -1.00000000e+00 8.75000000e-01 3.00000000e-01 -1.00000000e+00 7.50000000e-01 4.00000000e-01 - -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -1.00000000e+00 -1.25000000e-01 5.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 - -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -1.00000000e+00 -1.25000000e-01 3.00000000e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 - -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -9.00001439e-01 -2.33350512e-01 4.04672585e-01 -7.69033054e-01 -2.83268701e-01 5.03354564e-01 - -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -1.00000000e+00 -3.75000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 - -1.00000000e+00 -2.50000000e-01 4.00000000e-01 -1.00000000e+00 -3.75000000e-01 3.00000000e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -7.90416189e-01 -3.93195918e-01 2.54565942e-01 -1.00000000e+00 -2.50000000e-01 4.00000000e-01 - 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 1.25000000e-01 5.00000000e-01 1.00000000e+00 2.50000000e-01 4.00000000e-01 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 1.25000000e-01 3.00000000e-01 1.00000000e+00 2.50000000e-01 4.00000000e-01 - 1.00000000e+00 2.50000000e-01 4.00000000e-01 8.28723933e-01 2.16743806e-01 3.90057687e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 - 1.00000000e+00 2.50000000e-01 4.00000000e-01 1.00000000e+00 3.75000000e-01 3.00000000e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 3.75000000e-01 5.00000000e-01 1.00000000e+00 2.50000000e-01 4.00000000e-01 - -7.50000000e-01 1.00000000e+00 4.00000000e-01 -6.25000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 - -5.00000000e-01 1.00000000e+00 2.00000000e-01 -6.25000000e-01 1.00000000e+00 3.00000000e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 - -7.50000000e-01 1.00000000e+00 4.00000000e-01 -7.19260786e-01 8.48233429e-01 4.09443061e-01 -7.42991857e-01 7.43456068e-01 4.63979586e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -6.62532395e-01 7.59053144e-01 2.85419897e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 - -1.00000000e+00 1.00000000e+00 2.00000000e-01 -8.75000000e-01 1.00000000e+00 3.00000000e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 - -1.00000000e+00 7.50000000e-01 4.00000000e-01 -8.95213666e-01 9.02822188e-01 4.30630020e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 - -1.00000000e+00 5.00000000e-01 2.00000000e-01 -8.36863156e-01 7.96356027e-01 3.24115978e-01 -7.50000000e-01 1.00000000e+00 4.00000000e-01 - 2.50000000e-01 1.00000000e+00 4.00000000e-01 1.25000000e-01 1.00000000e+00 3.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 1.25000000e-01 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 4.00000000e-01 - 2.31960145e-01 7.26079517e-01 4.47497104e-01 2.39184350e-01 8.42198596e-01 4.37995568e-01 2.50000000e-01 1.00000000e+00 4.00000000e-01 - 2.50000000e-01 1.00000000e+00 4.00000000e-01 3.75000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 - 5.00000000e-01 1.00000000e+00 2.00000000e-01 3.75000000e-01 1.00000000e+00 3.00000000e-01 2.50000000e-01 1.00000000e+00 4.00000000e-01 - 2.50000000e-01 1.00000000e+00 4.00000000e-01 3.93281510e-01 7.56814089e-01 2.84391635e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -7.50000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 - -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -8.75000000e-01 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 - -7.43450159e-01 -7.74711926e-01 4.35008075e-01 -9.15521026e-01 -9.17783808e-01 5.08382922e-01 -1.00000000e+00 -1.00000000e+00 6.00000000e-01 - -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -7.50000000e-01 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 - -7.50000000e-01 -1.00000000e+00 4.00000000e-01 -8.75000000e-01 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 6.00000000e-01 - -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -1.00000000e+00 4.00000000e-01 -1.00000000e+00 -1.00000000e+00 6.00000000e-01 - 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 7.50000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 - 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 8.75000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 - 7.30868887e-01 7.76702907e-01 5.01983983e-01 8.76503023e-01 9.10407593e-01 5.85986108e-01 1.00000000e+00 1.00000000e+00 6.00000000e-01 - 5.00000000e-01 1.00000000e+00 6.00000000e-01 7.50000000e-01 1.00000000e+00 6.00000000e-01 1.00000000e+00 1.00000000e+00 6.00000000e-01 - 1.00000000e+00 1.00000000e+00 6.00000000e-01 8.75000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 4.00000000e-01 - 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 1.00000000e+00 4.00000000e-01 1.00000000e+00 1.00000000e+00 2.00000000e-01 - 5.00000000e-01 -1.00000000e+00 6.00000000e-01 7.50000000e-01 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 - 7.50000000e-01 -1.00000000e+00 4.00000000e-01 8.75000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 - 1.00000000e+00 -1.00000000e+00 6.00000000e-01 8.90049246e-01 -8.75492183e-01 5.39961626e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 - 1.00000000e+00 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -7.50000000e-01 6.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 - 1.00000000e+00 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -8.75000000e-01 5.00000000e-01 1.00000000e+00 -7.50000000e-01 4.00000000e-01 - 1.00000000e+00 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 4.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 - -1.00000000e+00 1.00000000e+00 6.00000000e-01 -7.50000000e-01 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 - -7.50000000e-01 1.00000000e+00 4.00000000e-01 -8.75000000e-01 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 6.00000000e-01 - -7.42991857e-01 7.43456068e-01 4.63979586e-01 -9.10271126e-01 9.06408677e-01 4.98475433e-01 -1.00000000e+00 1.00000000e+00 6.00000000e-01 - -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 7.50000000e-01 6.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 - -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 8.75000000e-01 5.00000000e-01 -1.00000000e+00 7.50000000e-01 4.00000000e-01 - -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 1.00000000e+00 4.00000000e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 - -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.00000000e-01 -1.00000000e+00 -1.00000000e+00 8.00000000e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -7.50000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 - 2.75282575e-12 1.00000000e+00 8.00000000e-01 2.75281187e-12 1.00000000e+00 9.00000000e-01 2.75279799e-12 1.00000000e+00 1.00000000e+00 - 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.06459849e-12 7.50000000e-01 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 - 2.75279799e-12 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 7.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 - -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.50000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 - 5.00000000e-01 -1.00000000e+00 8.00000000e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 - 5.12293954e-01 -5.47020830e-01 8.46585454e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 - 5.00000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 9.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 - -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 2.75279799e-12 1.00000000e+00 4.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 - 5.12293954e-01 -5.47020830e-01 8.46585454e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 5.00000000e-01 -5.00000000e-01 1.00000000e+00 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 -1.14296843e-02 7.53313489e-01 6.07258766e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -7.50000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 -1.03830914e-01 8.79215444e-01 4.91050145e-01 -2.53733289e-01 7.78555773e-01 5.11047110e-01 - 5.00000000e-01 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 - -2.75279799e-12 -1.00000000e+00 6.00000000e-01 -2.75279799e-12 -1.00000000e+00 4.00000000e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 - 5.12293954e-01 -5.47020830e-01 8.46585454e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 - 5.08559128e-01 4.68350764e-02 8.47523900e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 3.60221343e-02 -7.72494852e-01 6.10765349e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 - 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 5.00000000e-01 -1.37645451e-12 1.00000000e+00 - -2.75279799e-12 -1.00000000e+00 6.00000000e-01 8.31090865e-02 -8.99615409e-01 5.29148086e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 - 5.00000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -2.50000000e-01 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 - 5.00000000e-01 -1.37645451e-12 1.00000000e+00 2.50000000e-01 -6.88227253e-13 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 8.76800840e-02 9.23649917e-01 5.24474789e-01 2.31960145e-01 7.26079517e-01 4.47497104e-01 - 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 - 5.36295327e-01 5.28286707e-01 7.83714183e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 - -2.95099817e-01 -7.31729472e-01 4.69924715e-01 -1.59583432e-01 -9.05275769e-01 5.15861104e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 - 5.36295327e-01 5.28286707e-01 7.83714183e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 5.00000000e-01 5.00000000e-01 1.00000000e+00 - 1.00000000e+00 -2.75279799e-12 6.00000000e-01 7.22088337e-01 1.89298349e-02 3.65398368e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 - 5.00000000e-01 -1.37645451e-12 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 7.17970008e-01 -1.41566063e-02 5.58387791e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 - 5.00000000e-01 5.00000000e-01 1.00000000e+00 2.50000000e-01 5.00000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 - 1.00000000e+00 -2.75279799e-12 6.00000000e-01 8.30963348e-01 1.69906852e-01 5.13209284e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 - 5.00000000e-01 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 7.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 2.75279799e-12 6.00000000e-01 -7.13479476e-01 2.13764413e-02 4.40590378e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 - 5.36295327e-01 5.28286707e-01 7.83714183e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -7.73235639e-01 4.15095151e-02 6.07357715e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 - 5.00000000e-01 1.00000000e+00 8.00000000e-01 2.50000000e-01 1.00000000e+00 8.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 2.75279799e-12 6.00000000e-01 -8.53792461e-01 -9.54357200e-02 5.81805649e-01 -7.69033054e-01 -2.83268701e-01 5.03354564e-01 - 5.00000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 9.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 - 5.00000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 7.52449599e-01 4.50167886e-01 3.95793107e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 1.00000000e+00 -2.75279799e-12 1.00000000e+00 7.50000000e-01 -2.06462625e-12 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 7.23575875e-01 5.10278343e-01 6.17869689e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 7.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 - 7.30868887e-01 7.76702907e-01 5.01983983e-01 8.44891524e-01 6.16309254e-01 4.91464941e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 - 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 2.50000000e-01 8.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 - -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -7.41539722e-01 -4.75425901e-01 3.85859941e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 - 1.00000000e+00 5.00000000e-01 8.00000000e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 - -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -7.59878478e-01 -5.24557688e-01 6.33305260e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 - 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 5.00000000e-01 9.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 - -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -8.91748819e-01 -5.83131968e-01 5.25603037e-01 -7.43450159e-01 -7.74711926e-01 4.35008075e-01 - 1.00000000e+00 -2.75279799e-12 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 1.00000000e+00 7.50000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 8.64191124e-01 4.12913608e-01 5.17872579e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 - 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 1.00000000e+00 7.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 - 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 7.50000000e-01 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 - -7.69033054e-01 -2.83268701e-01 5.03354564e-01 -8.81118061e-01 -4.21240183e-01 5.62746756e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 - 1.00000000e+00 1.00000000e+00 8.00000000e-01 7.50000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 - 1.00000000e+00 1.00000000e+00 8.00000000e-01 1.00000000e+00 1.00000000e+00 9.00000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 7.59075207e-01 -3.72980794e-01 3.49600855e-01 1.00000000e+00 -2.50000000e-01 4.00000000e-01 - 1.00000000e+00 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 - -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 - -2.53733289e-01 7.78555773e-01 5.11047110e-01 -3.81269810e-01 9.00465289e-01 5.07653684e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 - 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 -2.75281187e-12 9.00000000e-01 1.00000000e+00 -2.75279799e-12 1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 6.00000000e-01 3.69097495e-01 -8.89474205e-01 5.38846813e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 - 1.00000000e+00 -2.75282575e-12 8.00000000e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 - 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -2.50000000e-01 8.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 - 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 -2.75281187e-12 7.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 - 5.00000000e-01 -1.00000000e+00 6.00000000e-01 6.15707543e-01 -9.07792186e-01 4.93227974e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 - 1.00000000e+00 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.42189289e-01 -7.20003365e-01 6.43416688e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 - 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 4.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 - 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -5.00000000e-01 9.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 - 1.00000000e+00 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 9.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 - -5.00000000e-01 1.00000000e+00 6.00000000e-01 -6.08997635e-01 8.56646650e-01 5.05176905e-01 -7.42991857e-01 7.43456068e-01 4.63979586e-01 - 1.00000000e+00 -5.00000000e-01 8.00000000e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 - -5.00000000e-01 1.00000000e+00 6.00000000e-01 -4.56240197e-01 7.11292251e-01 5.92377271e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 - 1.00000000e+00 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -7.50000000e-01 8.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 - -5.00000000e-01 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 4.00000000e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 - 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -5.00000000e-01 7.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 - 5.00000000e-01 -1.00000000e+00 8.00000000e-01 7.50000000e-01 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 - 1.00000000e+00 -2.75279799e-12 6.00000000e-01 9.19924110e-01 -1.63903990e-01 5.63448121e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 - 1.00000000e+00 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -1.00000000e+00 7.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 - -1.00000000e+00 2.75279799e-12 6.00000000e-01 -8.51271122e-01 9.63264946e-02 5.72985349e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 - 5.00000000e-01 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 - 2.75282575e-12 1.00000000e+00 8.00000000e-01 -2.50000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 - 4.04523035e-02 5.23334239e-01 7.85315811e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 2.75281187e-12 1.00000000e+00 7.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 - 1.37639899e-12 5.00000000e-01 1.00000000e+00 -2.50000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 - 0.00000000e+00 0.00000000e+00 1.00000000e+00 6.88199497e-13 2.50000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 - 4.04523035e-02 5.23334239e-01 7.85315811e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 1.37639899e-12 5.00000000e-01 1.00000000e+00 - 4.04523035e-02 5.23334239e-01 7.85315811e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 - -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 - -1.11217671e-02 4.85990029e-01 5.72847359e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 - 0.00000000e+00 0.00000000e+00 1.00000000e+00 -2.50000000e-01 6.88199497e-13 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 - -1.37639899e-12 -5.00000000e-01 1.00000000e+00 -6.88199497e-13 -2.50000000e-01 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 - -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 0.00000000e+00 0.00000000e+00 1.00000000e+00 - -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 - 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 - -4.84577644e-02 4.06855736e-02 5.60664410e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 - -1.37639899e-12 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 - -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -2.06459849e-12 -7.50000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 - 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 - -2.75282575e-12 -1.00000000e+00 8.00000000e-01 -2.75281187e-12 -1.00000000e+00 9.00000000e-01 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 - 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 - -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 - -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.50000000e-01 -1.00000000e+00 8.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 - -2.75279799e-12 -1.00000000e+00 6.00000000e-01 -2.75281187e-12 -1.00000000e+00 7.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 - -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 - -5.00000000e-01 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 - -1.00000000e+00 1.00000000e+00 8.00000000e-01 -1.00000000e+00 1.00000000e+00 9.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 - -5.00000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 7.50000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 - -5.00000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 9.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 - -1.00000000e+00 1.00000000e+00 8.00000000e-01 -1.00000000e+00 7.50000000e-01 8.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 - -5.00000000e-01 1.00000000e+00 8.00000000e-01 -7.50000000e-01 1.00000000e+00 8.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 1.00000000e+00 7.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 - -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 - -5.00000000e-01 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 7.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 - -5.00000000e-01 5.00000000e-01 1.00000000e+00 -7.50000000e-01 5.00000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 - -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 5.00000000e-01 9.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 - -5.00000000e-01 1.37639899e-12 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 - -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -5.00000000e-01 5.00000000e-01 1.00000000e+00 - -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 2.50000000e-01 8.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 - -4.90548406e-01 5.30132674e-01 8.30068751e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 - -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 5.00000000e-01 7.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 - -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 - -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 - -5.00000000e-01 1.37639899e-12 1.00000000e+00 -7.50000000e-01 2.06459849e-12 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 - -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 2.75281187e-12 9.00000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 - -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.50000000e-01 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 - -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -5.00000000e-01 1.37639899e-12 1.00000000e+00 - -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 -2.50000000e-01 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 - -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 - -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 2.75281187e-12 7.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 - -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 - -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 - -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 - -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 9.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 - -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 - -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 9.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 - -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -1.00000000e+00 9.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 - -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -7.50000000e-01 8.00000000e-01 -1.00000000e+00 -1.00000000e+00 8.00000000e-01 - -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 - -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 - -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 - -7.43450159e-01 -7.74711926e-01 4.35008075e-01 -8.45346644e-01 -7.26859422e-01 4.13013631e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 - -7.43450159e-01 -7.74711926e-01 4.35008075e-01 -7.86274781e-01 -8.50573849e-01 3.93269387e-01 -7.50000000e-01 -1.00000000e+00 4.00000000e-01 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -6.12836697e-01 -8.35449761e-01 3.36074783e-01 -7.43450159e-01 -7.74711926e-01 4.35008075e-01 - -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -6.67838065e-01 -6.50986987e-01 5.24036197e-01 -7.43450159e-01 -7.74711926e-01 4.35008075e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -6.27913459e-01 -8.67915630e-01 5.86331976e-01 -7.43450159e-01 -7.74711926e-01 4.35008075e-01 - -7.43450159e-01 -7.74711926e-01 4.35008075e-01 -5.93191911e-01 -6.52396380e-01 3.12067422e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 - -7.50000000e-01 -1.00000000e+00 4.00000000e-01 -6.25000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 4.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -3.27751619e-01 -8.85972387e-01 4.95570598e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 - -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.48640676e-01 -7.77286265e-01 6.36669671e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -5.07600161e-01 -7.12490447e-01 3.91725280e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 - 7.30868887e-01 7.76702907e-01 5.01983983e-01 8.80398505e-01 7.35071987e-01 4.02643311e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 - 7.30868887e-01 7.76702907e-01 5.01983983e-01 8.62207738e-01 5.79521087e-01 3.78861936e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 - 7.50000000e-01 1.00000000e+00 4.00000000e-01 7.74266309e-01 8.26607771e-01 4.38987081e-01 7.30868887e-01 7.76702907e-01 5.01983983e-01 - 7.30868887e-01 7.76702907e-01 5.01983983e-01 6.03301128e-01 8.61647280e-01 3.26242036e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 - 7.30868887e-01 7.76702907e-01 5.01983983e-01 6.04373699e-01 6.57695728e-01 5.25342732e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 - 7.30868887e-01 7.76702907e-01 5.01983983e-01 6.27345330e-01 8.95365364e-01 5.23438494e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 - 7.30868887e-01 7.76702907e-01 5.01983983e-01 6.03625973e-01 6.65787715e-01 3.08252079e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 7.50000000e-01 1.00000000e+00 4.00000000e-01 6.25000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 - 5.00000000e-01 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 4.00000000e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 - 5.00000000e-01 1.00000000e+00 6.00000000e-01 4.05187694e-01 9.19116705e-01 5.12301501e-01 2.31960145e-01 7.26079517e-01 4.47497104e-01 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 5.17477952e-01 7.34861266e-01 5.67509897e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 - 5.00000000e-01 1.00000000e+00 6.00000000e-01 4.86665407e-01 7.82107660e-01 3.79119071e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -5.97413999e-01 5.75011831e-01 3.44752746e-01 -7.42991857e-01 7.43456068e-01 4.63979586e-01 - -7.42991857e-01 7.43456068e-01 4.63979586e-01 -6.71913014e-01 9.11727579e-01 3.05236110e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 -6.43149611e-01 6.19218547e-01 4.91951702e-01 -7.42991857e-01 7.43456068e-01 4.63979586e-01 - -7.42991857e-01 7.43456068e-01 4.63979586e-01 -8.84995383e-01 6.32385336e-01 5.73176214e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 - -7.42991857e-01 7.43456068e-01 4.63979586e-01 -9.15005514e-01 6.38336091e-01 3.24843630e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 - -7.63437341e-01 2.29532918e-01 4.45102704e-01 -8.39525224e-01 4.22716168e-01 5.28994619e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 -7.45184141e-01 4.51483100e-01 5.88051785e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 - -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 4.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 - 7.50000000e-01 -1.00000000e+00 4.00000000e-01 7.12431037e-01 -8.84486081e-01 4.61017027e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 - 7.89872088e-01 -7.06620648e-01 4.93373476e-01 8.58793367e-01 -7.13808628e-01 4.40709388e-01 1.00000000e+00 -7.50000000e-01 4.00000000e-01 - 7.89872088e-01 -7.06620648e-01 4.93373476e-01 8.84694395e-01 -5.86961101e-01 3.36779377e-01 1.00000000e+00 -5.00000000e-01 2.00000000e-01 - 5.00000000e-01 -1.00000000e+00 2.00000000e-01 6.54371460e-01 -9.01134752e-01 3.53485877e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.76966254e-01 -5.86807688e-01 5.48429208e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 - 1.00000000e+00 -5.00000000e-01 6.00000000e-01 8.29294769e-01 -5.82408177e-01 5.73194697e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 6.72384965e-01 -6.20513799e-01 3.45890435e-01 7.89872088e-01 -7.06620648e-01 4.93373476e-01 - 1.00000000e+00 -7.50000000e-01 4.00000000e-01 1.00000000e+00 -6.25000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 4.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 6.00000000e-01 8.73270787e-01 -4.02444866e-01 5.27755700e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 - 1.00000000e+00 -5.00000000e-01 6.00000000e-01 7.11398136e-01 -5.13660148e-01 5.52310014e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 - 1.00000000e+00 -5.00000000e-01 6.00000000e-01 7.52452054e-01 -5.18482006e-01 3.62995040e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 - 1.00000000e+00 -7.50000000e-01 4.00000000e-01 8.49875951e-01 -8.36235032e-01 4.05987207e-01 7.50000000e-01 -1.00000000e+00 4.00000000e-01 - 1.00000000e+00 -7.50000000e-01 4.00000000e-01 1.00000000e+00 -6.25000000e-01 3.00000000e-01 1.00000000e+00 -5.00000000e-01 2.00000000e-01 - 1.00000000e+00 -7.50000000e-01 4.00000000e-01 1.00000000e+00 -8.75000000e-01 3.00000000e-01 1.00000000e+00 -1.00000000e+00 2.00000000e-01 - 7.50000000e-01 -1.00000000e+00 4.00000000e-01 6.23281300e-01 -7.02445288e-01 3.39155900e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 - 7.50000000e-01 -1.00000000e+00 4.00000000e-01 6.25000000e-01 -1.00000000e+00 3.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 - 1.00000000e+00 -1.00000000e+00 2.00000000e-01 8.75000000e-01 -1.00000000e+00 3.00000000e-01 7.50000000e-01 -1.00000000e+00 4.00000000e-01 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 9.11133699e-01 -7.62848934e-01 3.13636356e-01 7.50000000e-01 -1.00000000e+00 4.00000000e-01 - 2.70125392e-01 2.53421154e-01 3.09013047e-01 1.39125846e-01 1.01897721e-01 4.68954444e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 - -4.84577644e-02 4.06855736e-02 5.60664410e-01 -2.39636276e-02 2.31604414e-01 6.19527443e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - -4.84577644e-02 4.06855736e-02 5.60664410e-01 9.18490715e-02 -7.59212279e-02 4.66188765e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 2.01691136e-01 -4.79247863e-02 5.66882667e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 - -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.02499262e-02 -2.79583390e-01 6.39593268e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 - -2.32508956e-01 -2.34291873e-01 3.74551790e-01 -1.14128806e-01 -1.09831503e-01 4.47860812e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 - -2.58094392e-01 2.82537068e-01 3.64273615e-01 -1.43161162e-01 9.94492567e-02 4.29784384e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 - -4.84577644e-02 4.06855736e-02 5.60664410e-01 -2.61163068e-02 2.54994411e-03 3.60328829e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -2.94704534e-01 1.44582572e-02 5.67814283e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 - 2.70125392e-01 2.53421154e-01 3.09013047e-01 8.57349743e-02 4.00586483e-01 2.82372301e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 - 2.70125392e-01 2.53421154e-01 3.09013047e-01 3.97416439e-01 3.51039393e-01 2.49802633e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 2.70125392e-01 2.53421154e-01 3.09013047e-01 1.34492422e-01 4.11104930e-01 4.92640097e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - 2.70125392e-01 2.53421154e-01 3.09013047e-01 1.13838196e-01 1.56109587e-01 3.00622060e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 3.73829324e-01 3.49649613e-01 4.78341518e-01 2.70125392e-01 2.53421154e-01 3.09013047e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 3.27337149e-01 1.33340882e-01 4.96607554e-01 2.70125392e-01 2.53421154e-01 3.09013047e-01 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 3.49452181e-01 1.16803918e-01 3.21844212e-01 2.70125392e-01 2.53421154e-01 3.09013047e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -3.77044721e-01 -3.86221888e-01 2.70332292e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -1.22875598e-01 -3.74472942e-01 2.92983114e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -1.66073691e-01 -3.83755514e-01 4.69294639e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 - -2.32508956e-01 -2.34291873e-01 3.74551790e-01 -1.51879593e-01 -1.13394800e-01 2.51237018e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.04680366e-01 -1.23819144e-01 5.19784144e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -3.42657569e-01 -1.46554825e-01 2.63151534e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 - -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -4.05745810e-01 -3.68923054e-01 4.50956452e-01 -2.32508956e-01 -2.34291873e-01 3.74551790e-01 - 2.25942245e-01 -2.63270065e-01 3.92407990e-01 9.62199016e-02 -3.70130984e-01 2.71639510e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.08644786e-01 -1.52571447e-01 2.65396654e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 3.85671313e-01 -9.68735403e-02 4.37256185e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 1.60008278e-01 -1.46130163e-01 2.33280747e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 3.39512647e-01 -3.37790850e-01 4.98848787e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 8.86874820e-02 -3.37138511e-01 4.69088678e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 3.63091097e-01 -3.99212777e-01 2.46760730e-01 2.25942245e-01 -2.63270065e-01 3.92407990e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -4.14379652e-01 1.45410468e-01 2.38242692e-01 -2.58094392e-01 2.82537068e-01 3.64273615e-01 - -2.58094392e-01 2.82537068e-01 3.64273615e-01 -1.28316466e-01 3.77307184e-01 3.19903388e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.04720631e-01 7.85479119e-02 4.35730162e-01 -2.58094392e-01 2.82537068e-01 3.64273615e-01 - -2.58094392e-01 2.82537068e-01 3.64273615e-01 -1.45010052e-01 1.11739271e-01 2.84118197e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - -2.58094392e-01 2.82537068e-01 3.64273615e-01 -1.30889471e-01 3.54143146e-01 4.97335343e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - -2.58094392e-01 2.82537068e-01 3.64273615e-01 -3.60603414e-01 3.70275001e-01 2.71740306e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 - -2.58094392e-01 2.82537068e-01 3.64273615e-01 -3.72824999e-01 4.10631086e-01 4.68741544e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 - 2.31960145e-01 7.26079517e-01 4.47497104e-01 1.55468689e-01 6.50945360e-01 3.45184928e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 - 2.31960145e-01 7.26079517e-01 4.47497104e-01 1.24274401e-01 9.08115886e-01 3.45737243e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 - 2.31960145e-01 7.26079517e-01 4.47497104e-01 4.12336473e-01 6.07010613e-01 5.61283929e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 - 2.31960145e-01 7.26079517e-01 4.47497104e-01 1.59819553e-01 6.03132798e-01 5.76381256e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - 2.31960145e-01 7.26079517e-01 4.47497104e-01 3.26162261e-01 6.18440736e-01 3.41066073e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 6.45236924e-01 -3.37176645e-01 3.11314218e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 6.37565812e-01 -8.99126577e-02 4.94571251e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 5.79787620e-01 -9.93624045e-02 3.49048569e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 6.28022276e-01 -3.66800162e-01 5.00071292e-01 7.73208263e-01 -2.59692901e-01 4.77175444e-01 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -3.57653204e-01 -8.99557346e-01 3.73406811e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 - -2.95099817e-01 -7.31729472e-01 4.69924715e-01 -1.28527160e-01 -9.02324432e-01 3.24089902e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -3.42720755e-01 -6.14657542e-01 3.77824468e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -1.66991032e-01 -6.07879220e-01 5.30297600e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -1.68236393e-01 -6.73159091e-01 2.88154228e-01 -2.95099817e-01 -7.31729472e-01 4.69924715e-01 - -2.95099817e-01 -7.31729472e-01 4.69924715e-01 -3.96888182e-01 -5.76030582e-01 5.25991615e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -6.70680402e-01 1.07713535e-01 3.63359994e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 - -7.63437341e-01 2.29532918e-01 4.45102704e-01 -8.86310575e-01 3.89840639e-01 3.22478178e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 -6.42802234e-01 3.74779155e-01 5.09006141e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -6.62585200e-01 1.51780949e-01 5.00128591e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -6.50304469e-01 3.29004953e-01 3.75307981e-01 -7.63437341e-01 2.29532918e-01 4.45102704e-01 - -1.00000000e+00 2.75279799e-12 2.00000000e-01 -9.23766683e-01 -1.69627151e-01 3.78029105e-01 -7.69033054e-01 -2.83268701e-01 5.03354564e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -5.89570057e-01 -4.09844408e-01 3.67512199e-01 -7.69033054e-01 -2.83268701e-01 5.03354564e-01 - -7.69033054e-01 -2.83268701e-01 5.03354564e-01 -6.03596058e-01 -1.51376554e-01 5.18725201e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 - -7.69033054e-01 -2.83268701e-01 5.03354564e-01 -6.14344994e-01 -3.61691618e-01 5.06517412e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 - -7.69033054e-01 -2.83268701e-01 5.03354564e-01 -6.27377749e-01 -1.10672305e-01 3.45252783e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -2.11700863e-01 4.59103482e-02 4.48800936e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.64893153e-01 2.04810635e-01 5.59668067e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.69076448e-01 2.08350687e-01 3.58358216e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.24385873e-01 3.18962695e-02 3.71925747e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.82020794e-01 -2.00196725e-01 6.17411358e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 - -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.23809598e-01 -4.77716802e-01 4.44678746e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -2.04187698e-01 -5.48263988e-01 6.12094029e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -2.31419986e-01 -4.73379654e-01 3.80609567e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.47963746e-01 -2.53564895e-01 3.98699997e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 - 7.04885116e-01 2.42741400e-01 4.57337152e-01 8.66039813e-01 3.74035083e-01 3.28660329e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 8.90031279e-01 9.60305867e-02 3.28600186e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 - 7.04885116e-01 2.42741400e-01 4.57337152e-01 6.74356276e-01 3.86465119e-01 3.59998841e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 5.99507322e-01 4.04333519e-01 5.58025930e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 6.40342586e-01 9.12920568e-02 3.25759566e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 6.38419739e-01 1.52495860e-01 5.42853807e-01 7.04885116e-01 2.42741400e-01 4.57337152e-01 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 5.02086847e-01 5.36915411e-01 3.91623568e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 2.93080452e-01 4.76318217e-01 6.15661245e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.54102049e-01 2.74010313e-01 5.73290265e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.96008875e-01 2.98719741e-01 3.61220283e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 2.06452153e-01 9.86255939e-03 3.89644671e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 5.17509951e-01 -2.15134087e-01 5.98024945e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 4.74853619e-01 -2.46084080e-02 3.68594431e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 - 2.50599317e-01 -7.83894535e-01 5.11804036e-01 9.82327943e-02 -6.72035342e-01 3.72037181e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 - 2.50599317e-01 -7.83894535e-01 5.11804036e-01 3.28121624e-01 -8.49551321e-01 3.46102016e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 7.66356282e-02 -8.78053588e-01 3.05691362e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 3.29756088e-01 -6.25787358e-01 5.40735350e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 - 2.50599317e-01 -7.83894535e-01 5.11804036e-01 3.88510154e-01 -5.89461586e-01 3.63895231e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 1.13736630e-01 -6.46903042e-01 5.76805303e-01 2.50599317e-01 -7.83894535e-01 5.11804036e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.35653026e-01 -7.76819330e-01 4.09917997e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.35932372e-01 -2.58298135e-01 4.22317249e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 2.10835765e-01 -4.82328769e-01 6.19792310e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.35318969e-01 -5.37877144e-01 3.62250274e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -3.89726360e-02 -7.67790024e-01 4.34619372e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -3.59391308e-02 -2.03257689e-01 4.35259277e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 1.02315219e-02 -5.37150482e-01 4.20471829e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 2.61416281e-01 -5.45905843e-01 3.95165042e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 - -2.53733289e-01 7.78555773e-01 5.11047110e-01 -8.25167220e-02 6.73312728e-01 3.67272905e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 - -2.53733289e-01 7.78555773e-01 5.11047110e-01 -4.06390225e-01 8.84851733e-01 3.68513364e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 - -2.53733289e-01 7.78555773e-01 5.11047110e-01 -8.07903092e-02 9.11573619e-01 2.97237482e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 - -2.53733289e-01 7.78555773e-01 5.11047110e-01 -8.58820300e-02 6.50054241e-01 5.67754803e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - -2.53733289e-01 7.78555773e-01 5.11047110e-01 -3.98019160e-01 6.61778683e-01 5.27599653e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -3.83713340e-01 5.79290527e-01 2.90966670e-01 -2.53733289e-01 7.78555773e-01 5.11047110e-01 - -1.11217671e-02 4.85990029e-01 5.72847359e-01 -4.17549435e-02 4.68794929e-01 3.99704026e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 - -1.11217671e-02 4.85990029e-01 5.72847359e-01 -8.62433715e-03 7.68046292e-01 3.62598309e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 4.72603647e-02 2.60598065e-01 3.58691736e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - -1.11217671e-02 4.85990029e-01 5.72847359e-01 2.63667927e-01 5.34896477e-01 4.03972542e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -2.77106172e-01 5.34616959e-01 4.09428800e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 -2.41034104e-01 5.20378300e-01 6.02699285e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.07475027e-01 7.28034881e-01 3.86127502e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 -7.98955491e-01 5.10214676e-01 3.87138041e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.75265423e-01 5.04451697e-01 3.87698574e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 - 7.50000000e-01 1.00000000e+00 4.00000000e-01 8.45475195e-01 8.84627708e-01 3.66595319e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 - 7.50000000e-01 1.00000000e+00 4.00000000e-01 6.25000000e-01 1.00000000e+00 3.00000000e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 - 7.50000000e-01 1.00000000e+00 4.00000000e-01 8.75000000e-01 1.00000000e+00 3.00000000e-01 1.00000000e+00 1.00000000e+00 2.00000000e-01 - 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 6.25000000e-01 3.00000000e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 - 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 8.75000000e-01 3.00000000e-01 1.00000000e+00 7.50000000e-01 4.00000000e-01 - 1.00000000e+00 7.50000000e-01 4.00000000e-01 7.26423473e-01 8.47808821e-01 3.23373747e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -7.25894247e-01 -6.33471200e-01 3.05759085e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 - -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -6.25000000e-01 3.00000000e-01 -1.00000000e+00 -7.50000000e-01 4.00000000e-01 - -1.00000000e+00 -7.50000000e-01 4.00000000e-01 -8.41359974e-01 -8.55291732e-01 4.45078619e-01 -7.50000000e-01 -1.00000000e+00 4.00000000e-01 - -1.00000000e+00 -7.50000000e-01 4.00000000e-01 -1.00000000e+00 -8.75000000e-01 3.00000000e-01 -1.00000000e+00 -1.00000000e+00 2.00000000e-01 - -1.00000000e+00 -7.50000000e-01 4.00000000e-01 -7.35636166e-01 -9.14471411e-01 2.96486738e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -6.25000000e-01 -1.00000000e+00 3.00000000e-01 -7.50000000e-01 -1.00000000e+00 4.00000000e-01 - -7.50000000e-01 -1.00000000e+00 4.00000000e-01 -8.75000000e-01 -1.00000000e+00 3.00000000e-01 -1.00000000e+00 -1.00000000e+00 2.00000000e-01 - 1.00000000e+00 1.00000000e+00 2.00000000e-01 7.50000000e-01 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 - 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e-01 1.00000000e+00 1.00000000e+00 -5.31241717e-13 - 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 7.50000000e-01 2.00000000e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 - 1.00000000e+00 1.00000000e+00 -5.31241717e-13 7.50000000e-01 1.00000000e+00 -5.31234778e-13 5.00000000e-01 1.00000000e+00 -5.31227839e-13 - 1.00000000e+00 1.00000000e+00 -5.31241717e-13 1.00000000e+00 1.00000000e+00 -1.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 - 1.00000000e+00 1.00000000e+00 -5.31241717e-13 1.00000000e+00 7.50000000e-01 -5.31241717e-13 1.00000000e+00 5.00000000e-01 -5.31241717e-13 - 1.00000000e+00 5.00000000e-01 2.00000000e-01 7.76674569e-01 7.26859181e-01 1.72211633e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 - 1.00000000e+00 5.00000000e-01 2.00000000e-01 7.09785534e-01 5.22335130e-01 2.05561253e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 1.00000000e+00 5.00000000e-01 -5.31241717e-13 - 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 2.50000000e-01 2.00000000e-01 1.00000000e+00 -2.75279799e-12 2.00000000e-01 - 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.99664140e-01 7.72204924e-01 4.51198643e-03 5.00000000e-01 1.00000000e+00 -5.31227839e-13 - 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.87671700e-01 5.18477684e-01 2.65507873e-02 4.74690996e-01 4.58616508e-01 1.67721786e-02 - 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 5.00000000e-01 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 2.50000000e-01 -5.31234778e-13 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 7.52525595e-01 2.86581382e-01 1.66552045e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 7.25774237e-01 3.88941110e-02 1.75910664e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.50000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 2.00000000e-01 - 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 7.46866862e-01 2.99271142e-01 3.61728318e-02 4.74690996e-01 4.58616508e-01 1.67721786e-02 - 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 7.57978864e-01 -4.51872992e-02 -3.48262680e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 - 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -2.50000000e-01 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 7.47570636e-01 -2.54779531e-01 1.59569447e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 7.78210727e-01 -4.61807554e-01 2.30335534e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -7.50000000e-01 2.00000000e-01 1.00000000e+00 -1.00000000e+00 2.00000000e-01 - 1.00000000e+00 -1.00000000e+00 2.00000000e-01 7.14522757e-01 -7.25196948e-01 2.36606326e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 - 1.00000000e+00 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 - 5.00000000e-01 -1.00000000e+00 2.00000000e-01 7.50000000e-01 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 2.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 7.93299243e-01 -2.90391319e-01 -3.62303831e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 7.54486357e-01 -4.65779570e-01 4.65500115e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -7.50000000e-01 -5.31234778e-13 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 - 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 7.26655468e-01 -7.89341408e-01 -3.68835602e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -1.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 7.50000000e-01 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 - 5.00000000e-01 1.00000000e+00 2.00000000e-01 5.28371569e-01 7.31981280e-01 1.80526485e-01 4.73613416e-01 4.84779377e-01 2.21525496e-01 - 5.00000000e-01 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 - 5.00000000e-01 1.00000000e+00 2.00000000e-01 2.50000000e-01 1.00000000e+00 2.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 - 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.35060517e-01 7.11084213e-01 3.07005869e-02 4.74690996e-01 4.58616508e-01 1.67721786e-02 - 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.00000000e-01 1.00000000e+00 -1.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 - 5.00000000e-01 1.00000000e+00 -5.31227839e-13 2.50000000e-01 1.00000000e+00 -5.31227839e-13 2.75282575e-12 1.00000000e+00 -5.31227839e-13 - 4.73613416e-01 4.84779377e-01 2.21525496e-01 2.27310774e-01 7.50367447e-01 1.51428925e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 - 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 - 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.41273947e-01 2.03808786e-01 1.77879250e-01 5.04393824e-01 -1.33182910e-02 2.48245576e-01 - 4.73613416e-01 4.84779377e-01 2.21525496e-01 2.73566555e-01 4.76029587e-01 1.73172971e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 - 4.74690996e-01 4.58616508e-01 1.67721786e-02 2.25211425e-01 7.87891962e-01 -9.39040992e-03 2.75282575e-12 1.00000000e+00 -5.31227839e-13 - 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.66910018e-01 2.73420339e-01 -3.10515091e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - 4.74690996e-01 4.58616508e-01 1.67721786e-02 2.50541089e-01 4.67220969e-01 2.82588122e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 2.40441268e-01 2.83346403e-01 1.50696662e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 5.43805201e-01 -2.74415027e-01 2.11309501e-01 5.27304788e-01 -4.85643487e-01 2.26288656e-01 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 2.23011615e-01 1.94781990e-02 2.06619987e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - 5.26291307e-01 -4.64778992e-02 3.48283959e-02 2.13344831e-01 2.10777877e-01 4.68667057e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 - 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - 5.26291307e-01 -4.64778992e-02 3.48283959e-02 5.30532753e-01 -2.53759366e-01 -1.51549915e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - 5.26291307e-01 -4.64778992e-02 3.48283959e-02 2.14876777e-01 2.66014695e-02 1.95716027e-03 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 2.05807723e-01 -2.92057599e-01 2.49152401e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 5.12062842e-01 -7.55583018e-01 1.82592331e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 2.88915450e-01 -4.61771744e-01 1.74109319e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 - 5.00000000e-01 -1.00000000e+00 2.00000000e-01 2.77497180e-01 -7.19878125e-01 1.95986034e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 - 5.00000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 2.50000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 - 5.46530874e-01 -5.43099550e-01 4.99998474e-02 2.59869475e-01 -2.70162767e-01 4.79134093e-02 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 - 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - 5.46530874e-01 -5.43099550e-01 4.99998474e-02 5.05907645e-01 -7.32869598e-01 2.79303667e-02 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 - 5.46530874e-01 -5.43099550e-01 4.99998474e-02 2.31820423e-01 -4.57386697e-01 -3.55934140e-02 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 - 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 2.23826516e-01 -7.74391768e-01 1.31086499e-02 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 - 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 2.50000000e-01 -1.00000000e+00 -5.31234778e-13 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 - 2.75279799e-12 1.00000000e+00 2.00000000e-01 -3.53943667e-02 7.95048004e-01 1.62037283e-01 -5.74150632e-03 4.80713344e-01 2.07813459e-01 - 2.75279799e-12 1.00000000e+00 2.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 2.75282575e-12 1.00000000e+00 -5.31227839e-13 - 2.75279799e-12 1.00000000e+00 2.00000000e-01 -2.50000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 - 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -3.45519822e-02 7.37504497e-01 1.05620299e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 - 2.75282575e-12 1.00000000e+00 -5.31227839e-13 2.75281187e-12 1.00000000e+00 -1.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 - 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -2.50000000e-01 1.00000000e+00 -5.31234778e-13 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 - -5.74150632e-03 4.80713344e-01 2.07813459e-01 -2.53227207e-01 7.14537335e-01 2.02758030e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 - -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 - -5.74150632e-03 4.80713344e-01 2.07813459e-01 -2.43345247e-02 2.90903903e-01 2.44414284e-01 6.74274859e-03 2.44560250e-02 1.94432050e-01 - -5.74150632e-03 4.80713344e-01 2.07813459e-01 -2.42505771e-01 5.27802195e-01 1.79263697e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 - -2.11337044e-02 5.20175598e-01 1.44520351e-02 -2.28102848e-01 7.22658326e-01 1.37320272e-03 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 - -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - -2.11337044e-02 5.20175598e-01 1.44520351e-02 -4.76026217e-02 2.82276674e-01 3.84082449e-03 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 - -2.11337044e-02 5.20175598e-01 1.44520351e-02 -2.19558957e-01 4.50483189e-01 4.59326437e-02 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 -2.70734059e-01 2.91861282e-01 2.01535922e-01 -4.68269906e-01 5.44864759e-01 1.91424881e-01 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 6.10419889e-03 -2.40973228e-01 2.00005720e-01 6.18440419e-03 -5.20601584e-01 1.60809417e-01 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 -2.45636086e-01 -6.53486695e-03 1.74146254e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 - -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -2.12499061e-01 2.63559960e-01 2.50309024e-02 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 - -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 - -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -2.58295668e-02 -2.30858335e-01 -3.01243594e-02 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 - -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -2.63967420e-01 3.93850057e-02 3.28850264e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -2.42179029e-01 -2.59704634e-01 1.80899690e-01 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 3.87532026e-02 -7.48895411e-01 2.03633120e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -2.79454677e-01 -5.37813444e-01 2.02229801e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -2.83997912e-01 -7.90354142e-01 2.38104026e-01 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -2.50000000e-01 -1.00000000e+00 2.00000000e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 - -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 -2.03459879e-01 -2.88663342e-01 4.05551003e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 - -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.57478130e-02 -7.19804803e-01 -2.81200514e-02 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 - -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 -2.62569079e-01 -5.25838878e-01 -5.68085725e-03 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 - -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.85273885e-01 -7.11165751e-01 -3.61668105e-02 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 - -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -2.50000000e-01 -1.00000000e+00 -5.31227839e-13 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 - -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -2.12499061e-01 2.63559960e-01 2.50309024e-02 -2.15535591e-01 2.61618867e-01 -7.11489469e-02 -2.65034132e-01 2.49773560e-01 -1.54940107e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 - 0.00000000e+00 0.00000000e+00 1.00000000e+00 2.50000000e-01 -6.88227253e-13 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 6.88199497e-13 2.50000000e-01 1.00000000e+00 2.50000000e-01 2.50000000e-01 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.50000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 - 5.00000000e-01 1.00000000e+00 6.00000000e-01 5.17477952e-01 7.34861266e-01 5.67509897e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 2.50000000e-01 1.00000000e+00 6.00000000e-01 2.64119187e-01 7.55320684e-01 6.30789065e-01 2.93080452e-01 4.76318217e-01 6.15661245e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 -1.14296843e-02 7.53313489e-01 6.07258766e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 - -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.50000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -2.50000000e-01 -1.00000000e+00 -7.00000000e-01 -2.75279799e-12 -1.00000000e+00 -7.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -2.50000000e-01 -1.00000000e+00 -6.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -7.50000000e-01 7.50000000e-01 -1.00000000e+00 -5.00000000e-01 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 - -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -2.50000000e-01 6.88199497e-13 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 -5.00000000e-01 2.50000000e-01 -1.00000000e+00 -2.50000000e-01 2.50000000e-01 -1.00000000e+00 6.88199497e-13 2.50000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.50000000e-01 5.00000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 - -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.50000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 2.77188742e-01 -7.17139646e-01 8.42606338e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 - 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 2.50000000e-01 -5.31234778e-13 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 2.50000000e-01 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -1.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 1.00000000e+00 2.50000000e-01 -2.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 - -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.50000000e-01 5.00000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.50000000e-01 -1.00000000e+00 -2.50000000e-01 7.50000000e-01 -1.00000000e+00 2.06459849e-12 7.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 - -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -5.11181119e-01 -2.33375695e-01 -8.87230609e-01 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 - -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -2.65381497e-01 5.49680483e-01 -7.32924253e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -2.28613183e-01 5.45106914e-01 -6.46579701e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -2.50000000e-01 -1.00000000e+00 6.00000000e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.00000000e-01 -2.50000000e-01 -1.00000000e+00 7.00000000e-01 -2.75281187e-12 -1.00000000e+00 7.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.50000000e-01 -1.00000000e+00 8.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -7.50000000e-01 -7.50000000e-01 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 -2.41034104e-01 5.20378300e-01 6.02699285e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -2.21417312e-01 5.15863828e-01 6.65716957e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 - 5.00000000e-01 -1.00000000e+00 6.00000000e-01 7.50000000e-01 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 7.00000000e-01 7.50000000e-01 -1.00000000e+00 7.00000000e-01 1.00000000e+00 -1.00000000e+00 7.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 7.50000000e-01 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 - -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.06459849e-12 -7.50000000e-01 1.00000000e+00 2.50000000e-01 -7.50000000e-01 1.00000000e+00 5.00000000e-01 -7.50000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 7.52525595e-01 2.86581382e-01 1.66552045e-01 7.76484374e-01 2.65167724e-01 7.90370934e-02 7.46866862e-01 2.99271142e-01 3.61728318e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 - 5.00000000e-01 -1.00000000e+00 8.00000000e-01 7.50000000e-01 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 9.00000000e-01 7.50000000e-01 -1.00000000e+00 9.00000000e-01 1.00000000e+00 -1.00000000e+00 9.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 - 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 7.93299243e-01 -2.90391319e-01 -3.62303831e-02 7.13825550e-01 -2.71445140e-01 -9.50659412e-02 7.33312257e-01 -2.43305887e-01 -1.54892254e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - -4.90548406e-01 5.30132674e-01 8.30068751e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -2.10228799e-01 5.14771634e-01 9.02850414e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -2.50000000e-01 5.00000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 7.50000000e-01 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 1.00000000e+00 5.00000000e-01 9.00000000e-01 1.00000000e+00 7.50000000e-01 9.00000000e-01 1.00000000e+00 1.00000000e+00 9.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 2.50000000e-01 6.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 7.23575875e-01 5.10278343e-01 6.17869689e-01 7.51814598e-01 2.07237914e-01 5.55841417e-01 7.17970008e-01 -1.41566063e-02 5.58387791e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.54102049e-01 2.74010313e-01 5.73290265e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 - -3.53396575e-02 -3.65929367e-02 8.03489850e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 2.96203914e-01 9.27426682e-03 8.57448194e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 0.00000000e+00 0.00000000e+00 1.00000000e+00 2.50000000e-01 -6.88227253e-13 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 - 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 7.50000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 7.50000000e-01 1.00000000e+00 6.00000000e-01 7.97988409e-01 7.05534651e-01 5.64683970e-01 7.23575875e-01 5.10278343e-01 6.17869689e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 5.17477952e-01 7.34861266e-01 5.67509897e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 - 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 2.23826516e-01 -7.74391768e-01 1.31086499e-02 2.66601615e-01 -7.12840748e-01 -1.41352413e-01 2.65193359e-01 -7.92393562e-01 -1.72384452e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 -2.19558957e-01 4.50483189e-01 4.59326437e-02 -2.17332325e-01 4.93752718e-01 -7.50413917e-02 -2.47177004e-01 4.54761404e-01 -1.80487225e-01 -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -2.45636086e-01 -6.53486695e-03 1.74146254e-01 -2.64447857e-01 3.82646106e-02 1.30296298e-01 -2.63967420e-01 3.93850057e-02 3.28850264e-02 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 6.10419889e-03 -2.40973228e-01 2.00005720e-01 2.27141394e-02 -2.50202515e-01 1.20344635e-01 -2.58295668e-02 -2.30858335e-01 -3.01243594e-02 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -2.42179029e-01 -2.59704634e-01 1.80899690e-01 -2.55720849e-01 -2.79366609e-01 6.53154231e-02 -2.03459879e-01 -2.88663342e-01 4.05551003e-02 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 - -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 -2.58295668e-02 -2.30858335e-01 -3.01243594e-02 2.28749464e-02 -2.00582028e-01 -8.94271412e-02 -3.13512953e-02 -2.10861610e-01 -2.14981457e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 - -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -2.03459879e-01 -2.88663342e-01 4.05551003e-02 -2.60634612e-01 -2.00063242e-01 -5.06449660e-02 -2.21100213e-01 -2.43016960e-01 -1.67879521e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - 5.00000000e-01 1.00000000e+00 -8.00000000e-01 7.50000000e-01 1.00000000e+00 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -7.00000000e-01 7.50000000e-01 1.00000000e+00 -7.00000000e-01 1.00000000e+00 1.00000000e+00 -7.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 7.50000000e-01 1.00000000e+00 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -2.50000000e-01 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -7.00000000e-01 1.00000000e+00 -2.50000000e-01 -7.00000000e-01 1.00000000e+00 -2.75279799e-12 -7.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 1.00000000e+00 -2.50000000e-01 -6.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 - -5.00000000e-01 5.00000000e-01 1.00000000e+00 -2.50000000e-01 5.00000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 -5.00000000e-01 7.50000000e-01 1.00000000e+00 -2.50000000e-01 7.50000000e-01 1.00000000e+00 2.06459849e-12 7.50000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 - 0.00000000e+00 0.00000000e+00 -1.00000000e+00 6.88199497e-13 2.50000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 1.46127027e-02 2.13359619e-01 -9.04627392e-01 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 - -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 2.14038532e-01 2.32776886e-02 -7.40897761e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 2.02005392e-01 1.35088691e-02 -5.71704179e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 - -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -7.40704078e-01 3.39288150e-02 -3.48449259e-02 -7.44810540e-01 -4.81082601e-02 -6.40258112e-02 -7.12930596e-01 3.88167636e-02 -1.73466694e-01 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 2.50000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -7.00000000e-01 2.50000000e-01 -1.00000000e+00 -7.00000000e-01 5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 2.50000000e-01 -1.00000000e+00 -6.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -1.00000000e+00 -7.50000000e-01 2.00000000e-01 -1.00000000e+00 -7.50000000e-01 1.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 - -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -1.00000000e+00 -5.00000000e-01 -7.00000000e-01 -7.33333943e-01 -5.11203107e-01 -6.84587312e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -7.61949822e-01 -4.83182440e-01 -6.13761349e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 - -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -7.50000000e-01 2.06459849e-12 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -7.50000000e-01 2.50000000e-01 -1.00000000e+00 -5.00000000e-01 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 - -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 2.73566555e-01 4.76029587e-01 1.73172971e-01 2.33840901e-01 5.46422724e-01 1.35620504e-01 2.50541089e-01 4.67220969e-01 2.82588122e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 - -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 7.50000000e-01 6.00000000e-01 -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 5.00000000e-01 7.00000000e-01 -1.00000000e+00 7.50000000e-01 7.00000000e-01 -1.00000000e+00 1.00000000e+00 7.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 7.50000000e-01 8.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -4.79675664e-01 -7.95380719e-01 -4.19450610e-02 -4.50121192e-01 -7.26687887e-01 -1.42389739e-01 -5.35733988e-01 -7.66681895e-01 -2.22966183e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.06459849e-12 -7.50000000e-01 -1.00000000e+00 2.50000000e-01 -7.50000000e-01 -1.00000000e+00 5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 - -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -7.83341325e-01 -2.60070362e-01 1.68185936e-01 -7.66030065e-01 -2.60864541e-01 8.72945236e-02 -7.98649990e-01 -2.91977690e-01 3.76771938e-02 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 - 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 5.49044006e-01 2.77978218e-01 -8.79993852e-01 4.70494256e-01 5.00918977e-01 -8.78265196e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 - -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -1.00000000e+00 7.50000000e-01 -8.00000000e-01 -7.31238138e-01 7.17907070e-01 -8.35056375e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -7.50000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 7.25774237e-01 3.88941110e-02 1.75910664e-01 7.11903967e-01 3.98295768e-02 1.48300894e-01 7.57978864e-01 -4.51872992e-02 -3.48262680e-02 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - -2.75279799e-12 -1.00000000e+00 6.00000000e-01 2.50000000e-01 -1.00000000e+00 6.00000000e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 -2.75281187e-12 -1.00000000e+00 7.00000000e-01 2.50000000e-01 -1.00000000e+00 7.00000000e-01 5.00000000e-01 -1.00000000e+00 7.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.50000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -1.00000000e+00 -2.50000000e-01 -8.00000000e-01 -7.88665635e-01 -2.36543542e-01 -7.99934008e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 - 5.39473453e-01 5.08327524e-01 -6.09109168e-01 7.52729016e-01 4.70095302e-01 -6.25440659e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 4.67519964e-01 7.42183049e-01 -6.00421251e-01 7.77636804e-01 7.51214013e-01 -5.66621340e-01 1.00000000e+00 7.50000000e-01 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 7.50000000e-01 1.00000000e+00 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 7.11398136e-01 -5.13660148e-01 5.52310014e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 7.19685954e-01 -5.38092249e-01 6.63105132e-01 1.00000000e+00 -5.00000000e-01 7.00000000e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 - -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 3.57478130e-02 -7.19804803e-01 -2.81200514e-02 4.94908467e-02 -7.93017484e-01 -9.31060979e-02 -9.44557460e-03 -7.85213296e-01 -1.62867646e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 7.31401399e-01 2.09331713e-01 -8.31456581e-01 1.00000000e+00 2.50000000e-01 -8.00000000e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 - 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 7.50000000e-01 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -7.00000000e-01 1.00000000e+00 7.50000000e-01 -7.00000000e-01 1.00000000e+00 1.00000000e+00 -7.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 1.00000000e+00 7.50000000e-01 -6.00000000e-01 1.00000000e+00 1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -7.50000000e-01 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -1.00000000e+00 -7.00000000e-01 -1.00000000e+00 -7.50000000e-01 -7.00000000e-01 -1.00000000e+00 -5.00000000e-01 -7.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -1.00000000e+00 -7.50000000e-01 -6.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - -1.11217671e-02 4.85990029e-01 5.72847359e-01 -1.14296843e-02 7.53313489e-01 6.07258766e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 3.44545003e-03 7.95524878e-01 6.83364686e-01 2.75281187e-12 1.00000000e+00 7.00000000e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 - 0.00000000e+00 0.00000000e+00 -1.00000000e+00 2.50000000e-01 -6.88227253e-13 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 6.88199497e-13 2.50000000e-01 -1.00000000e+00 2.50000000e-01 2.50000000e-01 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.50000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 - -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -7.50000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -9.00000000e-01 -7.52865847e-01 4.90911941e-01 -9.21916790e-01 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 - -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 -2.50000000e-01 -5.31234778e-13 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 -2.50000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -1.00000000e+00 -2.50000000e-01 -2.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.88199497e-13 -2.50000000e-01 -1.00000000e+00 2.50000000e-01 -2.50000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 2.50000000e-01 -6.88227253e-13 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 - 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 5.41273947e-01 2.03808786e-01 1.77879250e-01 5.31942102e-01 2.25529062e-01 1.08607631e-01 4.66910018e-01 2.73420339e-01 -3.10515091e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 - -1.00000000e+00 1.00000000e+00 6.00000000e-01 -7.50000000e-01 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 -1.00000000e+00 1.00000000e+00 7.00000000e-01 -7.50000000e-01 1.00000000e+00 7.00000000e-01 -5.00000000e-01 1.00000000e+00 7.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 -7.50000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -9.00000000e-01 -1.00000000e+00 -7.50000000e-01 -9.00000000e-01 -1.00000000e+00 -5.00000000e-01 -9.00000000e-01 -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -7.50000000e-01 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 4.66910018e-01 2.73420339e-01 -3.10515091e-02 4.76512299e-01 2.60683528e-01 -1.01929594e-01 5.18687756e-01 2.90477718e-01 -2.36412455e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -5.28111386e-01 2.50109870e-01 9.29992580e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -5.00000000e-01 1.37639899e-12 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 - 5.08559128e-01 4.68350764e-02 8.47523900e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 7.22374108e-01 2.13401107e-01 8.03011000e-01 1.00000000e+00 2.50000000e-01 8.00000000e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 - -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -2.95730476e-01 2.89542210e-01 -7.89646887e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -2.42505771e-01 5.27802195e-01 1.79263697e-01 -2.28095189e-01 5.25336593e-01 1.43546881e-01 -2.19558957e-01 4.50483189e-01 4.59326437e-02 -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 -4.64893153e-01 2.04810635e-01 5.59668067e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -7.45184141e-01 4.51483100e-01 5.88051785e-01 -7.95142974e-01 2.07151268e-01 6.04806799e-01 -7.73235639e-01 4.15095151e-02 6.07357715e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 2.50000000e-01 6.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -2.50000000e-01 -1.00000000e+00 -6.00000000e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 -5.19284749e-01 -7.83778037e-01 -5.82806477e-01 -2.65648299e-01 -7.19671602e-01 -6.43801820e-01 3.60248665e-02 -7.15736638e-01 -5.56900182e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -2.63857307e-01 -5.34652399e-01 -6.28666006e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 - 1.00000000e+00 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -7.50000000e-01 8.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -1.00000000e+00 9.00000000e-01 1.00000000e+00 -7.50000000e-01 9.00000000e-01 1.00000000e+00 -5.00000000e-01 9.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 2.00000000e-01 7.76674569e-01 7.26859181e-01 1.72211633e-01 5.00000000e-01 1.00000000e+00 2.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 7.80609159e-01 7.31793731e-01 5.71881307e-02 5.00000000e-01 1.00000000e+00 1.00000000e-01 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.99664140e-01 7.72204924e-01 4.51198643e-03 5.00000000e-01 1.00000000e+00 -5.31227839e-13 - -3.53396575e-02 -3.65929367e-02 8.03489850e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 2.82274827e-01 2.59654572e-01 8.44964730e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 - -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -9.00000000e-01 -7.50000000e-01 1.00000000e+00 -9.00000000e-01 -5.00000000e-01 1.00000000e+00 -9.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -7.50000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -7.50000000e-01 -1.00000000e+00 6.00000000e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.00000000e-01 -7.50000000e-01 -1.00000000e+00 7.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.00000000e-01 -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -7.50000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -2.94704534e-01 1.44582572e-02 5.67814283e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -2.63010629e-01 1.77410633e-02 6.90006841e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 - 5.00000000e-01 5.00000000e-01 -1.00000000e+00 7.50000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 4.70494256e-01 5.00918977e-01 -8.78265196e-01 7.19879855e-01 5.48768452e-01 -8.63196975e-01 1.00000000e+00 5.00000000e-01 -9.00000000e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 - 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.27888915e-01 -5.48643075e-01 -6.08178478e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 1.11083696e-02 -2.30119466e-01 -6.11745165e-01 2.76833698e-01 -2.76905821e-01 -6.16864592e-01 4.74472946e-01 -2.55527072e-01 -6.17101064e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 2.02005392e-01 1.35088691e-02 -5.71704179e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 - -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 -2.50000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 -2.50000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 -2.50000000e-01 -5.31234778e-13 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 - -5.00000000e-01 1.00000000e+00 2.00000000e-01 -7.50000000e-01 1.00000000e+00 2.00000000e-01 -1.00000000e+00 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 -7.50000000e-01 1.00000000e+00 1.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -7.50000000e-01 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 - 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 7.25229760e-01 -2.79780535e-01 -8.34290912e-01 1.00000000e+00 -2.50000000e-01 -8.00000000e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 - -1.00000000e+00 5.00000000e-01 6.00000000e-01 -7.45184141e-01 4.51483100e-01 5.88051785e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 -1.00000000e+00 5.00000000e-01 7.00000000e-01 -7.90916359e-01 5.36974005e-01 6.99826891e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 - -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -2.50000000e-01 8.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 9.00000000e-01 -1.00000000e+00 -2.50000000e-01 9.00000000e-01 -1.00000000e+00 2.75281187e-12 9.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 - 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -9.00000000e-01 1.00000000e+00 -2.50000000e-01 -9.00000000e-01 1.00000000e+00 -2.75279799e-12 -9.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -2.50000000e-01 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 - -1.00000000e+00 2.75279799e-12 6.00000000e-01 -7.73235639e-01 4.15095151e-02 6.07357715e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -1.00000000e+00 2.75281187e-12 7.00000000e-01 -7.05885197e-01 2.69974616e-02 6.68893149e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.42189289e-01 -7.20003365e-01 6.43416688e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 2.10835765e-01 -4.82328769e-01 6.19792310e-01 2.31735043e-01 -7.93276305e-01 5.81988803e-01 2.50000000e-01 -1.00000000e+00 6.00000000e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 3.60221343e-02 -7.72494852e-01 6.10765349e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -2.43345247e-02 2.90903903e-01 2.44414284e-01 3.20890140e-02 2.59616396e-01 8.96594471e-02 -4.76026217e-02 2.82276674e-01 3.84082449e-03 -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.82020794e-01 -2.00196725e-01 6.17411358e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -7.73235639e-01 4.15095151e-02 6.07357715e-01 -7.99986121e-01 -2.14028375e-01 5.64064497e-01 -7.59878478e-01 -5.24557688e-01 6.33305260e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 -2.50000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 - 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -2.50000000e-01 1.00000000e+00 -5.31234778e-13 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 2.75281187e-12 1.00000000e+00 -1.00000000e-01 -2.50000000e-01 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -2.50000000e-01 1.00000000e+00 -2.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 - -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.02499262e-02 -2.79583390e-01 6.39593268e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -2.94704534e-01 1.44582572e-02 5.67814283e-01 -2.25709597e-01 -2.33251108e-01 6.46679467e-01 -2.04187698e-01 -5.48263988e-01 6.12094029e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.82020794e-01 -2.00196725e-01 6.17411358e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 - -1.11217671e-02 4.85990029e-01 5.72847359e-01 -2.39636276e-02 2.31604414e-01 6.19527443e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 -2.41034104e-01 5.20378300e-01 6.02699285e-01 -2.15043147e-01 2.05203476e-01 5.68812565e-01 -2.94704534e-01 1.44582572e-02 5.67814283e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 -4.64893153e-01 2.04810635e-01 5.59668067e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 - 2.75282575e-12 1.00000000e+00 -5.31227839e-13 2.75281187e-12 1.00000000e+00 -1.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 -3.45519822e-02 7.37504497e-01 1.05620299e-02 3.44552812e-02 7.37574673e-01 -1.38711399e-01 -3.15411016e-02 7.00464728e-01 -2.42853436e-01 -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 -1.14296843e-02 7.53313489e-01 6.07258766e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 -2.50000000e-01 1.00000000e+00 6.00000000e-01 -2.72755360e-01 7.15032247e-01 6.02577623e-01 -2.41034104e-01 5.20378300e-01 6.02699285e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 -4.56240197e-01 7.11292251e-01 5.92377271e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 - -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.64893153e-01 2.04810635e-01 5.59668067e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -4.69492008e-01 2.57976966e-01 6.77767528e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 2.23011615e-01 1.94781990e-02 2.06619987e-01 2.01684799e-01 4.88797843e-02 1.48139293e-01 2.14876777e-01 2.66014695e-02 1.95716027e-03 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -2.53227207e-01 7.14537335e-01 2.02758030e-01 -2.13323976e-01 7.35002433e-01 9.51784736e-02 -2.28102848e-01 7.22658326e-01 1.37320272e-03 -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 5.17509951e-01 -2.15134087e-01 5.98024945e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 2.01691136e-01 -4.79247863e-02 5.66882667e-01 2.94243327e-01 -2.87957389e-01 5.56444701e-01 2.10835765e-01 -4.82328769e-01 6.19792310e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.02499262e-02 -2.79583390e-01 6.39593268e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 - -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 2.50000000e-01 6.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 -1.00000000e+00 2.75281187e-12 7.00000000e-01 -1.00000000e+00 2.50000000e-01 7.00000000e-01 -1.00000000e+00 5.00000000e-01 7.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 2.50000000e-01 8.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 - -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 2.13344831e-01 2.10777877e-01 4.68667057e-02 2.22576016e-01 2.04838706e-01 -1.00925875e-01 2.36689214e-01 2.40025704e-01 -2.25657165e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 -7.67432407e-01 2.08191458e-01 2.61816764e-03 -7.08450227e-01 2.38510901e-01 -1.26958943e-01 -7.24152013e-01 2.00649807e-01 -2.38729769e-01 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.50000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 2.06459849e-12 7.50000000e-01 -1.00000000e+00 2.50000000e-01 7.50000000e-01 -1.00000000e+00 5.00000000e-01 7.50000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 - 2.75279799e-12 1.00000000e+00 2.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -3.53943667e-02 7.95048004e-01 1.62037283e-01 -3.49270172e-02 7.63273779e-01 5.91600180e-02 -3.45519822e-02 7.37504497e-01 1.05620299e-02 -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 - 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -7.50000000e-01 6.00000000e-01 1.00000000e+00 -1.00000000e+00 6.00000000e-01 7.11398136e-01 -5.13660148e-01 5.52310014e-01 7.32571339e-01 -7.61216029e-01 6.20459438e-01 7.50000000e-01 -1.00000000e+00 6.00000000e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.42189289e-01 -7.20003365e-01 6.43416688e-01 5.00000000e-01 -1.00000000e+00 6.00000000e-01 - 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -7.50000000e-01 -1.00000000e+00 7.50000000e-01 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 5.05907645e-01 -7.32869598e-01 2.79303667e-02 4.95446617e-01 -7.29120389e-01 -1.04315842e-01 5.36834601e-01 -7.39180893e-01 -1.78471564e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -5.48640676e-01 -7.77286265e-01 6.36669671e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.00000000e-01 -1.00000000e+00 7.00000000e-01 -5.02370261e-01 -7.91518206e-01 6.60988572e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 - 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 2.50000000e-01 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 -2.75279799e-12 -7.00000000e-01 1.00000000e+00 2.50000000e-01 -7.00000000e-01 1.00000000e+00 5.00000000e-01 -7.00000000e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 1.00000000e+00 2.50000000e-01 -6.00000000e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 - -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -2.62569079e-01 -5.25838878e-01 -5.68085725e-03 -2.72291227e-01 -5.32628105e-01 -1.14187988e-01 -2.22977063e-01 -5.36870853e-01 -1.64641576e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 - -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 3.86499727e-02 -4.96619006e-01 -7.72329606e-02 -5.02518410e-03 -4.66177814e-01 -2.22377650e-01 2.31820423e-01 -4.57386697e-01 -3.55934140e-02 2.37982533e-01 -5.10337522e-01 -1.14207159e-01 2.18684050e-01 -4.94833636e-01 -2.33971621e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -7.59878478e-01 -5.24557688e-01 6.33305260e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -1.00000000e+00 -5.00000000e-01 7.00000000e-01 -7.59472965e-01 -5.02881516e-01 7.38765409e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 2.50000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 2.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 2.50000000e-01 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 2.50000000e-01 -1.00000000e+00 -5.31234778e-13 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 - -1.00000000e+00 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -7.50000000e-01 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.00000000e-01 -1.00000000e+00 -7.50000000e-01 7.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.00000000e-01 -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -7.50000000e-01 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -7.50000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -7.50000000e-01 8.00000000e-01 -7.94077294e-01 -7.29781627e-01 8.17530363e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 - 5.00000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 2.77497180e-01 -7.19878125e-01 1.95986034e-01 2.24704868e-01 -7.88569663e-01 1.13411313e-01 2.23826516e-01 -7.74391768e-01 1.31086499e-02 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 - -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -7.50000000e-01 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -1.00000000e+00 9.00000000e-01 -7.50000000e-01 -1.00000000e+00 9.00000000e-01 -5.00000000e-01 -1.00000000e+00 9.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 - -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -2.75281187e-12 -1.00000000e+00 9.00000000e-01 -2.28732857e-02 -7.61541694e-01 8.88090565e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -2.06459849e-12 -7.50000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 7.50000000e-01 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 7.50000000e-01 -1.00000000e+00 -1.00000000e-01 1.00000000e+00 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 7.50000000e-01 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 - 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 5.30532753e-01 -2.53759366e-01 -1.51549915e-02 4.90819038e-01 -2.14919321e-01 -1.40540093e-01 5.01218023e-01 -2.35503536e-01 -2.00080801e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -2.50000000e-01 6.00000000e-01 -1.00000000e+00 2.75279799e-12 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.00000000e-01 -1.00000000e+00 -2.50000000e-01 7.00000000e-01 -1.00000000e+00 2.75281187e-12 7.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -2.50000000e-01 8.00000000e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 - -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -5.00000000e-01 -1.00000000e+00 9.00000000e-01 -5.20495037e-01 -7.77704044e-01 8.79566485e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 - 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 7.04226346e-01 -5.33764662e-01 -7.06492701e-01 1.00000000e+00 -5.00000000e-01 -7.00000000e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 7.71083683e-01 -4.83737049e-01 -6.24197292e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 2.88915450e-01 -4.61771744e-01 1.74109319e-01 2.28173133e-01 -5.09392108e-01 1.34063192e-01 2.31820423e-01 -4.57386697e-01 -3.55934140e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - -1.00000000e+00 -1.00000000e+00 8.00000000e-01 -1.00000000e+00 -7.50000000e-01 8.00000000e-01 -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -1.00000000e+00 -1.00000000e+00 9.00000000e-01 -1.00000000e+00 -7.50000000e-01 9.00000000e-01 -1.00000000e+00 -5.00000000e-01 9.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 - -2.75279799e-12 -1.00000000e+00 6.00000000e-01 3.60221343e-02 -7.72494852e-01 6.10765349e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -2.75281187e-12 -1.00000000e+00 7.00000000e-01 1.54198591e-02 -7.86098098e-01 7.05519830e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 - 2.75279799e-12 1.00000000e+00 2.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 2.75282575e-12 1.00000000e+00 -5.31227839e-13 2.27310774e-01 7.50367447e-01 1.51428925e-01 2.35712313e-01 7.34476903e-01 9.71369534e-02 2.25211425e-01 7.87891962e-01 -9.39040992e-03 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 - -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -7.50000000e-01 1.00000000e+00 -7.50000000e-01 -7.50000000e-01 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 - -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 2.59869475e-01 -2.70162767e-01 4.79134093e-02 2.85533067e-01 -2.58500990e-01 -6.62226701e-02 2.04134141e-01 -2.14922092e-01 -1.63726058e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -4.82020794e-01 -2.00196725e-01 6.17411358e-01 -5.21539705e-01 -2.93808099e-02 6.19022478e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -4.91940785e-01 -2.39979097e-01 7.16130302e-01 -4.89543728e-01 -3.69493664e-02 7.19264421e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 - -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -9.00000000e-01 -1.00000000e+00 2.50000000e-01 -9.00000000e-01 -1.00000000e+00 5.00000000e-01 -9.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 2.50000000e-01 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 - -4.84577644e-02 4.06855736e-02 5.60664410e-01 2.01691136e-01 -4.79247863e-02 5.66882667e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 2.70866450e-01 -4.38531841e-02 6.54144931e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 - -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -1.00000000e+00 2.50000000e-01 -8.00000000e-01 -7.29872639e-01 2.64553952e-01 -7.78492596e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 - 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.09785534e-01 5.22335130e-01 2.05561253e-01 7.95377159e-01 5.22307345e-01 5.89737900e-02 7.87671700e-01 5.18477684e-01 2.65507873e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 - 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 2.59156804e-01 -2.85490835e-01 7.91022691e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 2.01887794e-01 2.03251690e-02 8.09043866e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 - -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -5.26704500e-01 2.53252518e-01 -7.26842404e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -5.26541160e-01 2.33288068e-01 -5.82433991e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 7.50000000e-01 -5.31241717e-13 1.00000000e+00 1.00000000e+00 -5.31241717e-13 1.00000000e+00 5.00000000e-01 -1.00000000e-01 1.00000000e+00 7.50000000e-01 -1.00000000e-01 1.00000000e+00 1.00000000e+00 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 1.00000000e+00 7.50000000e-01 -2.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 - -1.37639899e-12 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.88199497e-13 -2.50000000e-01 1.00000000e+00 2.50000000e-01 -2.50000000e-01 1.00000000e+00 5.00000000e-01 -2.50000000e-01 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 2.50000000e-01 -6.88227253e-13 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 - -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -7.26284734e-01 -3.76036267e-02 -5.64749763e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -1.00000000e+00 2.50000000e-01 -6.00000000e-01 -7.01047458e-01 2.47221224e-01 -5.89995842e-01 -5.26541160e-01 2.33288068e-01 -5.82433991e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -7.12353132e-01 4.56004138e-01 -5.52765752e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -5.10889643e-01 -2.94528054e-01 8.51977078e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.50000000e-01 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 - -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 -4.76026217e-02 2.82276674e-01 3.84082449e-03 4.52336604e-02 2.76361751e-01 -7.78870807e-02 -3.44384684e-02 2.18713663e-01 -1.85579955e-01 -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 4.54102049e-01 2.74010313e-01 5.73290265e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 5.09187334e-01 2.18772295e-01 6.80590123e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 - 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 2.05807723e-01 -2.92057599e-01 2.49152401e-01 2.34302097e-01 -2.75019978e-01 6.06487445e-02 2.59869475e-01 -2.70162767e-01 4.79134093e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - -1.00000000e+00 2.75282575e-12 8.00000000e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -1.00000000e+00 2.75281187e-12 9.00000000e-01 -7.29534696e-01 6.61373956e-03 9.29991955e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -7.50000000e-01 2.06459849e-12 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 - 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e-01 1.00000000e+00 1.00000000e+00 -5.31241717e-13 7.50000000e-01 1.00000000e+00 2.00000000e-01 7.50000000e-01 1.00000000e+00 1.00000000e-01 7.50000000e-01 1.00000000e+00 -5.31234778e-13 5.00000000e-01 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 5.17477952e-01 7.34861266e-01 5.67509897e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 5.05493198e-01 7.94081692e-01 6.67733701e-01 5.00000000e-01 1.00000000e+00 7.00000000e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -7.50000000e-01 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -7.00000000e-01 -7.50000000e-01 1.00000000e+00 -7.00000000e-01 -5.00000000e-01 1.00000000e+00 -7.00000000e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -7.50000000e-01 1.00000000e+00 -6.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - 2.75282575e-12 1.00000000e+00 8.00000000e-01 2.50000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 2.75281187e-12 1.00000000e+00 9.00000000e-01 2.50000000e-01 1.00000000e+00 9.00000000e-01 5.00000000e-01 1.00000000e+00 9.00000000e-01 2.75279799e-12 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -2.50000000e-01 -1.00000000e+00 -9.00000000e-01 -2.75279799e-12 -1.00000000e+00 -9.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.50000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 - -5.74150632e-03 4.80713344e-01 2.07813459e-01 1.42756634e-02 5.20876318e-01 7.45820567e-02 -2.11337044e-02 5.20175598e-01 1.44520351e-02 2.40441268e-01 2.83346403e-01 1.50696662e-01 2.38947474e-01 2.95979598e-01 1.31650817e-01 2.13344831e-01 2.10777877e-01 4.68667057e-02 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - -1.00000000e+00 2.75279799e-12 1.00000000e+00 -7.50000000e-01 2.06459849e-12 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -7.50000000e-01 2.50000000e-01 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -7.50000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 - 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.50000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 2.06459849e-12 7.50000000e-01 1.00000000e+00 2.50000000e-01 7.50000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 - -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -2.06459849e-12 -7.50000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -9.00000000e-01 -2.06581389e-02 -7.49278174e-01 -9.41629170e-01 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 - -5.01288867e-01 4.74009546e-01 6.17231993e-01 -4.56240197e-01 7.11292251e-01 5.92377271e-01 -5.00000000e-01 1.00000000e+00 6.00000000e-01 -5.41879946e-01 4.51465621e-01 7.10863624e-01 -5.27884453e-01 7.97048020e-01 6.71562856e-01 -5.00000000e-01 1.00000000e+00 7.00000000e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 - 1.00000000e+00 -1.00000000e+00 6.00000000e-01 1.00000000e+00 -7.50000000e-01 6.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -1.00000000e+00 7.00000000e-01 1.00000000e+00 -7.50000000e-01 7.00000000e-01 1.00000000e+00 -5.00000000e-01 7.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -7.50000000e-01 8.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -2.50000000e-01 -1.00000000e+00 -8.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -2.45742871e-01 -7.52046777e-01 -8.39572117e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 - 5.00000000e-01 -1.00000000e+00 8.00000000e-01 7.50000000e-01 -1.00000000e+00 8.00000000e-01 1.00000000e+00 -1.00000000e+00 8.00000000e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 7.51069508e-01 -7.07408008e-01 8.39705657e-01 1.00000000e+00 -7.50000000e-01 8.00000000e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 - -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 -2.75279799e-12 -1.00000000e+00 -7.00000000e-01 -2.70961176e-02 -7.37320417e-01 -6.87869549e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 3.60248665e-02 -7.15736638e-01 -5.56900182e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 - 4.04523035e-02 5.23334239e-01 7.85315811e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 2.35000252e-01 7.49957074e-01 7.94740858e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 2.50000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -7.12353132e-01 4.56004138e-01 -5.52765752e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -1.00000000e+00 7.50000000e-01 -6.00000000e-01 -7.67490944e-01 7.75022398e-01 -6.48454342e-01 -4.72348517e-01 7.55363920e-01 -5.93158920e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 -7.50000000e-01 1.00000000e+00 -6.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 2.50541089e-01 4.67220969e-01 2.82588122e-02 2.34564795e-01 4.88885339e-01 -7.66427520e-02 2.61566778e-01 5.28349093e-01 -1.69349915e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - -1.00000000e+00 5.00000000e-01 8.00000000e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -1.00000000e+00 5.00000000e-01 9.00000000e-01 -7.42909951e-01 4.51398944e-01 8.58817844e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -7.50000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 - -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.48640676e-01 -7.77286265e-01 6.36669671e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 -7.59878478e-01 -5.24557688e-01 6.33305260e-01 -7.03347218e-01 -7.36344433e-01 6.43319627e-01 -7.50000000e-01 -1.00000000e+00 6.00000000e-01 -1.00000000e+00 -5.00000000e-01 6.00000000e-01 -1.00000000e+00 -7.50000000e-01 6.00000000e-01 -1.00000000e+00 -1.00000000e+00 6.00000000e-01 - 5.00000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 7.50000000e-01 7.50000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 - -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -1.00000000e+00 -1.00000000e+00 -1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.31241717e-13 -1.00000000e+00 -7.50000000e-01 -1.00000000e-01 -1.00000000e+00 -7.50000000e-01 -2.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -2.50000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 -5.00000000e-01 1.00000000e+00 -7.00000000e-01 -2.50000000e-01 1.00000000e+00 -7.00000000e-01 2.75279799e-12 1.00000000e+00 -7.00000000e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -2.50000000e-01 1.00000000e+00 -6.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 - 2.75279799e-12 1.00000000e+00 6.00000000e-01 2.50000000e-01 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 6.00000000e-01 2.75281187e-12 1.00000000e+00 7.00000000e-01 2.50000000e-01 1.00000000e+00 7.00000000e-01 5.00000000e-01 1.00000000e+00 7.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 2.50000000e-01 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 7.50000000e-01 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -7.00000000e-01 -1.00000000e+00 7.50000000e-01 -7.00000000e-01 -1.00000000e+00 1.00000000e+00 -7.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -1.00000000e+00 7.50000000e-01 -6.00000000e-01 -1.00000000e+00 1.00000000e+00 -6.00000000e-01 - 5.00000000e-01 1.00000000e+00 8.00000000e-01 7.50000000e-01 1.00000000e+00 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 5.00000000e-01 1.00000000e+00 9.00000000e-01 7.50000000e-01 1.00000000e+00 9.00000000e-01 1.00000000e+00 1.00000000e+00 9.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 7.50000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -7.38622456e-01 -7.20629057e-01 2.58153547e-02 -7.63629266e-01 -7.27495781e-01 -1.42653195e-01 -7.19737040e-01 -7.37267268e-01 -1.68057480e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - 2.81216416e-02 5.47228351e-01 -7.57921741e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 1.33234453e-02 7.24462490e-01 -6.76076913e-01 2.75279799e-12 1.00000000e+00 -7.00000000e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 -3.85304003e-02 7.30500373e-01 -6.37788061e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 - -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 -1.89088984e-02 2.07719227e-01 8.55329884e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 0.00000000e+00 0.00000000e+00 1.00000000e+00 6.88199497e-13 2.50000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 - -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -7.50000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -1.00000000e+00 -7.00000000e-01 -7.50000000e-01 -1.00000000e+00 -7.00000000e-01 -5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -7.50000000e-01 -1.00000000e+00 -6.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 - 5.36295327e-01 5.28286707e-01 7.83714183e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 7.79818509e-01 7.49717783e-01 8.31083095e-01 1.00000000e+00 7.50000000e-01 8.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 7.50000000e-01 1.00000000e+00 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -7.50000000e-01 -1.00000000e+00 -5.31234778e-13 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -1.00000000e+00 -1.00000000e+00 -1.00000000e-01 -7.50000000e-01 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.00000000e-01 -7.50000000e-01 -1.00000000e+00 -2.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -9.00000000e-01 -2.50000000e-01 1.00000000e+00 -9.00000000e-01 2.75279799e-12 1.00000000e+00 -9.00000000e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -2.50000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 - -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -2.50000000e-01 -2.50000000e-01 -1.00000000e+00 -6.88199497e-13 -2.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -2.50000000e-01 6.88199497e-13 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 - 5.12293954e-01 -5.47020830e-01 8.46585454e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 7.38902114e-01 -5.23320664e-01 8.68218662e-01 1.00000000e+00 -5.00000000e-01 9.00000000e-01 5.00000000e-01 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 - 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.77323980e-01 2.17074746e-01 7.91221201e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 4.56683653e-01 2.50938894e-01 8.63551567e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 5.00000000e-01 -1.37645451e-12 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 - -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -9.00000000e-01 -1.00000000e+00 7.50000000e-01 -9.00000000e-01 -1.00000000e+00 1.00000000e+00 -9.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 7.50000000e-01 -8.00000000e-01 -1.00000000e+00 1.00000000e+00 -8.00000000e-01 - 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 7.50000000e-01 6.00000000e-01 1.00000000e+00 1.00000000e+00 6.00000000e-01 1.00000000e+00 5.00000000e-01 7.00000000e-01 1.00000000e+00 7.50000000e-01 7.00000000e-01 1.00000000e+00 1.00000000e+00 7.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 7.50000000e-01 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 - 1.00000000e+00 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 7.14522757e-01 -7.25196948e-01 2.36606326e-01 7.44995213e-01 -7.45126879e-01 1.11682616e-01 7.26655468e-01 -7.89341408e-01 -3.68835602e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.50000000e-01 1.00000000e+00 -2.50000000e-01 -2.50000000e-01 1.00000000e+00 -6.88199497e-13 -2.50000000e-01 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 -2.50000000e-01 6.88199497e-13 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -4.79293826e-01 -7.15374773e-01 -9.46229465e-01 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 - -2.75282575e-12 -1.00000000e+00 8.00000000e-01 2.50000000e-01 -1.00000000e+00 8.00000000e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.75281187e-12 -1.00000000e+00 9.00000000e-01 2.50000000e-01 -1.00000000e+00 9.00000000e-01 5.00000000e-01 -1.00000000e+00 9.00000000e-01 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 - -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -7.61949822e-01 -4.83182440e-01 -6.13761349e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -1.00000000e+00 -2.50000000e-01 -6.00000000e-01 -7.97759817e-01 -2.64304369e-01 -6.46363315e-01 -5.37458717e-01 -2.20855384e-01 -6.15373185e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -7.26284734e-01 -3.76036267e-02 -5.64749763e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 - 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -7.50000000e-01 1.00000000e+00 7.50000000e-01 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 - -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -6.88199497e-13 -2.50000000e-01 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 4.55758302e-02 -2.79320737e-01 -9.46636603e-01 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 - 5.00000000e-01 -1.37645451e-12 1.00000000e+00 7.50000000e-01 -2.06462625e-12 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 5.00000000e-01 2.50000000e-01 1.00000000e+00 7.50000000e-01 2.50000000e-01 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 - -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -2.27518950e-01 -3.08139637e-02 -6.49633469e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 -5.26541160e-01 2.33288068e-01 -5.82433991e-01 -2.05802848e-01 2.29052059e-01 -5.57243933e-01 4.76975638e-03 2.22747039e-01 -5.54198113e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -2.28613183e-01 5.45106914e-01 -6.46579701e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.00000000e-01 1.00000000e+00 -1.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 5.35060517e-01 7.11084213e-01 3.07005869e-02 4.95011847e-01 7.79566521e-01 -9.99144674e-02 5.10729093e-01 7.60639709e-01 -2.14082050e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - -1.00000000e+00 5.00000000e-01 1.00000000e+00 -7.50000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -7.50000000e-01 7.50000000e-01 1.00000000e+00 -5.00000000e-01 7.50000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 - -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.00000000e-01 7.50000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -4.87976075e-01 7.73594387e-01 -8.52717303e-01 -5.00000000e-01 1.00000000e+00 -9.00000000e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 - 5.36295327e-01 5.28286707e-01 7.83714183e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 7.37698002e-01 4.70873997e-01 8.70680706e-01 1.00000000e+00 5.00000000e-01 9.00000000e-01 5.00000000e-01 5.00000000e-01 1.00000000e+00 7.50000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 2.00000000e-01 7.50000000e-01 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 7.50000000e-01 -1.00000000e+00 1.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 7.50000000e-01 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 - 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 -2.10803822e-02 -2.49912051e-01 8.81721294e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 -6.88199497e-13 -2.50000000e-01 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 - -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 7.50000000e-01 8.00000000e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 -1.00000000e+00 5.00000000e-01 9.00000000e-01 -1.00000000e+00 7.50000000e-01 9.00000000e-01 -1.00000000e+00 1.00000000e+00 9.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 7.23575875e-01 5.10278343e-01 6.17869689e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 7.48327818e-01 4.69342848e-01 6.87791918e-01 1.00000000e+00 5.00000000e-01 7.00000000e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 7.98118104e-01 4.60730688e-01 7.57215726e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 - -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.50000000e-01 5.00000000e-01 -1.00000000e+00 1.37639899e-12 5.00000000e-01 -1.00000000e+00 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -2.06103308e-01 5.18738661e-01 -8.84719218e-01 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 - -1.11217671e-02 4.85990029e-01 5.72847359e-01 2.93080452e-01 4.76318217e-01 6.15661245e-01 4.62397648e-01 5.08353086e-01 5.76246851e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 2.18923350e-01 4.98121341e-01 7.08619968e-01 4.65070469e-01 4.56535525e-01 7.47859641e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 - 1.00000000e+00 1.00000000e+00 -5.31241717e-13 1.00000000e+00 1.00000000e+00 -1.00000000e-01 1.00000000e+00 1.00000000e+00 -2.00000000e-01 7.50000000e-01 1.00000000e+00 -5.31234778e-13 7.50000000e-01 1.00000000e+00 -1.00000000e-01 7.50000000e-01 1.00000000e+00 -2.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.00000000e-01 1.00000000e+00 -1.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 - 1.00000000e+00 -1.00000000e+00 2.00000000e-01 1.00000000e+00 -7.50000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e-01 1.00000000e+00 -7.50000000e-01 1.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -7.50000000e-01 -5.31234778e-13 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 - -4.84577644e-02 4.06855736e-02 5.60664410e-01 -2.39636276e-02 2.31604414e-01 6.19527443e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 3.19092115e-02 2.63598931e-01 7.32473554e-01 1.53592603e-02 4.94265237e-01 6.65734543e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 - -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -9.00000000e-01 -7.10966190e-01 -5.46091036e-01 -8.82215202e-01 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 - 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -7.50000000e-01 -5.31234778e-13 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -1.00000000e+00 -1.00000000e-01 1.00000000e+00 -7.50000000e-01 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 1.00000000e+00 -7.50000000e-01 -2.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -4.02499262e-02 -2.79583390e-01 6.39593268e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 4.43906404e-02 -2.23005081e-01 7.48947550e-01 3.85535343e-02 -3.72554347e-02 6.53233763e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 - 1.00000000e+00 5.00000000e-01 -5.31241717e-13 7.99664140e-01 7.72204924e-01 4.51198643e-03 5.00000000e-01 1.00000000e+00 -5.31227839e-13 1.00000000e+00 5.00000000e-01 -1.00000000e-01 7.31534570e-01 7.43038376e-01 -9.77085297e-02 5.00000000e-01 1.00000000e+00 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 7.34916653e-01 7.05552036e-01 -1.88958584e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 - 5.12293954e-01 -5.47020830e-01 8.46585454e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 4.78844536e-01 -2.27741543e-01 8.72881996e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 5.00000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -2.50000000e-01 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 - -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -7.10533031e-01 5.15753162e-01 -7.73185278e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -1.00000000e+00 5.00000000e-01 -7.00000000e-01 -7.76218534e-01 4.87491134e-01 -7.30700101e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 -7.12353132e-01 4.56004138e-01 -5.52765752e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 - 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 2.50000000e-01 6.00000000e-01 1.00000000e+00 5.00000000e-01 6.00000000e-01 1.00000000e+00 -2.75281187e-12 7.00000000e-01 1.00000000e+00 2.50000000e-01 7.00000000e-01 1.00000000e+00 5.00000000e-01 7.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 2.50000000e-01 8.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 - 1.00000000e+00 -1.00000000e+00 -5.31241717e-13 1.00000000e+00 -1.00000000e+00 -1.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.00000000e-01 7.26655468e-01 -7.89341408e-01 -3.68835602e-02 7.83139868e-01 -7.01991015e-01 -1.19380168e-01 7.56483320e-01 -7.26132381e-01 -2.14701945e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -7.50000000e-01 1.00000000e+00 -2.50000000e-01 -7.50000000e-01 1.00000000e+00 -2.06459849e-12 -7.50000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 - 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.17509951e-01 -2.15134087e-01 5.98024945e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 4.50090696e-01 -2.06334645e-01 7.15879163e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 - 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 2.50000000e-01 2.00000000e-01 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 2.50000000e-01 1.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 2.50000000e-01 -5.31234778e-13 1.00000000e+00 5.00000000e-01 -5.31241717e-13 - 5.12293954e-01 -5.47020830e-01 8.46585454e-01 7.90481757e-01 -4.64189860e-01 8.20813619e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 4.91578895e-01 -2.01882143e-01 8.14619037e-01 7.48792700e-01 -2.15543402e-01 8.20861523e-01 1.00000000e+00 -2.50000000e-01 8.00000000e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 - 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 9.38447953e-03 -2.48841529e-01 -7.45540129e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 1.11083696e-02 -2.30119466e-01 -6.11745165e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - 1.00000000e+00 -5.00000000e-01 6.00000000e-01 1.00000000e+00 -2.50000000e-01 6.00000000e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 -5.00000000e-01 7.00000000e-01 1.00000000e+00 -2.50000000e-01 7.00000000e-01 1.00000000e+00 -2.75281187e-12 7.00000000e-01 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -2.50000000e-01 8.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 - -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -2.50000000e-01 6.88199497e-13 -1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+00 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -2.94531864e-01 4.10629953e-02 -8.93397807e-01 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 - 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 7.46866862e-01 2.99271142e-01 3.61728318e-02 7.78684892e-01 2.52991615e-01 -8.02820141e-02 7.94944168e-01 2.92358944e-01 -1.63669585e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 2.10835765e-01 -4.82328769e-01 6.19792310e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 2.07904282e-01 -4.57094421e-01 7.03149397e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 - -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -1.00000000e+00 2.75279799e-12 -7.00000000e-01 -7.63866303e-01 2.84441812e-02 -6.79297819e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -7.26284734e-01 -3.76036267e-02 -5.64749763e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 - 5.00000000e-01 -1.00000000e+00 6.00000000e-01 5.42189289e-01 -7.20003365e-01 6.43416688e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 5.00000000e-01 -1.00000000e+00 7.00000000e-01 5.16597444e-01 -7.48984446e-01 6.91893431e-01 5.09931977e-01 -4.51340835e-01 6.83429605e-01 5.00000000e-01 -1.00000000e+00 8.00000000e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 - -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -4.87401687e-01 -2.53996841e-01 -7.33436743e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -5.37458717e-01 -2.20855384e-01 -6.15373185e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -2.50000000e-01 2.00000000e-01 1.00000000e+00 -2.75279799e-12 2.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -2.50000000e-01 1.00000000e-01 1.00000000e+00 -2.75281187e-12 1.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -2.50000000e-01 -5.31227839e-13 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 - -5.00000000e-01 1.00000000e+00 8.00000000e-01 -2.50000000e-01 1.00000000e+00 8.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 9.00000000e-01 -2.50000000e-01 1.00000000e+00 9.00000000e-01 2.75281187e-12 1.00000000e+00 9.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 - -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -7.50000000e-01 2.06459849e-12 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -9.00000000e-01 -7.54756264e-01 -2.05155583e-02 -8.85140932e-01 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -7.11852278e-01 -2.17936919e-02 -7.66206416e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 7.47570636e-01 -2.54779531e-01 1.59569447e-01 7.69425713e-01 -2.14233386e-01 7.23532228e-02 7.93299243e-01 -2.90391319e-01 -3.62303831e-02 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - 4.04523035e-02 5.23334239e-01 7.85315811e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 2.90787792e-02 7.01291418e-01 8.76884113e-01 2.75281187e-12 1.00000000e+00 9.00000000e-01 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.06459849e-12 7.50000000e-01 1.00000000e+00 2.75279799e-12 1.00000000e+00 1.00000000e+00 - -4.90548406e-01 5.30132674e-01 8.30068751e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -2.56503075e-01 7.72183060e-01 8.39100635e-01 3.81768681e-03 7.78409112e-01 7.53823904e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 -2.50000000e-01 1.00000000e+00 8.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -7.50000000e-01 -5.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -7.50000000e-01 -2.50000000e-01 -1.00000000e+00 -5.00000000e-01 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -7.50000000e-01 2.06459849e-12 -1.00000000e+00 -5.00000000e-01 1.37639899e-12 -1.00000000e+00 - 4.76425748e-01 5.49663539e-01 -7.93911671e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 7.03699572e-01 5.40375024e-01 -7.16772867e-01 1.00000000e+00 5.00000000e-01 -7.00000000e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 7.52729016e-01 4.70095302e-01 -6.25440659e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -2.50000000e-01 -1.00000000e+00 2.00000000e-01 -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -2.50000000e-01 -1.00000000e+00 1.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -2.50000000e-01 -1.00000000e+00 -5.31227839e-13 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 - 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 7.57978864e-01 -4.51872992e-02 -3.48262680e-02 7.26054535e-01 -4.23898258e-02 -1.03295065e-01 7.39298995e-01 1.55739606e-02 -2.39746917e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - -5.00000000e-01 1.00000000e+00 6.00000000e-01 -2.50000000e-01 1.00000000e+00 6.00000000e-01 2.75279799e-12 1.00000000e+00 6.00000000e-01 -5.00000000e-01 1.00000000e+00 7.00000000e-01 -2.50000000e-01 1.00000000e+00 7.00000000e-01 2.75281187e-12 1.00000000e+00 7.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 -2.50000000e-01 1.00000000e+00 8.00000000e-01 2.75282575e-12 1.00000000e+00 8.00000000e-01 - -1.00000000e+00 -1.00000000e+00 -6.00000000e-01 -7.50000000e-01 -1.00000000e+00 -6.00000000e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -1.00000000e+00 -7.50000000e-01 -6.00000000e-01 -7.81293091e-01 -7.22212300e-01 -5.73868124e-01 -5.19284749e-01 -7.83778037e-01 -5.82806477e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -7.61949822e-01 -4.83182440e-01 -6.13761349e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 - 5.36295327e-01 5.28286707e-01 7.83714183e-01 5.41720093e-01 7.37552457e-01 7.51875259e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 5.05789196e-01 7.80782768e-01 8.99780890e-01 5.00000000e-01 1.00000000e+00 9.00000000e-01 5.00000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 7.50000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e+00 1.00000000e+00 - -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -7.50000000e-01 -1.00000000e+00 -2.50000000e-01 -7.50000000e-01 -1.00000000e+00 -2.06459849e-12 -7.50000000e-01 -1.00000000e+00 -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 - 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -2.50000000e-01 -5.31227839e-13 1.00000000e+00 -2.75282575e-12 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -2.50000000e-01 -1.00000000e-01 1.00000000e+00 -2.75281187e-12 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 1.00000000e+00 -2.50000000e-01 -2.00000000e-01 1.00000000e+00 -2.75279799e-12 -2.00000000e-01 - -5.00000000e-01 1.37639899e-12 1.00000000e+00 -2.50000000e-01 6.88199497e-13 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 -5.00000000e-01 2.50000000e-01 1.00000000e+00 -2.50000000e-01 2.50000000e-01 1.00000000e+00 6.88199497e-13 2.50000000e-01 1.00000000e+00 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -2.50000000e-01 5.00000000e-01 1.00000000e+00 1.37639899e-12 5.00000000e-01 1.00000000e+00 - 1.00000000e+00 -5.00000000e-01 2.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 7.78210727e-01 -4.61807554e-01 2.30335534e-01 7.82580381e-01 -5.33537662e-01 1.28807707e-01 7.54486357e-01 -4.65779570e-01 4.65500115e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -2.05542581e-01 2.46086019e-01 7.98602343e-01 -3.86253501e-02 2.63072683e-01 8.13985864e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -2.06178790e-01 4.95346599e-01 7.75262927e-01 4.04523035e-02 5.23334239e-01 7.85315811e-01 - -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -7.50000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -1.00000000e+00 -7.50000000e-01 -8.00000000e-01 -7.12188074e-01 -7.59807148e-01 -7.97497264e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -7.56988676e-01 -5.13085556e-01 -8.34337165e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 - 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 7.50000000e-01 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 7.50000000e-01 -2.06462625e-12 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 - -1.00000000e+00 1.00000000e+00 2.00000000e-01 -1.00000000e+00 7.50000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e-01 -1.00000000e+00 7.50000000e-01 1.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 7.50000000e-01 -5.31234778e-13 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 - -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -2.09237873e-01 -4.53806070e-01 8.68795487e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.50000000e-01 -5.00000000e-01 1.00000000e+00 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 - 5.00000000e-01 1.00000000e+00 2.00000000e-01 2.50000000e-01 1.00000000e+00 2.00000000e-01 2.75279799e-12 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e-01 2.50000000e-01 1.00000000e+00 1.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 2.50000000e-01 1.00000000e+00 -5.31227839e-13 2.75282575e-12 1.00000000e+00 -5.31227839e-13 - -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -2.04187698e-01 -5.48263988e-01 6.12094029e-01 -1.41423116e-02 -4.65415711e-01 6.46359410e-01 -4.52816037e-01 -4.84716569e-01 7.35643057e-01 -2.21508272e-01 -4.76936119e-01 6.65330696e-01 -4.35358241e-02 -5.47856929e-01 6.65658980e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 - 5.00000000e-01 1.00000000e+00 -5.31227839e-13 2.50000000e-01 1.00000000e+00 -5.31227839e-13 2.75282575e-12 1.00000000e+00 -5.31227839e-13 5.00000000e-01 1.00000000e+00 -1.00000000e-01 2.50000000e-01 1.00000000e+00 -1.00000000e-01 2.75281187e-12 1.00000000e+00 -1.00000000e-01 5.00000000e-01 1.00000000e+00 -2.00000000e-01 2.50000000e-01 1.00000000e+00 -2.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 1.00000000e+00 8.00000000e-01 -7.50000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 -1.00000000e+00 1.00000000e+00 9.00000000e-01 -7.50000000e-01 1.00000000e+00 9.00000000e-01 -5.00000000e-01 1.00000000e+00 9.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -7.50000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 - -1.00000000e+00 5.00000000e-01 8.00000000e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 -1.00000000e+00 7.50000000e-01 8.00000000e-01 -7.33417299e-01 7.45318984e-01 8.16801742e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -1.00000000e+00 1.00000000e+00 8.00000000e-01 -7.50000000e-01 1.00000000e+00 8.00000000e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 - 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 5.43805201e-01 -2.74415027e-01 2.11309501e-01 4.60634676e-01 -2.74851932e-01 1.42167096e-01 5.30532753e-01 -2.53759366e-01 -1.51549915e-02 5.04393824e-01 -1.33182910e-02 2.48245576e-01 4.68890807e-01 3.41650845e-02 9.73673139e-02 5.26291307e-01 -4.64778992e-02 3.48283959e-02 - -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 -1.00000000e+00 -2.50000000e-01 1.00000000e+00 -7.50000000e-01 -2.50000000e-01 1.00000000e+00 -5.00000000e-01 -2.50000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -7.50000000e-01 2.06459849e-12 1.00000000e+00 -5.00000000e-01 1.37639899e-12 1.00000000e+00 - -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 2.14876777e-01 2.66014695e-02 1.95716027e-03 2.40675690e-01 1.35868819e-02 -1.32847045e-01 2.39904708e-01 2.97034161e-02 -2.43450037e-01 5.26291307e-01 -4.64778992e-02 3.48283959e-02 4.65247400e-01 -4.40553697e-02 -1.07400414e-01 4.93990198e-01 1.96586961e-02 -2.00936210e-01 - -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -1.00000000e+00 -2.50000000e-01 8.00000000e-01 -7.28652026e-01 -2.32061883e-01 8.05360909e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -1.00000000e+00 2.75282575e-12 8.00000000e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 - 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 7.50000000e-01 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 4.51723141e-01 -7.12445778e-01 -6.31796976e-01 7.81919864e-01 -7.71891779e-01 -5.92480176e-01 1.00000000e+00 -7.50000000e-01 -6.00000000e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 7.71083683e-01 -4.83737049e-01 -6.24197292e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 -4.84513376e-01 7.88613759e-01 -2.47734269e-02 -4.69709896e-01 7.22790237e-01 -1.35031999e-01 -4.70185252e-01 7.09785934e-01 -1.98354831e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -5.00000000e-01 1.00000000e+00 6.00000000e-01 -4.56240197e-01 7.11292251e-01 5.92377271e-01 -5.01288867e-01 4.74009546e-01 6.17231993e-01 -7.50000000e-01 1.00000000e+00 6.00000000e-01 -7.62957935e-01 7.97576878e-01 5.88911288e-01 -7.45184141e-01 4.51483100e-01 5.88051785e-01 -1.00000000e+00 1.00000000e+00 6.00000000e-01 -1.00000000e+00 7.50000000e-01 6.00000000e-01 -1.00000000e+00 5.00000000e-01 6.00000000e-01 - -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -7.56224055e-01 -4.89237272e-01 2.39317721e-01 -7.62796857e-01 -4.73609152e-01 1.05760567e-01 -7.39628005e-01 -5.05700884e-01 1.87812797e-02 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 - -2.75279799e-12 -1.00000000e+00 -6.00000000e-01 2.50000000e-01 -1.00000000e+00 -6.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 3.60248665e-02 -7.15736638e-01 -5.56900182e-01 2.50060687e-01 -7.04443808e-01 -6.04812110e-01 4.51723141e-01 -7.12445778e-01 -6.31796976e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.27888915e-01 -5.48643075e-01 -6.08178478e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 - 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 7.50000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -9.00000000e-01 7.50000000e-01 -1.00000000e+00 -9.00000000e-01 1.00000000e+00 -1.00000000e+00 -9.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 7.50000000e-01 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 - -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.49002019e-01 2.94878361e-01 2.22905724e-01 -4.91126648e-01 2.58928321e-01 5.69806889e-02 -4.71056834e-01 2.61828242e-01 -6.29466438e-03 -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 - -1.00000000e+00 -5.00000000e-01 8.00000000e-01 -7.07762706e-01 -5.44586279e-01 8.21587567e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -1.00000000e+00 -5.00000000e-01 9.00000000e-01 -7.43282336e-01 -5.01907987e-01 9.10718370e-01 -5.03899419e-01 -4.62782120e-01 9.19029729e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e+00 -7.50000000e-01 -5.00000000e-01 1.00000000e+00 -5.00000000e-01 -5.00000000e-01 1.00000000e+00 - 5.00000000e-01 -1.00000000e+00 2.00000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 5.12062842e-01 -7.55583018e-01 1.82592331e-01 4.64262691e-01 -7.01821563e-01 1.00021871e-01 5.05907645e-01 -7.32869598e-01 2.79303667e-02 5.27304788e-01 -4.85643487e-01 2.26288656e-01 4.51000579e-01 -4.97349104e-01 6.25409217e-02 5.46530874e-01 -5.43099550e-01 4.99998474e-02 - 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 5.00000000e-01 -1.00000000e+00 -7.00000000e-01 4.84994371e-01 -7.38185004e-01 -6.65984176e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 4.51723141e-01 -7.12445778e-01 -6.31796976e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 - -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 7.50000000e-01 -5.31234778e-13 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 1.00000000e+00 -1.00000000e-01 -1.00000000e+00 7.50000000e-01 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -1.00000000e+00 7.50000000e-01 -2.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 - 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 7.50000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 7.48197731e-01 -5.00521294e-01 -9.02070050e-01 1.00000000e+00 -5.00000000e-01 -9.00000000e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -5.39119198e-01 -2.18069642e-01 1.93502074e-01 -4.86713420e-01 -2.44213726e-01 8.93451833e-02 -4.78043847e-01 -2.07629733e-01 4.50886922e-02 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 - -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 2.89188667e-01 2.16866454e-01 -8.14176746e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 - 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 2.88874271e-01 -2.15716841e-01 -7.69846103e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 - 5.23944619e-01 1.85747848e-02 -5.96055755e-01 7.75733836e-01 -1.61799598e-03 -6.49360986e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 4.58568070e-01 2.90475700e-01 -5.61771941e-01 7.82733565e-01 2.58540036e-01 -5.89888172e-01 1.00000000e+00 2.50000000e-01 -6.00000000e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 7.52729016e-01 4.70095302e-01 -6.25440659e-01 1.00000000e+00 5.00000000e-01 -6.00000000e-01 - -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -7.08701747e-01 4.85548346e-02 1.58550948e-01 -7.84986887e-01 -3.81684720e-02 9.48671005e-02 -7.40704078e-01 3.39288150e-02 -3.48449259e-02 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 - 5.09344874e-01 3.09144506e-02 -8.04652537e-01 4.59365891e-01 2.14737771e-01 -7.78520302e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 5.33169296e-01 2.88871609e-01 -7.48787355e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.58568070e-01 2.90475700e-01 -5.61771941e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 - -5.00000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -5.09737465e-01 7.67979309e-01 2.14852365e-01 -5.02845819e-01 7.73810273e-01 1.30364171e-01 -4.84513376e-01 7.88613759e-01 -2.47734269e-02 -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 - 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 7.47443361e-01 -1.60454830e-02 -7.08548030e-01 1.00000000e+00 -2.75279799e-12 -7.00000000e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 7.75733836e-01 -1.61799598e-03 -6.49360986e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 - -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.50000000e-01 -1.00000000e+00 -1.00000000e+00 2.75279799e-12 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -9.00000000e-01 -1.00000000e+00 -2.50000000e-01 -9.00000000e-01 -1.00000000e+00 2.75279799e-12 -9.00000000e-01 -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -2.50000000e-01 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 - 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 2.50000000e-01 8.00000000e-01 1.00000000e+00 5.00000000e-01 8.00000000e-01 1.00000000e+00 -2.75281187e-12 9.00000000e-01 1.00000000e+00 2.50000000e-01 9.00000000e-01 1.00000000e+00 5.00000000e-01 9.00000000e-01 1.00000000e+00 -2.75279799e-12 1.00000000e+00 1.00000000e+00 2.50000000e-01 1.00000000e+00 1.00000000e+00 5.00000000e-01 1.00000000e+00 - -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 7.49249469e-03 2.36547375e-01 -8.39364433e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 -3.05552104e-02 2.65334773e-01 -6.90856343e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 4.76975638e-03 2.22747039e-01 -5.54198113e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 - -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 -1.00000000e+00 -5.00000000e-01 -1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -2.00000000e-01 -7.39628005e-01 -5.05700884e-01 1.87812797e-02 -7.30008300e-01 -5.47348177e-01 -1.01940973e-01 -7.23830262e-01 -5.10947776e-01 -2.04324878e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - -2.75279799e-12 -1.00000000e+00 -1.00000000e+00 2.50000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -2.75279799e-12 -1.00000000e+00 -9.00000000e-01 2.50000000e-01 -1.00000000e+00 -9.00000000e-01 5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 2.50000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 - -5.00000000e-01 1.37639899e-12 -1.00000000e+00 -5.00000000e-01 2.50000000e-01 -1.00000000e+00 -5.00000000e-01 5.00000000e-01 -1.00000000e+00 -5.44969323e-01 -1.53711289e-02 -9.48099439e-01 -5.38981877e-01 2.96708750e-01 -8.76711821e-01 -4.93041941e-01 5.01547675e-01 -9.01661465e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -5.07465278e-01 2.07420878e-01 -8.32089854e-01 -4.72256518e-01 4.55448912e-01 -8.33711630e-01 - 4.47838296e-02 -5.46141782e-01 8.07112459e-01 2.29874623e-01 -4.65326983e-01 7.94081285e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 -3.62142612e-02 -5.42974667e-01 8.55590978e-01 2.70130842e-01 -4.98191594e-01 9.30082282e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 -1.37639899e-12 -5.00000000e-01 1.00000000e+00 2.50000000e-01 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 - 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.06459849e-12 7.50000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 3.94476533e-02 7.30638742e-01 -8.91840879e-01 2.75279799e-12 1.00000000e+00 -9.00000000e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 - 5.00000000e-01 1.00000000e+00 6.00000000e-01 7.50000000e-01 1.00000000e+00 6.00000000e-01 1.00000000e+00 1.00000000e+00 6.00000000e-01 5.00000000e-01 1.00000000e+00 7.00000000e-01 7.50000000e-01 1.00000000e+00 7.00000000e-01 1.00000000e+00 1.00000000e+00 7.00000000e-01 5.00000000e-01 1.00000000e+00 8.00000000e-01 7.50000000e-01 1.00000000e+00 8.00000000e-01 1.00000000e+00 1.00000000e+00 8.00000000e-01 - -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 2.02005392e-01 1.35088691e-02 -5.71704179e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 4.76975638e-03 2.22747039e-01 -5.54198113e-01 2.91138431e-01 2.35274349e-01 -5.51608391e-01 4.58568070e-01 2.90475700e-01 -5.61771941e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 2.88127504e-01 4.80366421e-01 -6.27498998e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 - 1.37639899e-12 5.00000000e-01 -1.00000000e+00 2.50000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 -3.05308802e-02 5.18864384e-01 -8.64097917e-01 2.60867227e-01 5.22254554e-01 -9.09337193e-01 4.70494256e-01 5.00918977e-01 -8.78265196e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 - -1.00000000e+00 -5.00000000e-01 -8.00000000e-01 -1.00000000e+00 -2.50000000e-01 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 -5.00000000e-01 -7.00000000e-01 -1.00000000e+00 -2.50000000e-01 -7.00000000e-01 -1.00000000e+00 2.75279799e-12 -7.00000000e-01 -1.00000000e+00 -5.00000000e-01 -6.00000000e-01 -1.00000000e+00 -2.50000000e-01 -6.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.50000000e-01 -1.00000000e+00 8.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 -5.07308198e-01 -7.82121727e-01 8.13640678e-01 -2.32778847e-01 -7.32731274e-01 8.13562707e-01 2.38487752e-02 -7.29730803e-01 8.39484079e-01 -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 3.87532026e-02 -7.48895411e-01 2.03633120e-01 -1.83511266e-02 -7.81917519e-01 6.84074762e-02 3.57478130e-02 -7.19804803e-01 -2.81200514e-02 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 - 5.00000000e-01 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -9.00000000e-01 7.50000000e-01 1.00000000e+00 -9.00000000e-01 1.00000000e+00 1.00000000e+00 -9.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 7.50000000e-01 1.00000000e+00 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 - -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 2.50000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 2.69114021e-01 -5.15966523e-01 -9.48240687e-01 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 - -1.00000000e+00 2.75282575e-12 8.00000000e-01 -7.92118850e-01 -4.99448945e-02 7.98765239e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -1.00000000e+00 2.50000000e-01 8.00000000e-01 -7.49028192e-01 2.17844318e-01 8.44612291e-01 -4.53953092e-01 2.25492172e-01 7.84345809e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 -7.72338920e-01 4.71550670e-01 7.96101304e-01 -4.90548406e-01 5.30132674e-01 8.30068751e-01 - -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -7.50000000e-01 -1.00000000e+00 -1.00000000e+00 -5.00000000e-01 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00 -9.00000000e-01 -7.50000000e-01 -1.00000000e+00 -9.00000000e-01 -5.00000000e-01 -1.00000000e+00 -9.00000000e-01 -1.00000000e+00 -1.00000000e+00 -8.00000000e-01 -7.50000000e-01 -1.00000000e+00 -8.00000000e-01 -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 - -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 -4.89436317e-01 -4.44245700e-02 9.14169961e-01 -2.20873227e-01 -3.75745311e-03 9.44865877e-01 -4.18742285e-02 -4.11084481e-02 9.21269509e-01 -5.00000000e-01 1.37639899e-12 1.00000000e+00 -2.50000000e-01 6.88199497e-13 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 - -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -2.16946743e-01 -5.25091517e-01 -7.09679786e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -2.63857307e-01 -5.34652399e-01 -6.28666006e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 - 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 3.10006252e-02 -4.75067231e-01 -6.68931634e-01 2.51700686e-01 -4.75998118e-01 -6.83401355e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 2.27888915e-01 -5.48643075e-01 -6.08178478e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -4.98466940e-01 -7.73475031e-01 1.66920868e-01 -5.39246180e-01 -7.62299504e-01 1.17290036e-01 -4.79675664e-01 -7.95380719e-01 -4.19450610e-02 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 - 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 7.50000000e-01 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 7.18008568e-01 -7.14058162e-01 -7.52591447e-01 1.00000000e+00 -7.50000000e-01 -8.00000000e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 7.93366816e-01 -5.28065211e-01 -8.28190709e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -7.11589479e-01 4.73335261e-01 2.49885800e-01 -7.55379689e-01 5.02039035e-01 1.49589770e-01 -7.83353594e-01 5.17147107e-01 -3.99209592e-02 -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 - 1.00000000e+00 -1.00000000e+00 -1.00000000e+00 1.00000000e+00 -7.50000000e-01 -1.00000000e+00 1.00000000e+00 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -1.00000000e+00 -9.00000000e-01 1.00000000e+00 -7.50000000e-01 -9.00000000e-01 1.00000000e+00 -5.00000000e-01 -9.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -7.50000000e-01 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 - -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -4.71056834e-01 2.61828242e-01 -6.29466438e-03 -5.48172301e-01 2.45067493e-01 -5.10752028e-02 -4.63290913e-01 2.52761197e-01 -2.45700557e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - 2.75279799e-12 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -9.00000000e-01 2.50000000e-01 1.00000000e+00 -9.00000000e-01 5.00000000e-01 1.00000000e+00 -9.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 2.50000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 2.75282575e-12 8.00000000e-01 -1.00000000e+00 2.50000000e-01 8.00000000e-01 -1.00000000e+00 5.00000000e-01 8.00000000e-01 -1.00000000e+00 2.75281187e-12 9.00000000e-01 -1.00000000e+00 2.50000000e-01 9.00000000e-01 -1.00000000e+00 5.00000000e-01 9.00000000e-01 -1.00000000e+00 2.75279799e-12 1.00000000e+00 -1.00000000e+00 2.50000000e-01 1.00000000e+00 -1.00000000e+00 5.00000000e-01 1.00000000e+00 - 5.00000000e-01 -5.00000000e-01 1.00000000e+00 7.50000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -5.00000000e-01 1.00000000e+00 5.00000000e-01 -2.50000000e-01 1.00000000e+00 7.50000000e-01 -2.50000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 5.00000000e-01 -1.37645451e-12 1.00000000e+00 7.50000000e-01 -2.06462625e-12 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 - -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 -2.85273885e-01 -7.11165751e-01 -3.61668105e-02 -2.22166591e-01 -7.68530707e-01 -1.26377051e-01 -2.07140846e-01 -7.92509484e-01 -2.24986267e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -9.00000000e-01 1.00000000e+00 2.50000000e-01 -9.00000000e-01 1.00000000e+00 5.00000000e-01 -9.00000000e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 1.00000000e+00 2.50000000e-01 -8.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 - 1.00000000e+00 -5.00000000e-01 -5.31227839e-13 1.00000000e+00 -5.00000000e-01 -1.00000000e-01 1.00000000e+00 -5.00000000e-01 -2.00000000e-01 7.54486357e-01 -4.65779570e-01 4.65500115e-02 7.45652536e-01 -5.48822921e-01 -1.45145075e-01 7.62093252e-01 -5.48127444e-01 -1.80394090e-01 5.46530874e-01 -5.43099550e-01 4.99998474e-02 4.98507983e-01 -4.65645755e-01 -1.48353428e-01 5.49365307e-01 -4.77550453e-01 -1.75580663e-01 - -5.18510442e-01 -4.61975434e-01 7.65918784e-01 -2.90343476e-01 -5.06743973e-01 8.29449439e-01 4.47838296e-02 -5.46141782e-01 8.07112459e-01 -4.89109882e-01 -2.87796797e-01 7.70910747e-01 -2.26655422e-01 -2.46675215e-01 8.14959825e-01 2.34563775e-02 -2.57775708e-01 8.38831352e-01 -4.96184639e-01 -3.41758945e-02 7.94093507e-01 -2.45729617e-01 1.64004981e-02 8.44642349e-01 -3.53396575e-02 -3.65929367e-02 8.03489850e-01 - -5.00000000e-01 -1.00000000e+00 -8.00000000e-01 -5.36436094e-01 -7.59740438e-01 -7.95069007e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -5.00000000e-01 -1.00000000e+00 -7.00000000e-01 -5.16530636e-01 -7.79155729e-01 -7.21762249e-01 -5.38746678e-01 -4.50045194e-01 -7.05661056e-01 -5.00000000e-01 -1.00000000e+00 -6.00000000e-01 -5.19284749e-01 -7.83778037e-01 -5.82806477e-01 -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 - -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 -7.98649990e-01 -2.91977690e-01 3.76771938e-02 -7.69015107e-01 -2.60617708e-01 -7.61638297e-02 -7.94536143e-01 -2.68885321e-01 -1.66434791e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 - 0.00000000e+00 0.00000000e+00 -1.00000000e+00 2.50000000e-01 -6.88227253e-13 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 -4.45484059e-02 -7.34165244e-03 -9.39826672e-01 2.33031555e-01 -1.28211303e-02 -8.62544563e-01 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 2.34455685e-01 -3.48553342e-02 -7.83391677e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 - 2.81216416e-02 5.47228351e-01 -7.57921741e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 2.34152876e-01 7.47001994e-01 -7.61482326e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 2.50000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 -7.83353594e-01 5.17147107e-01 -3.99209592e-02 -7.73749894e-01 5.16432557e-01 -1.17487197e-01 -7.04899767e-01 4.70385201e-01 -2.10375257e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - -2.75279799e-12 -1.00000000e+00 2.00000000e-01 -2.75281187e-12 -1.00000000e+00 1.00000000e-01 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -2.83997912e-01 -7.90354142e-01 2.38104026e-01 -2.61610301e-01 -7.06670631e-01 9.04965407e-02 -2.85273885e-01 -7.11165751e-01 -3.61668105e-02 -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 - 5.00000000e-01 5.00000000e-01 -1.00000000e+00 7.50000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 5.00000000e-01 7.50000000e-01 -1.00000000e+00 7.50000000e-01 7.50000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 7.50000000e-01 1.00000000e+00 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 - 2.75282575e-12 1.00000000e+00 -5.31227839e-13 2.75281187e-12 1.00000000e+00 -1.00000000e-01 2.75279799e-12 1.00000000e+00 -2.00000000e-01 2.25211425e-01 7.87891962e-01 -9.39040992e-03 2.27194458e-01 7.80514207e-01 -1.10576007e-01 2.63252585e-01 7.40363202e-01 -1.92816815e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - -4.90548406e-01 5.30132674e-01 8.30068751e-01 -4.97853636e-01 7.04626496e-01 8.09272834e-01 -5.00000000e-01 1.00000000e+00 8.00000000e-01 -4.64691612e-01 5.16445723e-01 8.52706387e-01 -5.10127471e-01 7.70774332e-01 9.32284862e-01 -5.00000000e-01 1.00000000e+00 9.00000000e-01 -5.00000000e-01 5.00000000e-01 1.00000000e+00 -5.00000000e-01 7.50000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 - -1.00000000e+00 2.75279799e-12 -8.00000000e-01 -1.00000000e+00 2.50000000e-01 -8.00000000e-01 -1.00000000e+00 5.00000000e-01 -8.00000000e-01 -1.00000000e+00 2.75279799e-12 -7.00000000e-01 -1.00000000e+00 2.50000000e-01 -7.00000000e-01 -1.00000000e+00 5.00000000e-01 -7.00000000e-01 -1.00000000e+00 2.75279799e-12 -6.00000000e-01 -1.00000000e+00 2.50000000e-01 -6.00000000e-01 -1.00000000e+00 5.00000000e-01 -6.00000000e-01 - 5.07529007e-01 -2.21590699e-02 5.82710233e-01 7.17970008e-01 -1.41566063e-02 5.58387791e-01 1.00000000e+00 -2.75279799e-12 6.00000000e-01 4.90535533e-01 3.69252962e-02 6.84877395e-01 7.06962214e-01 1.36224033e-02 6.82437435e-01 1.00000000e+00 -2.75281187e-12 7.00000000e-01 5.08559128e-01 4.68350764e-02 8.47523900e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 - -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 -4.78658864e-01 -2.86922400e-01 -7.77648495e-01 -2.27936065e-01 -2.02156405e-01 -8.03899353e-01 3.17753980e-03 -2.36598418e-01 -8.39069706e-01 -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 - -4.96695706e-01 -7.34886487e-03 -7.54764538e-01 -2.29234917e-01 -4.04674927e-03 -8.26784726e-01 -3.03514406e-02 -9.68563506e-03 -8.14984565e-01 -5.06908042e-01 3.92550353e-02 -6.97611201e-01 -2.92161293e-01 -4.06917502e-02 -6.93066376e-01 -9.33539717e-03 -2.86745759e-02 -6.99080104e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -2.27518950e-01 -3.08139637e-02 -6.49633469e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - 1.00000000e+00 -5.00000000e-01 8.00000000e-01 1.00000000e+00 -2.50000000e-01 8.00000000e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 1.00000000e+00 -5.00000000e-01 9.00000000e-01 1.00000000e+00 -2.50000000e-01 9.00000000e-01 1.00000000e+00 -2.75281187e-12 9.00000000e-01 1.00000000e+00 -5.00000000e-01 1.00000000e+00 1.00000000e+00 -2.50000000e-01 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 - -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 2.50000000e-01 -5.31227839e-13 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 -1.00000000e+00 5.00000000e-01 -1.00000000e-01 -1.00000000e+00 2.50000000e-01 -1.00000000e-01 -1.00000000e+00 2.75281187e-12 -1.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.00000000e-01 -1.00000000e+00 2.50000000e-01 -2.00000000e-01 -1.00000000e+00 2.75279799e-12 -2.00000000e-01 - 2.81216416e-02 5.47228351e-01 -7.57921741e-01 2.32215317e-01 5.20137148e-01 -7.81858786e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 -4.37612230e-02 5.22094442e-01 -6.71275861e-01 2.52054048e-01 4.68467442e-01 -6.83075965e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 2.88127504e-01 4.80366421e-01 -6.27498998e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 - -1.00000000e+00 -1.00000000e+00 2.00000000e-01 -7.50000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -1.00000000e+00 -1.00000000e+00 1.00000000e-01 -7.50000000e-01 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -1.00000000e+00 -1.00000000e+00 -5.31241717e-13 -7.50000000e-01 -1.00000000e+00 -5.31234778e-13 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 - 5.00000000e-01 -1.00000000e+00 -1.00000000e+00 5.00000000e-01 -7.50000000e-01 -1.00000000e+00 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -1.00000000e+00 -9.00000000e-01 4.58333239e-01 -7.78485232e-01 -8.54036893e-01 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 - 5.00000000e-01 5.00000000e-01 -1.00000000e+00 5.00000000e-01 7.50000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e+00 -1.00000000e+00 4.70494256e-01 5.00918977e-01 -8.78265196e-01 4.84143459e-01 7.63467196e-01 -8.75978386e-01 5.00000000e-01 1.00000000e+00 -9.00000000e-01 4.76425748e-01 5.49663539e-01 -7.93911671e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 - 5.00000000e-01 -1.00000000e+00 8.00000000e-01 4.71655351e-01 -7.18048650e-01 7.61584360e-01 5.12293954e-01 -5.47020830e-01 8.46585454e-01 5.00000000e-01 -1.00000000e+00 9.00000000e-01 4.73299977e-01 -7.16758539e-01 9.33283353e-01 4.90048549e-01 -4.72077875e-01 8.59423002e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -7.50000000e-01 1.00000000e+00 5.00000000e-01 -5.00000000e-01 1.00000000e+00 - 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 5.00000000e-01 -1.00000000e-01 1.00000000e+00 5.00000000e-01 -2.00000000e-01 7.87671700e-01 5.18477684e-01 2.65507873e-02 7.45407900e-01 4.74300234e-01 -8.32584288e-02 7.94545669e-01 5.15331880e-01 -1.50795761e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 4.79032967e-01 5.38576289e-01 -9.39792920e-02 4.67506556e-01 4.75925385e-01 -1.86547676e-01 - 5.00000000e-01 1.00000000e+00 2.00000000e-01 5.00000000e-01 1.00000000e+00 1.00000000e-01 5.00000000e-01 1.00000000e+00 -5.31227839e-13 5.28371569e-01 7.31981280e-01 1.80526485e-01 5.27596354e-01 7.03979621e-01 5.66260221e-02 5.35060517e-01 7.11084213e-01 3.07005869e-02 4.73613416e-01 4.84779377e-01 2.21525496e-01 5.45569160e-01 4.58390657e-01 1.26085267e-01 4.74690996e-01 4.58616508e-01 1.67721786e-02 - -5.00000000e-01 -1.00000000e+00 8.00000000e-01 -2.50000000e-01 -1.00000000e+00 8.00000000e-01 -2.75282575e-12 -1.00000000e+00 8.00000000e-01 -5.00000000e-01 -1.00000000e+00 9.00000000e-01 -2.50000000e-01 -1.00000000e+00 9.00000000e-01 -2.75281187e-12 -1.00000000e+00 9.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.50000000e-01 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 1.00000000e+00 - 4.76425748e-01 5.49663539e-01 -7.93911671e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 4.89186922e-01 5.39995463e-01 -6.98465311e-01 5.13618419e-01 7.13005495e-01 -7.05070610e-01 5.00000000e-01 1.00000000e+00 -7.00000000e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 4.67519964e-01 7.42183049e-01 -6.00421251e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 2.50000000e-01 2.00000000e-01 -1.00000000e+00 2.75279799e-12 2.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 2.50000000e-01 1.00000000e-01 -1.00000000e+00 2.75281187e-12 1.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -1.00000000e+00 2.50000000e-01 -5.31227839e-13 -1.00000000e+00 2.75282575e-12 -5.31227839e-13 - 1.00000000e+00 5.00000000e-01 -1.00000000e+00 1.00000000e+00 7.50000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e+00 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -9.00000000e-01 1.00000000e+00 7.50000000e-01 -9.00000000e-01 1.00000000e+00 1.00000000e+00 -9.00000000e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 1.00000000e+00 7.50000000e-01 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -1.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 -7.30225254e-01 7.83182848e-01 -4.97444001e-02 -7.09016328e-01 7.29158642e-01 -1.40227885e-01 -7.80936772e-01 7.57720448e-01 -1.99463657e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -4.59757834e-01 5.06603317e-01 -7.03367936e-02 -5.47047120e-01 4.56261741e-01 -1.85047942e-01 - 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 7.50000000e-01 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -7.00000000e-01 7.50000000e-01 -1.00000000e+00 -7.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.00000000e-01 5.00000000e-01 -1.00000000e+00 -6.00000000e-01 7.50000000e-01 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 - 5.00000000e-01 -5.00000000e-01 -1.00000000e+00 5.00000000e-01 -2.50000000e-01 -1.00000000e+00 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 5.04766247e-01 -4.68414074e-01 -9.19070592e-01 4.56820619e-01 -2.40486813e-01 -8.69901215e-01 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 - 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 7.71083683e-01 -4.83737049e-01 -6.24197292e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 4.74472946e-01 -2.55527072e-01 -6.17101064e-01 7.57447184e-01 -2.73750487e-01 -6.40156968e-01 1.00000000e+00 -2.50000000e-01 -6.00000000e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 7.75733836e-01 -1.61799598e-03 -6.49360986e-01 1.00000000e+00 -2.75279799e-12 -6.00000000e-01 - -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -2.50000000e-01 -1.00000000e+00 -5.31227839e-13 -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 -5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -2.50000000e-01 -1.00000000e+00 -1.00000000e-01 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.00000000e-01 -2.50000000e-01 -1.00000000e+00 -2.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 - -4.90951945e-01 -4.63804978e-01 -5.84100454e-01 -2.63857307e-01 -5.34652399e-01 -6.28666006e-01 3.81344001e-02 -4.96202546e-01 -6.03263314e-01 -5.37458717e-01 -2.20855384e-01 -6.15373185e-01 -2.27894762e-01 -2.78777633e-01 -5.96910235e-01 1.11083696e-02 -2.30119466e-01 -6.11745165e-01 -5.00312350e-01 3.13724879e-02 -5.99415152e-01 -2.27518950e-01 -3.08139637e-02 -6.49633469e-01 -1.28068120e-02 -6.19713351e-03 -6.44458876e-01 - 5.08559128e-01 4.68350764e-02 8.47523900e-01 7.57500584e-01 2.90869110e-02 7.75710654e-01 1.00000000e+00 -2.75282575e-12 8.00000000e-01 4.76952001e-01 -1.79275644e-02 8.84229682e-01 7.10656385e-01 -3.90368472e-02 8.70199235e-01 1.00000000e+00 -2.75281187e-12 9.00000000e-01 5.00000000e-01 -1.37645451e-12 1.00000000e+00 7.50000000e-01 -2.06462625e-12 1.00000000e+00 1.00000000e+00 -2.75279799e-12 1.00000000e+00 - -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -5.24358391e-01 4.81051989e-01 -6.72358624e-01 -5.12608499e-01 7.92499024e-01 -7.47789707e-01 -5.00000000e-01 1.00000000e+00 -7.00000000e-01 -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -4.72348517e-01 7.55363920e-01 -5.93158920e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -4.72256518e-01 4.55448912e-01 -8.33711630e-01 -2.11708358e-01 5.37982077e-01 -7.80706980e-01 2.81216416e-02 5.47228351e-01 -7.57921741e-01 -4.94253851e-01 7.97261337e-01 -7.87761641e-01 -2.99692682e-01 7.95631121e-01 -8.06065640e-01 3.61048890e-02 7.91693075e-01 -8.40217284e-01 -5.00000000e-01 1.00000000e+00 -8.00000000e-01 -2.50000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -8.00000000e-01 - -1.00000000e+00 5.00000000e-01 2.00000000e-01 -1.00000000e+00 5.00000000e-01 1.00000000e-01 -1.00000000e+00 5.00000000e-01 -5.31227839e-13 -7.81530511e-01 2.79380115e-01 2.11246802e-01 -7.69127379e-01 2.80955891e-01 6.68660699e-02 -7.67432407e-01 2.08191458e-01 2.61816764e-03 -4.62837110e-01 -5.51507834e-03 2.34568619e-01 -5.04460248e-01 1.38922272e-02 7.37272643e-02 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 - 1.59455851e-02 5.49948037e-01 -5.66649946e-01 2.88127504e-01 4.80366421e-01 -6.27498998e-01 5.39473453e-01 5.08327524e-01 -6.09109168e-01 -3.85304003e-02 7.30500373e-01 -6.37788061e-01 2.29855889e-01 7.20288707e-01 -6.42358530e-01 4.67519964e-01 7.42183049e-01 -6.00421251e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 2.50000000e-01 1.00000000e+00 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 - 1.00000000e+00 5.00000000e-01 2.00000000e-01 1.00000000e+00 7.50000000e-01 2.00000000e-01 1.00000000e+00 1.00000000e+00 2.00000000e-01 1.00000000e+00 5.00000000e-01 1.00000000e-01 1.00000000e+00 7.50000000e-01 1.00000000e-01 1.00000000e+00 1.00000000e+00 1.00000000e-01 1.00000000e+00 5.00000000e-01 -5.31241717e-13 1.00000000e+00 7.50000000e-01 -5.31241717e-13 1.00000000e+00 1.00000000e+00 -5.31241717e-13 - 4.04523035e-02 5.23334239e-01 7.85315811e-01 2.70035847e-01 4.56027669e-01 7.54542734e-01 5.36295327e-01 5.28286707e-01 7.83714183e-01 -5.21424954e-03 4.70979575e-01 8.92839717e-01 2.58520722e-01 4.90649406e-01 9.26968893e-01 5.27181526e-01 5.40730477e-01 8.79030607e-01 1.37639899e-12 5.00000000e-01 1.00000000e+00 2.50000000e-01 5.00000000e-01 1.00000000e+00 5.00000000e-01 5.00000000e-01 1.00000000e+00 - 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 7.50000000e-01 -2.06462625e-12 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 5.00000000e-01 2.50000000e-01 -1.00000000e+00 7.50000000e-01 2.50000000e-01 -1.00000000e+00 1.00000000e+00 2.50000000e-01 -1.00000000e+00 5.00000000e-01 5.00000000e-01 -1.00000000e+00 7.50000000e-01 5.00000000e-01 -1.00000000e+00 1.00000000e+00 5.00000000e-01 -1.00000000e+00 - -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 -2.70734059e-01 2.91861282e-01 2.01535922e-01 -2.05210706e-01 2.55930784e-01 6.09896351e-02 -2.12499061e-01 2.63559960e-01 2.50309024e-02 6.74274859e-03 2.44560250e-02 1.94432050e-01 -1.82155746e-02 4.54368181e-02 1.19331856e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 - -5.00000000e-01 -1.00000000e+00 2.00000000e-01 -5.00000000e-01 -1.00000000e+00 1.00000000e-01 -5.00000000e-01 -1.00000000e+00 -5.31227839e-13 -7.32136997e-01 -7.68847575e-01 2.25254060e-01 -7.27802875e-01 -7.30247579e-01 5.57324192e-02 -7.38622456e-01 -7.20629057e-01 2.58153547e-02 -1.00000000e+00 -5.00000000e-01 2.00000000e-01 -1.00000000e+00 -5.00000000e-01 1.00000000e-01 -1.00000000e+00 -5.00000000e-01 -5.31241717e-13 - -2.75279799e-12 -1.00000000e+00 -8.00000000e-01 2.50000000e-01 -1.00000000e+00 -8.00000000e-01 5.00000000e-01 -1.00000000e+00 -8.00000000e-01 1.69469293e-02 -7.57622706e-01 -8.07014733e-01 2.78394223e-01 -7.39518919e-01 -8.05394048e-01 4.54873771e-01 -7.49268254e-01 -7.59776097e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 2.50750443e-01 -5.17573449e-01 -7.63372959e-01 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 - 1.00000000e+00 -2.75279799e-12 6.00000000e-01 1.00000000e+00 -2.50000000e-01 6.00000000e-01 1.00000000e+00 -5.00000000e-01 6.00000000e-01 7.17970008e-01 -1.41566063e-02 5.58387791e-01 7.85439604e-01 -2.42670287e-01 6.23520706e-01 7.11398136e-01 -5.13660148e-01 5.52310014e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 5.17509951e-01 -2.15134087e-01 5.98024945e-01 4.50833552e-01 -4.86449668e-01 6.33189651e-01 - -2.75282575e-12 -1.00000000e+00 -5.31227839e-13 2.50000000e-01 -1.00000000e+00 -5.31234778e-13 5.00000000e-01 -1.00000000e+00 -5.31241717e-13 -2.75281187e-12 -1.00000000e+00 -1.00000000e-01 2.50000000e-01 -1.00000000e+00 -1.00000000e-01 5.00000000e-01 -1.00000000e+00 -1.00000000e-01 -2.75279799e-12 -1.00000000e+00 -2.00000000e-01 2.50000000e-01 -1.00000000e+00 -2.00000000e-01 5.00000000e-01 -1.00000000e+00 -2.00000000e-01 - -1.00000000e+00 1.00000000e+00 2.00000000e-01 -1.00000000e+00 1.00000000e+00 1.00000000e-01 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -7.78681422e-01 7.97121596e-01 1.57212989e-01 -7.94522386e-01 7.55757599e-01 1.43601664e-01 -7.30225254e-01 7.83182848e-01 -4.97444001e-02 -4.68269906e-01 5.44864759e-01 1.91424881e-01 -4.64358212e-01 4.58675620e-01 1.38122074e-01 -4.54327930e-01 4.86669001e-01 -4.97810569e-02 - 5.00000000e-01 -1.37645451e-12 -1.00000000e+00 7.50000000e-01 -2.06462625e-12 -1.00000000e+00 1.00000000e+00 -2.75279799e-12 -1.00000000e+00 5.26516460e-01 -1.79156357e-02 -9.14855284e-01 7.09086800e-01 -2.05745677e-02 -8.72720579e-01 1.00000000e+00 -2.75279799e-12 -9.00000000e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 7.10663881e-01 2.04042076e-02 -8.41195259e-01 1.00000000e+00 -2.75279799e-12 -8.00000000e-01 - -1.41423116e-02 -4.65415711e-01 6.46359410e-01 3.60221343e-02 -7.72494852e-01 6.10765349e-01 -2.75279799e-12 -1.00000000e+00 6.00000000e-01 -2.04187698e-01 -5.48263988e-01 6.12094029e-01 -2.10587495e-01 -7.49604268e-01 5.55379367e-01 -2.50000000e-01 -1.00000000e+00 6.00000000e-01 -4.54143370e-01 -4.71697648e-01 6.06228169e-01 -5.48640676e-01 -7.77286265e-01 6.36669671e-01 -5.00000000e-01 -1.00000000e+00 6.00000000e-01 - -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 -2.28102848e-01 7.22658326e-01 1.37320272e-03 -2.69998668e-01 7.39667674e-01 -9.92035629e-02 -2.00554723e-01 7.20919671e-01 -2.28707058e-01 -2.11337044e-02 5.20175598e-01 1.44520351e-02 4.87256245e-02 4.94654631e-01 -1.27631583e-01 3.63854332e-02 4.76218270e-01 -2.16523681e-01 - -5.00000000e-01 -5.00000000e-01 -1.00000000e+00 -2.50000000e-01 -5.00000000e-01 -1.00000000e+00 -1.37639899e-12 -5.00000000e-01 -1.00000000e+00 -4.69656075e-01 -5.35466366e-01 -9.31714921e-01 -2.29859095e-01 -4.62241540e-01 -8.89853533e-01 1.25526667e-02 -4.60182875e-01 -9.43746487e-01 -4.50759435e-01 -5.07516091e-01 -7.91771330e-01 -2.43758964e-01 -4.87340919e-01 -8.42554923e-01 2.76285401e-02 -4.95902271e-01 -7.55537435e-01 - 4.62397648e-01 5.08353086e-01 5.76246851e-01 4.54102049e-01 2.74010313e-01 5.73290265e-01 5.07529007e-01 -2.21590699e-02 5.82710233e-01 2.93080452e-01 4.76318217e-01 6.15661245e-01 2.29679836e-01 2.69446281e-01 6.27084301e-01 2.01691136e-01 -4.79247863e-02 5.66882667e-01 -1.11217671e-02 4.85990029e-01 5.72847359e-01 -2.39636276e-02 2.31604414e-01 6.19527443e-01 -4.84577644e-02 4.06855736e-02 5.60664410e-01 - 2.75279799e-12 1.00000000e+00 2.00000000e-01 -2.50000000e-01 1.00000000e+00 2.00000000e-01 -5.00000000e-01 1.00000000e+00 2.00000000e-01 2.75281187e-12 1.00000000e+00 1.00000000e-01 -2.50000000e-01 1.00000000e+00 1.00000000e-01 -5.00000000e-01 1.00000000e+00 1.00000000e-01 2.75282575e-12 1.00000000e+00 -5.31227839e-13 -2.50000000e-01 1.00000000e+00 -5.31234778e-13 -5.00000000e-01 1.00000000e+00 -5.31241717e-13 - -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 -2.63967420e-01 3.93850057e-02 3.28850264e-02 -2.73606057e-01 9.90301043e-03 -1.42874927e-01 -2.80153842e-01 -3.64863794e-02 -1.56716221e-01 -1.34542997e-02 5.28119076e-03 -4.78164736e-02 -1.71972474e-02 2.14904516e-02 -1.19550486e-01 2.11936734e-02 -3.28116300e-02 -2.37821853e-01 - 2.75279799e-12 1.00000000e+00 -8.00000000e-01 2.50000000e-01 1.00000000e+00 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 2.75279799e-12 1.00000000e+00 -7.00000000e-01 2.50000000e-01 1.00000000e+00 -7.00000000e-01 5.00000000e-01 1.00000000e+00 -7.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 2.50000000e-01 1.00000000e+00 -6.00000000e-01 5.00000000e-01 1.00000000e+00 -6.00000000e-01 - -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -4.92202669e-01 -4.92451771e-01 -7.65778954e-02 -4.73265333e-01 -5.08397399e-01 -2.19492925e-01 -4.78043847e-01 -2.07629733e-01 4.50886922e-02 -5.18699628e-01 -2.03255142e-01 -1.07225665e-01 -5.40207811e-01 -2.89915281e-01 -2.42605818e-01 -5.00266360e-01 -1.67846048e-02 4.37459152e-02 -5.07805035e-01 2.51663602e-02 -7.21718618e-02 -4.73832276e-01 -3.56829011e-02 -1.78227766e-01 - 4.93603166e-01 -5.23866662e-01 -7.57027301e-01 4.60760044e-01 -2.32310186e-01 -8.39283726e-01 5.09344874e-01 3.09144506e-02 -8.04652537e-01 5.25816658e-01 -5.33672629e-01 -6.67341125e-01 4.72608798e-01 -2.91735905e-01 -7.17049475e-01 5.21806831e-01 -4.18206676e-02 -6.63885283e-01 5.42454192e-01 -4.64801199e-01 -5.61650687e-01 4.74472946e-01 -2.55527072e-01 -6.17101064e-01 5.23944619e-01 1.85747848e-02 -5.96055755e-01 - 1.00000000e+00 -1.00000000e+00 -8.00000000e-01 1.00000000e+00 -7.50000000e-01 -8.00000000e-01 1.00000000e+00 -5.00000000e-01 -8.00000000e-01 1.00000000e+00 -1.00000000e+00 -7.00000000e-01 1.00000000e+00 -7.50000000e-01 -7.00000000e-01 1.00000000e+00 -5.00000000e-01 -7.00000000e-01 1.00000000e+00 -1.00000000e+00 -6.00000000e-01 1.00000000e+00 -7.50000000e-01 -6.00000000e-01 1.00000000e+00 -5.00000000e-01 -6.00000000e-01 - -5.00000000e-01 1.00000000e+00 -5.31241717e-13 -7.50000000e-01 1.00000000e+00 -5.31241717e-13 -1.00000000e+00 1.00000000e+00 -5.31241717e-13 -5.00000000e-01 1.00000000e+00 -1.00000000e-01 -7.50000000e-01 1.00000000e+00 -1.00000000e-01 -1.00000000e+00 1.00000000e+00 -1.00000000e-01 -5.00000000e-01 1.00000000e+00 -2.00000000e-01 -7.50000000e-01 1.00000000e+00 -2.00000000e-01 -1.00000000e+00 1.00000000e+00 -2.00000000e-01 - -5.33691044e-01 5.15872621e-01 -5.63705958e-01 -2.28613183e-01 5.45106914e-01 -6.46579701e-01 1.59455851e-02 5.49948037e-01 -5.66649946e-01 -4.72348517e-01 7.55363920e-01 -5.93158920e-01 -2.79324600e-01 7.11748303e-01 -6.05174083e-01 -3.85304003e-02 7.30500373e-01 -6.37788061e-01 -5.00000000e-01 1.00000000e+00 -6.00000000e-01 -2.50000000e-01 1.00000000e+00 -6.00000000e-01 2.75279799e-12 1.00000000e+00 -6.00000000e-01 - 4.76425748e-01 5.49663539e-01 -7.93911671e-01 7.51957456e-01 4.95469044e-01 -7.92942999e-01 1.00000000e+00 5.00000000e-01 -8.00000000e-01 5.09388054e-01 7.82086633e-01 -8.01376012e-01 7.65968010e-01 7.01265899e-01 -7.54998642e-01 1.00000000e+00 7.50000000e-01 -8.00000000e-01 5.00000000e-01 1.00000000e+00 -8.00000000e-01 7.50000000e-01 1.00000000e+00 -8.00000000e-01 1.00000000e+00 1.00000000e+00 -8.00000000e-01 - -4.94242892e-01 -4.89897211e-01 1.68899693e-01 -4.95840150e-01 -5.26859865e-01 1.44509201e-01 -5.33725275e-01 -5.43716182e-01 -3.86117496e-02 -2.79454677e-01 -5.37813444e-01 2.02229801e-01 -2.60664590e-01 -4.66170921e-01 1.32762161e-01 -2.62569079e-01 -5.25838878e-01 -5.68085725e-03 6.18440419e-03 -5.20601584e-01 1.60809417e-01 -3.40808787e-02 -4.88361293e-01 1.25313313e-01 -2.31863951e-02 -4.60342335e-01 -4.81294616e-02 - - - H[0-31,524-555] - F[1,6,39,43,69,73,99,103,542,409,548,387,128,497,418,309,323,401,330,361,350,370,569,601,604,611,654,660,696,702,738,744,1174,780,1178,1135,1041,1026,1199,957,968,1221,972,1003,996,1012,1060,1035,1240,1245,1274,1278,1300,1304,1326,1330] - F[123,126,93,96,63,66,31,35,545,412,546,384,133,500,422,312,326,393,333,364,347,367,572,600,774,779,730,735,688,693,645,651,1177,785,1180,1133,1050,1029,1145,1202,964,1222,975,1006,993,1009,1057,1039,1347,1350,1321,1324,1295,1298,1267,1271] - F[100,104,108,111,115,118,122,125,549,406,544,390,558,300,415,320,340,395,578,588,353,593,505,494,741,747,752,757,762,767,772,777,1179,868,1176,951,1047,1023,1140,1193,981,1219,989,1210,999,1015,1053,1037,1327,1331,1334,1337,1340,1343,1346,1349] - F[32,36,23,27,14,18,4,9,543,381,547,403,303,217,420,316,336,399,343,377,357,373,584,597,642,648,630,636,618,624,607,614,1175,950,1181,1191,1019,1044,1142,961,978,1128,985,1209,1214,1217,1062,1032,1268,1272,1260,1264,1252,1256,1243,1248] - F[0,11,20,29,38,47,54,61,68,77,84,91,98,107,114,121] - F[1249,1257,1265,1273,1281,1287,1293,1299,1307,1313,1319,1325,1333,1339,1345,1351] - A[32-229,310-507] - P[230-245,508-523] - R[246-309] - - - C[1,601-603] - -
- - - L0211-XU - 5.3.0 - 07-Nov-2023 15:14:09 - - -v mixed_ref_cube_0.5_perturbed_order_2.msh mixed_ref_cube_0.5_perturbed_order_2.tmp.xml:xml:uncompress - -
diff --git a/test/test_resources/torus/conditions.xml b/test/test_resources/torus/conditions.xml new file mode 100644 index 00000000..76c872bf --- /dev/null +++ b/test/test_resources/torus/conditions.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + +

Lambda = 0.0

+
+ + + u + + + + C[100] + C[200] + C[300] + + + + + + + + + + + + + + +
+ +
diff --git a/test/test_resources/torus/quarter_torus_tets_order_2.xml b/test/test_resources/torus/quarter_torus_tets_order_2.xml new file mode 100644 index 00000000..659b4ae3 --- /dev/null +++ b/test/test_resources/torus/quarter_torus_tets_order_2.xml @@ -0,0 +1,4082 @@ + + + + + 1.96316234e+00 4.67346532e+00 -1.68911610e-02 + 1.54860554e+00 3.54808542e+00 -1.65108235e+00 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 1.76701972e+00 4.45263593e+00 -1.98899096e+00 + 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 6.91202058e-01 6.84908918e+00 -6.71566734e-01 + 9.96203868e-01 6.92875009e+00 -4.89858720e-16 + 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 + 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 6.36742397e+00 2.90790509e+00 -4.89858720e-16 + 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 + 3.66669029e+00 1.60543495e+00 1.73363787e+00 + 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 2.44916181e+00 5.21201554e+00 -1.85047539e+00 + 3.01195346e+00 1.97163196e+00 1.42817625e+00 + 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 6.32434990e+00 2.38750096e+00 9.49952515e-01 + 2.85345437e+00 4.35227192e+00 -1.98954064e+00 + 5.55889845e+00 2.08882586e+00 1.76618606e+00 + 6.98806688e-16 6.29429108e+00 2.92477739e-02 + 6.39713060e+00 2.40233486e+00 -7.99297168e-01 + 5.92163036e+00 2.69607897e+00 -1.31546814e+00 + 6.71645082e+00 1.97212790e+00 -4.89858720e-16 + 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 4.67943156e+00 1.72203103e+00 1.99995258e+00 + 1.47742668e+00 6.66084957e+00 -8.23188188e-01 + 5.48202315e+00 2.40466127e+00 -1.73992713e+00 + 5.29024702e+00 4.58402514e+00 -4.89858720e-16 + 5.45258967e+00 4.09839280e+00 -8.26773302e-01 + 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 + 3.81137977e+00 3.26482023e+00 2.43818043e-03 + 1.61330264e+00 2.59455891e+00 -4.66799866e-01 + 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 5.88877473e+00 3.78448572e+00 -4.89858720e-16 + 6.44939283e-16 5.80909663e+00 -7.28682117e-01 + 5.41262889e+00 4.14677334e+00 8.32446705e-01 + 3.93477797e+00 2.33712352e+00 1.95465416e+00 + 2.65894205e+00 5.84727816e+00 -1.40492233e+00 + 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 3.26434043e+00 5.97819314e+00 8.47910322e-01 + 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 8.18991350e-01 2.88610338e+00 1.50447569e-02 + 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 6.11057364e+00 1.81915532e+00 -1.45178853e+00 + 2.40016886e+00 6.39010822e+00 -8.15916232e-01 + 3.29955954e+00 5.49655452e+00 1.41755307e+00 + 1.84023910e+00 2.93931957e+00 -1.28551886e+00 + 6.66455249e+00 1.48910661e+00 -8.09427054e-01 + 4.76414707e+00 4.09287863e+00 -1.53606293e+00 + 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 6.92875009e+00 9.96203868e-01 -4.89858720e-16 + 5.29445700e-16 4.76882291e+00 4.26832841e-02 + 5.35379131e+00 1.37066032e+00 1.92946545e+00 + 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 2.35347470e+00 3.57273676e+00 -1.86522242e+00 + 1.60546045e+00 5.28911299e+00 -1.92920779e+00 + 3.78448572e+00 5.88877473e+00 -4.89858720e-16 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 + 4.76882291e+00 0.00000000e+00 4.26832841e-02 + 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 6.29429108e+00 0.00000000e+00 2.92477739e-02 + 1.97212790e+00 6.71645082e+00 -4.89858720e-16 + 1.79787339e+00 6.02976719e+00 -1.52659565e+00 + 5.65566405e-16 5.09416930e+00 -5.77290822e-01 + 6.11153928e-16 5.50478521e+00 8.72934590e-02 + 2.32657264e+00 2.25725956e+00 -9.52959980e-01 + 6.84886319e+00 6.86722414e-01 -6.73452256e-01 + 4.82901422e+00 4.82097219e+00 -8.21328667e-01 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 + 3.25199430e+00 3.46915743e+00 -1.98494345e+00 + 4.09839280e+00 5.45258967e+00 -8.26773302e-01 + 5.09416930e+00 0.00000000e+00 -5.77290822e-01 + 2.51312670e+00 5.79940159e+00 1.50208175e+00 + 3.07425129e+00 1.99753337e+00 -1.49031131e+00 + 4.07707079e+00 5.46855113e+00 8.26773302e-01 + 5.50478521e+00 0.00000000e+00 8.72934590e-02 + 4.19318871e+00 3.34729677e+00 -1.96634244e+00 + 5.97819314e+00 3.26434043e+00 -8.47910322e-01 + 2.71726342e+00 4.76227833e+00 1.94081239e+00 + 5.94337009e+00 3.32579295e+00 8.49502618e-01 + 9.28539289e-01 3.17060607e+00 -1.05963208e+00 + 5.73252083e+00 7.51834686e-01 1.84094565e+00 + 5.91004055e+00 0.00000000e+00 8.16875302e-01 + 5.50385532e+00 0.00000000e+00 1.34131946e+00 + 3.75674562e+00 4.26273080e+00 -1.88016210e+00 + 1.63966782e+00 2.61990395e+00 5.95450771e-01 + 6.56146310e-16 5.91004055e+00 8.16875302e-01 + 7.42174170e-01 6.47311362e+00 1.30506479e+00 + 6.11050690e-16 5.50385532e+00 1.34131946e+00 + 3.19684636e+00 2.95635512e+00 1.89289769e+00 + 5.01679319e+00 1.65535959e+00 -1.97989896e+00 + 2.90790509e+00 6.36742397e+00 -4.89858720e-16 + 7.42174170e-01 6.47311362e+00 -1.30506479e+00 + 3.22867716e+00 8.97119914e-01 1.13171941e+00 + 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 5.80909663e+00 0.00000000e+00 -7.28682117e-01 + 4.81523801e-16 4.33718082e+00 -8.53060355e-01 + 9.17002933e-01 4.84172634e+00 -1.99869635e+00 + 1.61933596e+00 3.29871374e+00 1.49789952e+00 + 3.36631027e+00 5.23557164e+00 -1.58139969e+00 + 5.02317376e+00 3.62072307e+00 1.60590616e+00 + 4.15141759e+00 4.93448788e+00 1.37905163e+00 + 3.52045619e+00 4.86774807e+00 1.72777047e+00 + 5.70006409e-16 5.13416130e+00 7.65775070e-01 + 5.71921026e-16 5.15140664e+00 -1.27674188e+00 + 4.18879533e+00 4.22468914e+00 1.76035677e+00 + 2.45654560e+00 3.56782772e+00 1.88505561e+00 + 2.72919104e+00 1.41103122e+00 5.33164898e-01 + 2.19969685e+00 2.04087676e+00 -5.06174164e-02 + 2.71390420e+00 2.74576871e+00 -1.64373145e+00 + 1.70582869e+00 4.21637311e+00 1.94834000e+00 + 8.67290394e-01 3.93082088e+00 -1.74644847e+00 + 3.37998430e+00 3.97055779e+00 1.98847851e+00 + 4.33718082e+00 0.00000000e+00 -8.53060355e-01 + 5.15140664e+00 0.00000000e+00 -1.27674188e+00 + 5.13416130e+00 0.00000000e+00 7.65775070e-01 + 4.67618055e+00 7.95671378e-01 -1.98346963e+00 + 6.47176543e+00 7.54185877e-01 1.30501830e+00 + 9.34999077e-01 5.73790834e+00 1.82703946e+00 + 7.02329418e-01 6.84062448e+00 6.91687670e-01 + 8.26534753e-01 3.12967293e+00 9.44322863e-01 + 5.56236085e+00 2.93472089e+00 1.52914670e+00 + 6.65570529e+00 1.44786006e+00 8.47910322e-01 + 8.30275396e-01 3.84107074e+00 1.68956565e+00 + 2.73498783e+00 1.45761881e+00 -6.21947363e-01 + 3.17077126e+00 6.77896230e-01 -9.54430520e-01 + 2.91459649e+00 7.10760232e-01 5.93224540e-03 + 3.69635146e+00 0.00000000e+00 -6.64484250e-01 + 3.88713014e+00 0.00000000e+00 6.66829671e-16 + 4.81636334e+00 4.81636334e+00 8.47910322e-01 + 8.49686589e-01 4.80418933e+00 1.99632123e+00 + 5.37609367e-16 4.84235469e+00 1.41969404e+00 + 3.33327135e+00 1.26368365e+00 -1.39288137e+00 + 6.84084917e+00 7.02014226e-01 6.91168376e-01 + 4.84518766e+00 2.71206661e+00 1.92214852e+00 + 3.99134937e+00 8.13497743e-01 1.77240692e+00 + 4.31558139e-16 3.88713014e+00 6.66829671e-16 + 4.11227798e-16 3.70401072e+00 6.80187645e-01 + 4.36781787e+00 0.00000000e+00 9.15873936e-01 + 3.70401072e+00 0.00000000e+00 6.80187645e-01 + 6.13925419e+00 1.44742402e+00 1.51335806e+00 + 5.29182930e+00 3.20197153e+00 -1.61103065e+00 + 4.84925196e-16 4.36781787e+00 9.15873936e-01 + 3.99545782e+00 1.68801727e+00 -1.88705283e+00 + 3.27995423e+00 5.97529909e+00 -8.37233641e-01 + 2.38239817e+00 2.71913079e+00 1.44300412e+00 + 1.44786006e+00 6.65570529e+00 8.47910322e-01 + 4.84235469e+00 0.00000000e+00 1.41969404e+00 + 4.90549429e+00 8.32101447e-01 1.99985075e+00 + 4.57236485e+00 2.45689195e+00 -1.99089249e+00 + 2.37171589e+00 6.39454874e+00 8.28751343e-01 + 3.84030955e+00 7.88128395e-01 -1.68355288e+00 + 4.10377450e-16 3.69635146e+00 -6.64484250e-01 + 6.46725517e+00 8.12777923e-01 -1.30203159e+00 + 2.35711984e+00 2.11720046e+00 8.03194791e-01 + 1.70602213e+00 6.14089415e+00 1.45381775e+00 + 3.39519120e-16 3.05811637e+00 4.78631329e-01 + 5.81876032e-16 5.24107336e+00 1.98541775e+00 + 3.50297850e+00 0.00000000e+00 -1.32624532e+00 + 8.28226845e-01 5.70140723e+00 -1.84945887e+00 + 4.76373410e-16 4.29079023e+00 -1.87003249e+00 + 4.76373410e-16 4.29079023e+00 1.87003249e+00 + 3.88908739e-16 3.50297850e+00 -1.32624532e+00 + 3.88908739e-16 3.50297850e+00 1.32624532e+00 + 3.50297850e+00 0.00000000e+00 1.32624532e+00 + 4.25164652e+00 4.79855501e+00 -1.41728728e+00 + 4.81935933e+00 4.29199656e+00 1.37382079e+00 + 5.24107336e+00 0.00000000e+00 1.98541775e+00 + 3.39519120e-16 3.05811637e+00 -4.78631329e-01 + 3.61427973e+00 2.57594904e+00 -1.91950416e+00 + 1.74506816e+00 5.29470996e+00 1.91559919e+00 + 3.05811637e+00 0.00000000e+00 -4.78631329e-01 + 4.29079023e+00 0.00000000e+00 -1.87003249e+00 + 5.70140723e+00 8.28226845e-01 -1.84945887e+00 + 6.81247225e-16 6.13612949e+00 1.64596773e+00 + 3.05811637e+00 0.00000000e+00 4.78631329e-01 + 6.81247225e-16 6.13612949e+00 -1.64596773e+00 + 6.13612949e+00 0.00000000e+00 -1.64596773e+00 + 4.29079023e+00 0.00000000e+00 1.87003249e+00 + 7.51722246e-16 6.77091205e+00 -9.29446344e-01 + 6.77091205e+00 0.00000000e+00 -9.29446344e-01 + 6.77091205e+00 0.00000000e+00 9.29446344e-01 + 7.51722246e-16 6.77091205e+00 9.29446344e-01 + 5.81876032e-16 5.24107336e+00 -1.98541775e+00 + 7.00000000e+00 0.00000000e+00 -4.89858720e-16 + 7.77156117e-16 7.00000000e+00 -4.89858720e-16 + 6.13612949e+00 0.00000000e+00 1.64596773e+00 + 5.24107336e+00 0.00000000e+00 -1.98541775e+00 + + + 1 0 + 1 2 + 2 0 + 0 3 + 1 3 + 2 3 + 4 1 + 4 0 + 4 2 + 4 5 + 0 5 + 2 5 + 4 3 + 7 6 + 7 8 + 8 6 + 6 9 + 7 9 + 8 9 + 10 11 + 11 12 + 10 12 + 10 13 + 11 13 + 12 13 + 10 14 + 12 14 + 14 15 + 10 15 + 12 15 + 17 16 + 17 12 + 12 16 + 16 18 + 17 18 + 12 18 + 19 4 + 19 0 + 19 5 + 20 12 + 20 18 + 20 21 + 12 21 + 18 21 + 22 14 + 22 10 + 22 12 + 23 4 + 23 2 + 23 5 + 19 9 + 4 9 + 0 9 + 24 11 + 24 12 + 24 13 + 6 25 + 8 25 + 25 9 + 10 16 + 16 13 + 11 22 + 26 27 + 27 10 + 26 10 + 26 15 + 27 15 + 28 26 + 28 10 + 26 29 + 28 29 + 10 29 + 14 28 + 14 26 + 16 30 + 12 30 + 30 13 + 31 7 + 31 8 + 31 9 + 28 22 + 28 11 + 7 25 + 32 27 + 32 10 + 32 15 + 9 3 + 23 19 + 34 33 + 34 15 + 15 33 + 33 35 + 34 35 + 15 35 + 31 6 + 34 36 + 36 15 + 36 35 + 9 5 + 15 37 + 36 37 + 37 35 + 2 38 + 38 39 + 2 39 + 38 3 + 39 3 + 11 29 + 33 40 + 15 40 + 40 35 + 6 41 + 25 41 + 41 9 + 40 42 + 33 42 + 42 35 + 30 17 + 42 12 + 42 15 + 12 35 + 17 20 + 37 12 + 37 18 + 37 21 + 43 20 + 43 12 + 43 21 + 44 9 + 44 5 + 44 45 + 9 45 + 5 45 + 47 46 + 47 45 + 45 46 + 46 48 + 47 48 + 45 48 + 18 49 + 20 49 + 21 49 + 19 44 + 51 50 + 51 39 + 39 50 + 50 3 + 51 3 + 32 52 + 52 27 + 52 10 + 52 26 + 30 24 + 44 53 + 53 9 + 53 45 + 31 45 + 8 45 + 47 54 + 46 54 + 54 48 + 38 55 + 2 55 + 55 3 + 28 56 + 26 56 + 56 29 + 57 15 + 57 36 + 57 58 + 15 58 + 36 58 + 38 50 + 43 17 + 0 39 + 7 45 + 37 49 + 55 1 + 24 22 + 47 5 + 5 46 + 59 56 + 59 11 + 11 56 + 59 29 + 60 8 + 60 9 + 8 51 + 60 51 + 9 51 + 61 24 + 61 11 + 61 13 + 32 62 + 10 62 + 15 62 + 4 63 + 1 63 + 63 2 + 19 64 + 64 4 + 64 9 + 66 65 + 66 46 + 46 65 + 65 5 + 66 5 + 16 67 + 16 29 + 29 67 + 67 68 + 16 68 + 29 68 + 66 36 + 36 46 + 36 5 + 32 29 + 52 29 + 10 68 + 59 69 + 69 11 + 69 29 + 28 59 + 37 58 + 63 23 + 70 7 + 70 31 + 70 45 + 53 71 + 44 71 + 71 9 + 17 13 + 72 60 + 72 73 + 73 60 + 72 9 + 73 9 + 61 30 + 57 34 + 0 51 + 18 74 + 18 58 + 58 74 + 74 49 + 58 49 + 59 75 + 75 69 + 75 29 + 29 62 + 68 62 + 66 33 + 66 76 + 76 33 + 66 35 + 76 35 + 73 8 + 36 76 + 77 12 + 77 35 + 77 21 + 35 21 + 78 2 + 78 36 + 36 2 + 2 58 + 78 58 + 65 79 + 66 79 + 79 5 + 77 43 + 16 20 + 67 80 + 29 80 + 80 68 + 79 36 + 60 3 + 81 47 + 81 45 + 81 48 + 81 54 + 0 45 + 82 74 + 82 18 + 82 58 + 66 83 + 83 65 + 83 46 + 23 78 + 23 36 + 69 84 + 84 11 + 84 29 + 10 18 + 57 85 + 85 15 + 85 58 + 26 86 + 86 27 + 86 15 + 5 53 + 46 35 + 87 46 + 87 39 + 39 46 + 46 21 + 87 21 + 39 21 + 47 65 + 56 75 + 8 0 + 84 67 + 84 80 + 46 0 + 0 48 + 43 30 + 88 14 + 88 12 + 88 15 + 89 38 + 89 55 + 89 3 + 67 11 + 90 91 + 92 91 + 92 90 + 90 11 + 91 11 + 92 11 + 14 86 + 76 57 + 76 34 + 87 48 + 39 48 + 78 93 + 23 93 + 93 36 + 50 94 + 38 94 + 94 39 + 19 71 + 31 53 + 22 88 + 83 35 + 95 96 + 96 97 + 95 97 + 95 8 + 96 8 + 97 8 + 83 47 + 98 43 + 98 20 + 98 21 + 51 94 + 99 29 + 99 68 + 99 62 + 100 47 + 100 5 + 100 45 + 101 6 + 101 41 + 101 9 + 20 102 + 16 102 + 102 18 + 74 2 + 2 49 + 8 103 + 60 103 + 51 103 + 72 41 + 41 73 + 93 58 + 75 104 + 69 104 + 104 29 + 17 102 + 34 40 + 106 105 + 106 9 + 9 105 + 105 3 + 106 3 + 107 51 + 107 39 + 51 48 + 107 48 + 104 84 + 72 3 + 23 108 + 36 108 + 108 5 + 54 87 + 100 65 + 38 49 + 39 49 + 101 31 + 77 109 + 109 12 + 109 35 + 71 64 + 111 110 + 111 46 + 46 110 + 110 35 + 111 35 + 112 95 + 97 112 + 112 8 + 46 37 + 46 2 + 2 37 + 2 21 + 106 113 + 113 105 + 113 9 + 40 14 + 88 40 + 36 85 + 89 1 + 111 114 + 110 114 + 114 35 + 87 115 + 115 39 + 115 21 + 85 62 + 58 62 + 38 74 + 102 116 + 16 116 + 116 18 + 117 74 + 117 18 + 117 49 + 15 18 + 92 13 + 90 13 + 74 118 + 118 2 + 118 58 + 107 119 + 51 119 + 119 48 + 85 93 + 106 120 + 105 120 + 120 3 + 4 120 + 120 1 + 111 121 + 114 121 + 121 21 + 111 21 + 114 21 + 80 122 + 29 122 + 122 68 + 71 31 + 97 103 + 112 103 + 52 56 + 115 119 + 39 119 + 115 48 + 123 122 + 123 29 + 123 68 + 42 109 + 91 124 + 92 124 + 124 11 + 123 125 + 29 125 + 125 68 + 90 126 + 91 126 + 126 11 + 96 127 + 127 97 + 127 8 + 20 116 + 127 103 + 18 62 + 82 62 + 7 128 + 128 25 + 128 8 + 129 94 + 129 51 + 129 39 + 123 80 + 112 60 + 112 73 + 125 122 + 24 130 + 130 22 + 130 12 + 28 131 + 131 22 + 131 11 + 77 98 + 119 132 + 51 132 + 132 103 + 119 103 + 93 57 + 59 131 + 133 74 + 133 82 + 133 18 + 134 135 + 136 135 + 136 134 + 134 68 + 135 68 + 136 68 + 135 137 + 136 137 + 137 68 + 66 138 + 83 138 + 138 35 + 74 55 + 118 55 + 139 140 + 97 140 + 97 139 + 139 103 + 140 103 + 67 122 + 141 18 + 18 68 + 141 68 + 141 62 + 129 50 + 121 115 + 87 121 + 142 59 + 69 142 + 142 11 + 124 13 + 103 48 + 95 128 + 95 25 + 111 87 + 54 111 + 77 143 + 143 43 + 143 12 + 83 54 + 63 78 + 125 99 + 135 16 + 135 18 + 72 105 + 113 72 + 17 144 + 144 16 + 144 13 + 141 82 + 93 108 + 67 124 + 124 84 + 50 145 + 145 146 + 50 146 + 145 51 + 146 51 + 129 107 + 53 100 + 133 117 + 87 119 + 147 144 + 147 148 + 148 144 + 147 16 + 148 16 + 149 22 + 149 24 + 149 11 + 108 19 + 94 49 + 146 129 + 67 13 + 37 62 + 150 32 + 150 15 + 150 62 + 91 142 + 69 91 + 151 132 + 146 132 + 146 151 + 151 51 + 99 152 + 152 68 + 152 62 + 153 100 + 53 153 + 153 5 + 132 129 + 143 30 + 61 90 + 107 132 + 106 4 + 106 64 + 154 20 + 154 21 + 154 49 + 24 143 + 40 86 + 150 85 + 57 150 + 63 55 + 126 142 + 95 73 + 73 25 + 83 110 + 63 58 + 77 114 + 32 99 + 99 52 + 61 149 + 118 63 + 118 78 + 7 155 + 128 155 + 155 8 + 33 138 + 133 141 + 133 68 + 157 156 + 157 92 + 92 156 + 156 13 + 157 13 + 150 158 + 158 32 + 158 62 + 89 50 + 130 88 + 81 159 + 47 159 + 159 45 + 44 153 + 160 125 + 160 122 + 160 68 + 128 96 + 30 144 + 142 131 + 137 67 + 137 16 + 50 161 + 145 161 + 145 3 + 161 3 + 134 160 + 136 160 + 136 122 + 110 54 + 133 135 + 144 102 + 148 102 + 84 91 + 148 135 + 148 137 + 85 158 + 75 162 + 104 162 + 162 29 + 154 163 + 20 163 + 163 49 + 8 48 + 127 48 + 107 94 + 125 152 + 155 164 + 164 8 + 155 45 + 164 45 + 53 70 + 104 80 + 82 118 + 79 76 + 164 48 + 165 50 + 145 165 + 146 165 + 81 87 + 139 166 + 140 166 + 97 166 + 114 109 + 38 117 + 160 167 + 134 167 + 167 136 + 165 129 + 109 143 + 41 168 + 41 113 + 113 168 + 168 9 + 120 169 + 106 169 + 169 105 + 170 151 + 140 151 + 140 170 + 170 103 + 151 103 + 113 169 + 127 164 + 150 27 + 81 164 + 164 159 + 90 149 + 171 105 + 105 161 + 171 161 + 171 3 + 122 167 + 56 162 + 109 88 + 42 88 + 60 105 + 152 160 + 132 172 + 172 129 + 172 146 + 135 102 + 138 110 + 131 149 + 158 99 + 161 89 + 173 144 + 173 147 + 173 148 + 154 98 + 116 135 + 101 168 + 155 159 + 108 79 + 122 137 + 172 151 + 174 76 + 174 57 + 174 36 + 139 170 + 127 139 + 153 65 + 157 90 + 117 163 + 163 116 + 117 116 + 116 49 + 175 109 + 175 42 + 175 35 + 157 176 + 156 176 + 176 92 + 133 134 + 93 174 + 114 175 + 177 50 + 177 89 + 161 177 + 174 108 + 174 79 + 85 178 + 58 178 + 178 62 + 177 145 + 44 108 + 179 127 + 179 103 + 179 48 + 100 159 + 173 102 + 164 179 + 149 126 + 143 130 + 78 85 + 131 126 + 138 42 + 147 13 + 171 89 + 101 71 + 141 134 + 119 139 + 139 48 + 168 106 + 115 107 + 117 94 + 94 154 + 94 163 + 60 145 + 140 112 + 156 124 + 155 96 + 141 152 + 154 39 + 34 150 + 135 180 + 180 134 + 180 136 + 132 139 + 181 160 + 181 125 + 181 122 + 77 121 + 164 96 + 60 151 + 147 137 + 151 145 + 130 109 + 34 86 + 147 67 + 178 158 + 139 179 + 178 82 + 162 182 + 182 104 + 182 29 + 182 125 + 123 182 + 180 137 + 112 151 + 153 79 + 132 170 + 123 104 + 176 90 + 171 120 + 96 183 + 95 183 + 97 183 + 127 166 + 155 70 + 70 159 + 156 144 + 156 147 + 147 124 + 181 123 + 64 168 + 168 71 + 116 133 + 184 135 + 102 184 + 184 148 + 168 185 + 185 41 + 185 113 + 86 150 + 157 61 + 30 157 + 119 179 + 186 182 + 162 186 + 186 104 + 144 157 + 127 183 + 108 153 + 182 99 + 115 154 + 160 141 + 186 123 + 185 101 + 184 137 + 105 145 + 120 89 + 187 144 + 187 147 + 156 187 + 178 118 + 152 82 + 70 100 + 182 52 + 138 175 + 98 121 + 107 154 + 52 162 + 178 78 + 152 158 + 175 110 + 157 187 + 167 181 + 87 179 + 6 188 + 41 188 + 188 25 + 169 171 + 172 170 + 189 75 + 104 189 + 69 189 + 178 152 + 179 81 + 190 126 + 190 142 + 91 190 + 189 162 + 69 190 + 191 128 + 95 191 + 25 191 + 177 165 + 115 98 + 169 192 + 192 106 + 192 113 + 183 166 + 165 172 + 188 101 + 191 96 + 192 168 + 59 193 + 193 75 + 193 69 + 7 194 + 194 6 + 194 25 + 177 171 + 195 190 + 195 126 + 195 91 + 196 182 + 125 196 + 123 196 + 176 195 + 195 90 + 92 195 + 176 187 + 194 128 + 193 142 + 189 186 + 187 173 + 166 170 + 192 185 + 173 184 + 186 196 + 196 181 + 194 188 + 191 183 + 193 189 + 184 180 + 180 167 + 185 188 + 194 191 + 190 193 + 13 29 + + + 0 1 2 + 0 4 3 + 1 5 4 + 2 5 3 + 6 7 0 + 6 8 1 + 7 2 8 + 7 10 9 + 2 11 10 + 8 11 9 + 6 4 12 + 7 3 12 + 13 14 15 + 13 17 16 + 14 18 17 + 15 18 16 + 19 20 21 + 19 23 22 + 20 24 23 + 21 24 22 + 25 21 26 + 25 28 27 + 21 29 28 + 26 29 27 + 30 31 32 + 30 34 33 + 31 35 34 + 32 35 33 + 36 37 7 + 36 38 9 + 37 10 38 + 39 35 40 + 39 42 41 + 35 43 42 + 40 43 41 + 44 25 45 + 44 26 46 + 45 21 46 + 47 8 48 + 47 9 49 + 48 11 49 + 36 51 50 + 7 52 51 + 37 52 50 + 53 54 20 + 53 55 23 + 54 24 55 + 56 15 57 + 56 16 58 + 57 18 58 + 59 21 32 + 59 22 60 + 32 24 60 + 45 19 61 + 61 20 46 + 62 63 64 + 62 66 65 + 63 28 66 + 64 28 65 + 67 68 64 + 67 70 69 + 68 71 70 + 64 71 69 + 72 73 67 + 72 25 68 + 73 64 25 + 74 32 75 + 74 60 76 + 75 24 76 + 73 65 27 + 77 78 14 + 77 79 17 + 78 18 79 + 80 45 68 + 80 61 81 + 68 19 81 + 13 82 56 + 82 57 14 + 83 84 63 + 83 85 66 + 84 28 85 + 52 86 3 + 51 86 12 + 47 87 36 + 87 38 49 + 88 89 90 + 88 92 91 + 89 93 92 + 90 93 91 + 77 13 94 + 94 16 79 + 89 95 96 + 95 97 92 + 96 97 93 + 50 98 38 + 52 98 10 + 99 96 100 + 99 93 101 + 100 97 101 + 102 103 104 + 102 105 5 + 103 106 105 + 104 106 5 + 81 107 70 + 19 107 71 + 108 90 109 + 108 91 110 + 109 93 110 + 72 80 44 + 111 56 112 + 111 16 113 + 112 58 113 + 108 114 115 + 114 116 110 + 115 116 91 + 117 74 30 + 117 75 31 + 118 119 29 + 118 116 120 + 119 93 116 + 29 93 120 + 114 109 119 + 121 39 31 + 121 40 34 + 122 123 35 + 122 124 42 + 123 43 124 + 125 126 39 + 125 127 41 + 126 42 127 + 128 98 129 + 128 131 130 + 98 132 131 + 129 132 130 + 133 134 135 + 133 137 136 + 134 138 137 + 135 138 136 + 40 140 139 + 41 141 140 + 43 141 139 + 142 128 50 + 142 129 38 + 143 144 145 + 143 147 146 + 144 106 147 + 145 106 146 + 148 149 83 + 148 150 84 + 149 63 150 + 151 62 149 + 151 64 150 + 152 75 54 + 152 76 55 + 153 154 128 + 153 155 130 + 154 131 155 + 78 157 156 + 18 131 157 + 79 131 156 + 158 133 159 + 158 137 160 + 159 136 160 + 161 102 162 + 161 105 163 + 162 5 163 + 164 67 165 + 164 70 166 + 165 69 166 + 167 96 168 + 167 170 169 + 96 171 170 + 168 171 169 + 172 145 103 + 172 146 105 + 125 173 121 + 173 31 126 + 2 104 174 + 174 106 3 + 77 175 156 + 14 157 175 + 123 139 176 + 124 141 176 + 177 162 1 + 177 163 4 + 178 61 53 + 178 46 54 + 133 179 180 + 179 132 134 + 180 132 135 + 181 182 183 + 181 184 166 + 182 107 184 + 183 107 166 + 185 186 18 + 185 188 187 + 186 189 188 + 18 189 187 + 190 53 191 + 190 55 192 + 191 23 192 + 84 194 193 + 28 195 194 + 85 195 193 + 196 6 197 + 196 8 198 + 197 1 198 + 36 199 200 + 199 201 50 + 200 201 51 + 202 203 204 + 202 206 205 + 203 180 206 + 204 180 205 + 207 208 209 + 207 211 210 + 208 212 211 + 209 212 210 + 164 183 81 + 203 213 214 + 213 215 206 + 214 215 180 + 148 217 216 + 150 71 217 + 84 71 216 + 59 71 208 + 59 218 211 + 71 212 218 + 151 69 217 + 219 220 182 + 219 221 184 + 220 107 221 + 222 164 181 + 222 81 182 + 99 223 170 + 100 171 223 + 224 47 196 + 224 48 198 + 225 77 226 + 225 175 227 + 226 156 227 + 228 229 153 + 228 230 154 + 229 128 230 + 117 231 76 + 30 60 231 + 232 233 234 + 232 235 186 + 233 236 235 + 234 236 186 + 152 190 237 + 237 192 76 + 238 167 89 + 238 168 95 + 239 174 144 + 239 3 147 + 240 241 242 + 240 139 243 + 241 244 139 + 242 244 243 + 245 246 219 + 245 247 184 + 246 221 247 + 71 248 194 + 212 249 248 + 218 249 194 + 250 251 252 + 250 253 91 + 251 254 253 + 252 254 91 + 234 255 185 + 255 18 236 + 251 213 256 + 213 97 253 + 256 97 254 + 257 258 120 + 257 259 42 + 258 260 259 + 120 260 42 + 261 262 263 + 261 265 264 + 262 171 265 + 263 171 264 + 202 266 267 + 266 268 205 + 267 268 206 + 269 257 126 + 269 259 127 + 121 30 270 + 270 33 40 + 271 209 272 + 271 210 273 + 272 212 273 + 267 274 213 + 274 215 268 + 186 86 275 + 189 147 86 + 188 147 275 + 276 277 134 + 276 278 137 + 277 138 278 + 276 158 279 + 279 160 278 + 52 280 131 + 10 132 280 + 281 240 282 + 281 242 283 + 282 241 283 + 202 284 285 + 284 286 203 + 285 286 204 + 287 48 261 + 287 288 262 + 48 263 288 + 289 290 220 + 289 291 221 + 290 107 291 + 263 215 11 + 288 215 49 + 59 33 292 + 21 35 292 + 293 294 167 + 293 295 169 + 294 170 295 + 296 297 62 + 296 298 65 + 297 66 298 + 153 129 299 + 299 132 155 + 203 300 253 + 214 97 300 + 301 302 303 + 301 305 304 + 302 306 305 + 303 306 304 + 307 204 133 + 307 205 179 + 181 308 245 + 308 247 166 + 309 18 52 + 309 187 239 + 52 189 239 + 271 310 311 + 310 291 209 + 311 291 272 + 312 135 280 + 312 136 313 + 280 138 313 + 314 117 173 + 314 75 126 + 315 26 316 + 315 27 317 + 316 29 317 + 318 161 319 + 318 105 320 + 319 163 320 + 310 321 290 + 321 107 209 + 322 323 324 + 322 326 325 + 323 327 326 + 324 327 325 + 328 296 73 + 328 298 27 + 329 238 330 + 329 168 256 + 330 95 256 + 301 136 331 + 303 332 136 + 302 332 331 + 287 333 334 + 333 335 262 + 334 335 288 + 336 337 172 + 336 338 145 + 337 103 338 + 339 142 229 + 339 50 230 + 312 180 10 + 340 79 154 + 340 156 155 + 315 44 341 + 341 46 316 + 284 342 253 + 286 300 342 + 122 29 99 + 122 120 101 + 343 344 345 + 343 347 346 + 344 348 347 + 345 348 346 + 307 285 349 + 349 286 133 + 350 125 351 + 350 127 352 + 351 41 352 + 336 143 353 + 353 144 338 + 354 355 212 + 354 356 248 + 355 249 356 + 357 358 179 + 357 359 134 + 358 132 359 + 360 111 361 + 360 16 362 + 361 113 362 + 363 270 364 + 363 40 365 + 364 33 365 + 366 242 264 + 366 243 367 + 264 244 367 + 185 369 368 + 188 370 369 + 187 370 368 + 371 372 233 + 371 113 235 + 372 236 113 + 333 373 265 + 335 171 373 + 374 375 246 + 374 376 247 + 375 221 376 + 363 121 377 + 377 30 364 + 108 88 378 + 378 89 109 + 379 380 381 + 379 383 382 + 380 86 383 + 381 86 382 + 384 385 144 + 384 387 386 + 385 332 387 + 144 332 386 + 388 289 375 + 388 291 376 + 232 389 275 + 235 86 389 + 390 288 391 + 390 49 392 + 391 215 392 + 393 159 301 + 393 160 331 + 394 307 357 + 394 205 358 + 102 367 395 + 104 396 367 + 103 396 395 + 397 94 360 + 397 79 362 + 398 399 257 + 398 400 258 + 399 120 400 + 339 401 199 + 401 201 230 + 402 403 404 + 402 406 405 + 403 300 406 + 404 300 405 + 407 345 408 + 407 346 409 + 408 348 409 + 410 411 412 + 410 304 124 + 411 413 304 + 412 413 124 + 379 414 415 + 414 416 380 + 415 416 381 + 417 315 418 + 417 27 109 + 418 317 109 + 293 168 419 + 419 171 295 + 412 176 367 + 413 141 367 + 319 177 420 + 420 4 320 + 421 402 422 + 421 406 423 + 422 405 423 + 424 425 302 + 424 426 305 + 425 306 426 + 294 195 427 + 170 428 195 + 295 428 427 + 429 366 102 + 429 243 395 + 430 364 431 + 430 365 432 + 431 33 432 + 433 434 240 + 433 435 243 + 434 139 435 + 29 436 35 + 28 436 292 + 324 438 437 + 325 23 438 + 327 23 437 + 439 440 366 + 439 441 242 + 440 264 441 + 442 384 443 + 442 387 444 + 443 386 444 + 445 419 335 + 445 295 373 + 99 436 123 + 446 379 447 + 446 383 448 + 447 382 448 + 449 450 6 + 449 448 12 + 450 4 448 + 451 421 452 + 451 454 453 + 421 455 454 + 452 455 453 + 456 272 457 + 456 273 458 + 457 212 458 + 340 459 228 + 459 230 79 + 408 461 460 + 409 368 461 + 348 368 460 + 165 151 462 + 462 217 166 + 463 425 464 + 463 465 444 + 425 332 465 + 464 332 444 + 101 260 124 + 411 303 104 + 104 306 413 + 466 457 467 + 466 458 468 + 467 212 468 + 306 141 396 + 469 118 399 + 469 116 400 + 470 471 323 + 470 472 326 + 471 327 472 + 473 467 474 + 473 468 475 + 474 212 475 + 476 477 322 + 476 478 325 + 477 326 478 + 479 480 344 + 479 481 347 + 480 348 481 + 363 430 482 + 482 432 40 + 480 460 483 + 481 368 483 + 282 485 484 + 283 428 485 + 241 428 484 + 486 487 82 + 486 488 14 + 487 57 488 + 489 353 490 + 489 338 491 + 490 144 491 + 456 492 466 + 492 467 272 + 493 234 494 + 493 185 409 + 494 255 409 + 495 466 473 + 495 458 475 + 178 496 497 + 496 498 54 + 497 498 46 + 499 500 80 + 499 501 81 + 500 61 501 + 502 269 350 + 502 259 352 + 424 331 465 + 503 443 504 + 503 506 505 + 443 370 506 + 504 370 505 + 442 464 385 + 293 507 445 + 507 335 168 + 222 508 499 + 508 501 182 + 493 369 461 + 281 509 510 + 509 511 240 + 510 511 282 + 512 513 514 + 512 516 515 + 513 517 516 + 514 517 515 + 518 519 513 + 518 520 516 + 519 517 520 + 521 522 284 + 521 523 253 + 522 342 523 + 161 429 524 + 524 366 162 + 524 439 525 + 525 440 162 + 526 527 528 + 526 530 529 + 527 460 530 + 528 460 529 + 531 271 456 + 531 210 458 + 532 533 534 + 532 484 535 + 533 249 484 + 534 249 535 + 536 489 336 + 536 490 143 + 537 424 538 + 537 426 453 + 538 305 453 + 539 219 540 + 539 182 541 + 540 220 541 + 471 437 542 + 472 23 542 + 370 543 386 + 506 543 444 + 544 545 487 + 544 346 488 + 545 57 346 + 546 393 547 + 546 301 403 + 547 159 403 + 269 548 549 + 548 550 257 + 549 550 126 + 349 551 158 + 551 159 286 + 552 287 224 + 552 261 198 + 553 474 354 + 553 475 355 + 554 555 33 + 554 516 211 + 555 533 516 + 33 533 211 + 556 415 557 + 556 381 235 + 557 416 235 + 558 559 30 + 558 560 231 + 559 60 560 + 561 282 532 + 561 485 535 + 390 334 562 + 562 335 391 + 563 564 310 + 563 472 321 + 564 290 472 + 292 484 194 + 436 484 195 + 565 566 567 + 565 568 143 + 566 569 568 + 567 569 143 + 570 490 384 + 570 491 385 + 571 299 358 + 571 155 359 + 509 433 572 + 572 434 511 + 463 573 424 + 573 331 444 + 574 575 576 + 574 577 559 + 575 578 577 + 576 578 559 + 178 579 580 + 579 581 61 + 580 581 53 + 312 174 303 + 174 332 313 + 87 390 582 + 582 392 38 + 556 382 389 + 337 395 583 + 338 396 583 + 536 567 584 + 584 569 490 + 410 100 214 + 412 263 100 + 411 263 214 + 563 542 585 + 321 23 585 + 99 195 586 + 123 484 586 + 587 85 588 + 587 193 589 + 588 195 589 + 590 540 591 + 590 541 326 + 591 220 326 + 592 593 594 + 592 504 595 + 593 569 504 + 594 569 595 + 596 597 355 + 596 598 356 + 597 249 598 + 599 571 600 + 599 358 601 + 600 299 601 + 602 584 593 + 602 490 504 + 549 603 314 + 603 75 550 + 604 191 325 + 604 192 438 + 605 503 442 + 605 504 384 + 606 200 607 + 606 51 380 + 607 201 380 + 608 609 41 + 608 610 140 + 609 141 610 + 603 611 152 + 611 54 550 + 417 612 328 + 612 298 109 + 613 588 294 + 613 589 427 + 613 614 293 + 614 167 588 + 615 197 177 + 615 198 162 + 123 223 241 + 223 244 176 + 616 590 477 + 616 541 478 + 617 618 545 + 617 255 346 + 618 57 255 + 619 404 286 + 619 405 342 + 552 265 620 + 198 264 620 + 621 423 258 + 621 455 259 + 423 260 455 + 622 623 148 + 622 354 216 + 623 217 354 + 312 411 2 + 411 11 180 + 580 624 190 + 624 191 581 + 625 626 552 + 625 441 620 + 626 265 441 + 627 628 486 + 627 629 14 + 628 488 629 + 250 630 521 + 630 523 91 + 510 631 561 + 631 532 511 + 631 534 632 + 511 533 632 + 633 634 635 + 633 637 636 + 634 437 637 + 635 437 636 + 625 198 440 + 638 639 587 + 638 640 589 + 639 193 640 + 172 318 641 + 641 320 146 + 341 497 642 + 642 498 316 + 276 643 644 + 643 645 277 + 644 645 134 + 600 153 646 + 646 129 601 + 647 648 495 + 647 649 475 + 648 458 649 + 650 343 544 + 650 347 488 + 651 558 117 + 651 560 76 + 508 539 652 + 652 541 501 + 653 654 207 + 653 520 210 + 654 211 520 + 565 655 656 + 565 146 657 + 655 658 146 + 656 658 657 + 659 514 660 + 659 515 649 + 660 517 649 + 648 660 661 + 661 517 458 + 402 547 662 + 662 159 404 + 309 280 157 + 663 511 555 + 663 632 516 + 664 576 665 + 664 559 364 + 665 578 364 + 666 591 289 + 666 326 290 + 518 667 668 + 518 554 654 + 667 578 554 + 668 578 654 + 669 638 613 + 669 640 427 + 670 671 374 + 670 672 247 + 671 376 672 + 673 608 674 + 673 610 675 + 674 140 675 + 481 677 676 + 483 543 677 + 368 543 676 + 619 662 551 + 570 678 489 + 678 338 385 + 553 596 679 + 679 597 475 + 680 681 629 + 680 683 682 + 681 157 683 + 629 157 682 + 226 340 684 + 684 155 227 + 685 311 388 + 685 272 376 + 439 281 686 + 686 283 441 + 251 267 687 + 687 274 256 + 223 428 586 + 681 676 688 + 157 138 676 + 683 138 688 + 689 565 690 + 689 567 691 + 690 566 691 + 692 279 393 + 692 278 331 + 407 494 617 + 693 526 694 + 693 528 695 + 694 527 695 + 398 621 696 + 696 423 400 + 429 697 433 + 697 435 395 + 698 659 699 + 698 660 700 + 699 514 700 + 689 701 536 + 701 584 691 + 548 398 702 + 702 399 550 + 703 704 705 + 703 113 706 + 704 416 113 + 705 416 706 + 707 446 708 + 707 447 709 + 708 379 709 + 710 711 712 + 710 714 713 + 711 530 714 + 712 530 713 + 708 715 414 + 709 415 715 + 716 481 681 + 716 677 688 + 587 83 717 + 717 66 588 + 643 718 719 + 718 683 277 + 719 683 645 + 720 604 624 + 720 325 581 + 721 722 723 + 721 382 724 + 722 658 382 + 723 658 724 + 698 725 648 + 725 661 700 + 726 670 308 + 726 672 166 + 727 469 728 + 727 399 316 + 728 118 316 + 729 556 232 + 729 382 275 + 525 625 615 + 647 679 730 + 730 597 649 + 731 602 732 + 731 593 733 + 732 584 733 + 734 665 667 + 734 364 554 + 522 735 619 + 735 405 523 + 500 736 579 + 736 581 501 + 639 737 622 + 737 356 640 + 622 356 193 + 641 738 655 + 738 658 320 + 239 386 313 + 309 676 313 + 187 386 676 + 739 574 740 + 739 576 741 + 740 575 741 + 742 351 608 + 742 352 609 + 743 431 554 + 743 432 555 + 744 361 703 + 744 362 706 + 745 719 680 + 745 645 682 + 746 391 274 + 746 392 268 + 747 653 531 + 747 520 458 + 731 748 592 + 748 594 733 + 329 749 750 + 749 751 256 + 750 751 168 + 752 712 526 + 752 713 529 + 753 528 480 + 753 529 483 + 470 666 564 + 394 599 754 + 754 601 205 + 755 324 634 + 755 438 637 + 718 688 278 + 410 101 300 + 756 757 758 + 756 675 435 + 757 759 675 + 758 759 435 + 469 760 761 + 760 762 400 + 761 762 116 + 568 147 657 + 412 264 223 + 763 764 633 + 763 765 634 + 764 635 765 + 512 766 663 + 766 632 515 + 507 750 767 + 767 751 335 + 696 768 760 + 768 762 423 + 769 641 770 + 769 655 771 + 770 738 771 + 747 661 519 + 746 772 773 + 772 751 391 + 773 751 274 + 371 557 704 + 292 533 218 + 774 295 775 + 774 427 776 + 775 428 776 + 562 767 772 + 769 777 565 + 777 656 771 + 758 432 434 + 432 139 759 + 582 778 142 + 778 129 392 + 779 780 483 + 779 781 677 + 780 543 781 + 357 644 782 + 782 645 359 + 739 783 664 + 783 665 741 + 592 505 714 + 595 370 714 + 779 716 784 + 784 688 781 + 602 605 570 + 476 720 785 + 785 581 478 + 611 786 496 + 786 498 550 + 787 445 333 + 787 295 265 + 788 652 616 + 788 501 478 + 630 115 789 + 789 116 523 + 574 790 560 + 577 60 790 + 791 723 738 + 791 724 320 + 459 397 792 + 792 362 230 + 766 793 631 + 793 534 515 + 794 506 529 + 794 444 795 + 529 543 795 + 796 705 414 + 796 706 380 + 442 463 797 + 797 425 385 + 337 798 697 + 798 435 583 + 799 673 800 + 799 610 583 + 800 675 583 + 801 188 568 + 801 275 657 + 802 408 527 + 802 461 530 + 803 635 471 + 803 636 542 + 804 650 628 + 804 347 629 + 300 260 304 + 805 534 597 + 805 535 598 + 806 306 609 + 806 396 610 + 614 807 238 + 807 89 588 + 808 809 512 + 808 810 513 + 809 514 810 + 503 811 794 + 811 529 505 + 812 813 647 + 812 814 648 + 813 495 814 + 815 452 621 + 815 453 259 + 716 479 816 + 816 347 681 + 817 595 188 + 817 714 369 + 818 668 575 + 818 654 577 + 799 338 806 + 819 594 566 + 819 595 568 + 664 377 558 + 727 642 820 + 820 498 399 + 612 378 821 + 821 89 298 + 822 207 577 + 822 585 790 + 207 60 585 + 774 823 669 + 823 640 776 + 824 529 780 + 824 795 781 + 825 775 283 + 825 776 485 + 680 816 804 + 826 827 671 + 826 828 672 + 827 376 828 + 829 473 830 + 829 474 828 + 830 467 828 + 808 518 831 + 831 519 810 + 817 493 832 + 832 461 714 + 754 833 266 + 833 268 601 + 834 592 710 + 834 505 713 + 827 830 835 + 835 467 376 + 687 773 749 + 836 763 755 + 836 765 324 + 837 447 721 + 837 448 724 + 838 839 343 + 838 840 344 + 839 345 840 + 841 753 693 + 841 480 695 + 842 843 745 + 842 227 682 + 843 645 227 + 574 844 845 + 844 636 560 + 845 636 790 + 822 846 563 + 846 542 790 + 813 473 847 + 814 466 847 + 834 752 811 + 796 607 848 + 848 201 706 + 849 792 744 + 849 230 706 + 572 758 850 + 850 432 511 + 753 779 824 + 851 734 852 + 851 667 853 + 852 665 853 + 854 703 855 + 854 705 856 + 855 704 856 + 857 717 297 + 857 588 298 + 755 858 604 + 858 192 637 + 859 237 858 + 859 76 637 + 663 850 743 + 818 822 653 + 794 824 860 + 860 781 444 + 734 743 430 + 819 801 817 + 861 862 826 + 861 863 827 + 862 671 863 + 864 633 844 + 864 637 560 + 849 848 401 + 865 838 479 + 865 840 480 + 866 746 833 + 866 392 601 + 867 553 829 + 867 354 828 + 868 806 425 + 868 609 426 + 866 646 778 + 730 805 869 + 869 534 649 + 861 870 830 + 863 835 870 + 854 744 871 + 871 361 855 + 851 872 518 + 872 668 853 + 788 785 736 + 873 729 801 + 873 382 657 + 837 791 874 + 874 320 448 + 651 859 864 + 875 876 574 + 875 877 844 + 876 845 877 + 857 821 807 + 878 686 825 + 878 441 775 + 702 820 786 + 879 561 805 + 879 485 598 + 880 684 571 + 880 227 359 + 867 881 623 + 881 217 828 + 800 756 798 + 789 761 882 + 882 762 523 + 685 835 492 + 883 815 502 + 883 453 352 + 884 799 678 + 884 806 385 + 874 420 450 + 726 462 885 + 885 217 672 + 626 878 886 + 886 775 265 + 737 887 596 + 887 598 640 + 422 888 768 + 888 762 405 + 875 864 889 + 889 633 877 + 873 656 722 + 735 882 888 + 890 812 698 + 890 814 725 + 886 774 787 + 860 891 573 + 891 331 781 + 892 893 111 + 892 894 56 + 893 112 894 + 895 837 707 + 895 721 709 + 896 834 731 + 896 710 748 + 897 374 898 + 897 246 899 + 898 375 899 + 825 879 900 + 900 598 776 + 891 901 692 + 901 278 781 + 880 782 843 + 902 616 903 + 902 477 904 + 903 590 904 + 905 897 670 + 905 898 671 + 903 906 540 + 904 591 906 + 907 544 908 + 907 487 909 + 908 545 909 + 797 868 884 + 901 784 718 + 910 689 769 + 910 690 777 + 826 885 881 + 868 911 742 + 911 352 426 + 659 869 793 + 912 708 913 + 912 715 914 + 913 414 914 + 911 537 883 + 915 865 841 + 915 840 695 + 916 732 701 + 916 733 691 + 917 360 892 + 917 361 893 + 918 907 650 + 918 908 343 + 823 900 887 + 919 913 796 + 919 914 705 + 920 245 921 + 920 219 922 + 921 246 922 + 923 924 13 + 923 925 82 + 924 56 925 + 926 770 791 + 926 771 723 + 927 928 902 + 927 929 904 + 928 477 929 + 930 829 931 + 930 830 932 + 931 473 932 + 933 836 934 + 933 765 935 + 934 324 935 + 936 889 763 + 936 877 764 + 923 486 937 + 937 487 925 + 920 938 539 + 938 540 922 + 939 905 862 + 939 898 863 + 940 739 875 + 940 740 876 + 832 802 711 + 941 693 752 + 941 694 712 + 846 845 803 + 942 919 854 + 942 914 856 + 943 852 783 + 943 853 741 + 944 861 930 + 944 870 932 + 945 931 813 + 945 932 847 + 946 892 924 + 946 894 925 + 947 918 838 + 947 908 839 + 948 921 897 + 948 922 899 + 949 808 851 + 949 831 872 + 950 699 809 + 950 700 810 + 951 871 917 + 951 855 893 + 952 937 907 + 952 925 909 + 953 903 938 + 953 906 922 + 618 58 236 + 372 112 618 + 330 254 92 + 252 330 88 + 225 842 627 + 627 682 175 + 216 248 193 + 934 476 928 + 934 322 929 + 929 323 935 + 406 260 454 + 403 304 454 + 728 317 119 + 418 728 114 + 209 954 585 + 208 954 60 + 107 954 23 + 71 954 22 + 538 546 451 + 546 454 305 + 449 606 446 + 606 383 12 + 674 482 757 + 482 759 140 + + + 0 1 2 3 + 4 5 6 0 + 6 7 8 9 + 4 10 1 11 + 12 13 14 15 + 16 17 18 19 + 20 21 22 23 + 24 25 26 27 + 28 29 30 7 + 31 32 33 34 + 35 36 20 37 + 38 39 9 40 + 28 41 42 43 + 44 45 46 18 + 47 48 15 49 + 50 51 19 52 + 53 37 16 54 + 55 56 57 58 + 59 60 61 62 + 63 64 65 59 + 66 67 52 68 + 65 69 58 21 + 70 71 72 14 + 73 74 53 75 + 76 12 77 47 + 78 79 80 57 + 42 11 81 82 + 83 39 84 29 + 85 86 87 88 + 89 71 13 90 + 91 87 92 93 + 43 30 94 95 + 96 97 93 98 + 99 100 101 102 + 75 61 103 104 + 105 106 88 107 + 108 64 73 35 + 109 110 48 111 + 112 106 113 114 + 115 116 66 24 + 117 118 119 120 + 121 113 107 119 + 122 123 31 26 + 124 125 126 33 + 127 128 129 32 + 130 131 132 133 + 134 135 136 137 + 34 138 139 140 + 141 142 130 94 + 143 144 145 146 + 147 148 149 78 + 150 151 55 149 + 152 153 68 46 + 154 155 156 131 + 72 157 158 159 + 160 161 135 162 + 163 164 100 165 + 166 167 60 168 + 169 170 171 172 + 173 174 146 101 + 175 127 176 122 + 177 3 102 178 + 70 179 180 157 + 126 181 140 182 + 183 184 165 2 + 185 186 54 44 + 187 134 188 189 + 190 191 192 193 + 194 195 196 197 + 198 199 45 200 + 80 201 202 203 + 204 205 5 206 + 207 41 208 209 + 210 211 212 213 + 214 215 216 217 + 218 167 193 103 + 219 212 220 221 + 148 222 223 224 + 225 226 227 216 + 151 228 62 223 + 229 230 231 192 + 232 233 218 190 + 96 234 235 171 + 236 237 38 205 + 238 239 179 240 + 241 242 243 154 + 115 244 245 67 + 246 247 248 249 + 250 153 199 251 + 252 253 169 91 + 254 255 178 145 + 256 257 258 259 + 260 261 262 230 + 227 263 264 265 + 266 267 268 269 + 270 249 271 194 + 272 268 273 274 + 275 276 277 278 + 279 280 281 282 + 283 211 284 285 + 286 287 276 129 + 288 123 25 289 + 290 291 217 292 + 293 285 294 220 + 196 295 296 297 + 298 299 300 136 + 301 299 161 302 + 95 303 304 132 + 305 306 256 307 + 308 210 309 310 + 311 312 313 279 + 314 315 316 231 + 313 40 317 318 + 50 319 27 320 + 321 322 323 170 + 324 325 326 56 + 327 155 133 328 + 219 329 330 273 + 331 332 333 334 + 335 336 213 187 + 337 191 338 261 + 339 340 197 341 + 342 290 343 344 + 345 346 137 347 + 348 349 116 176 + 350 351 23 352 + 353 354 164 355 + 356 343 357 316 + 358 359 360 361 + 362 363 325 69 + 364 365 253 366 + 331 367 368 369 + 370 312 371 372 + 373 374 375 173 + 376 377 141 243 + 378 345 189 304 + 379 380 159 156 + 381 350 36 382 + 309 383 384 329 + 385 386 120 97 + 387 388 389 390 + 391 335 310 392 + 393 394 128 395 + 396 374 143 397 + 398 399 400 264 + 401 402 403 188 + 404 405 110 406 + 407 408 289 409 + 410 411 259 412 + 195 413 414 415 + 416 417 418 248 + 371 419 420 281 + 421 422 423 262 + 424 407 288 425 + 426 105 85 427 + 428 429 430 431 + 432 433 434 435 + 436 437 315 423 + 247 438 439 295 + 440 441 318 442 + 443 444 162 367 + 445 446 336 401 + 99 447 448 449 + 450 451 90 405 + 452 453 454 275 + 455 377 456 208 + 457 458 459 460 + 461 462 390 463 + 464 465 466 467 + 468 428 469 470 + 471 472 351 473 + 474 322 172 475 + 467 476 182 477 + 478 355 184 479 + 480 481 458 482 + 483 484 485 333 + 323 486 487 488 + 489 490 411 447 + 491 492 409 493 + 494 495 496 257 + 22 320 497 498 + 361 499 500 501 + 502 503 504 410 + 505 506 433 507 + 508 509 475 420 + 385 124 510 497 + 511 512 429 513 + 514 515 516 10 + 517 518 519 520 + 521 522 292 523 + 524 379 525 242 + 341 81 255 296 + 463 526 527 528 + 529 168 228 530 + 531 532 533 534 + 386 125 278 535 + 536 466 334 537 + 538 539 523 540 + 537 448 477 541 + 542 543 118 454 + 544 545 546 360 + 547 548 540 549 + 550 551 552 359 + 553 554 555 389 + 556 408 492 557 + 555 558 528 559 + 307 560 561 562 + 563 564 565 77 + 566 567 397 568 + 569 521 570 538 + 571 572 270 573 + 574 575 539 548 + 576 186 577 578 + 579 580 581 74 + 582 583 287 394 + 483 584 369 533 + 585 586 587 588 + 589 506 534 434 + 590 474 591 508 + 592 233 593 580 + 572 594 413 527 + 595 305 596 597 + 598 599 600 601 + 602 603 604 600 + 605 606 607 383 + 608 163 489 609 + 610 609 502 611 + 612 613 614 615 + 616 617 291 522 + 618 619 620 621 + 622 623 566 396 + 624 625 484 626 + 627 628 229 629 + 546 630 501 631 + 587 507 632 633 + 634 635 636 565 + 637 638 443 639 + 640 286 641 642 + 643 392 644 160 + 645 646 311 237 + 647 648 549 398 + 649 650 651 652 + 653 654 470 655 + 656 657 658 245 + 659 660 560 619 + 661 440 372 662 + 663 664 665 356 + 498 202 666 667 + 668 669 670 671 + 672 673 568 432 + 674 675 328 403 + 676 596 494 677 + 678 532 679 584 + 680 681 682 683 + 684 185 685 686 + 687 346 688 368 + 689 84 441 690 + 654 691 431 439 + 375 692 449 693 + 694 623 671 695 + 464 696 697 698 + 664 699 631 700 + 510 701 667 702 + 703 704 203 705 + 706 707 629 708 + 709 710 711 712 + 713 714 715 400 + 716 717 674 718 + 719 720 695 711 + 721 642 722 349 + 723 724 200 500 + 725 726 585 505 + 727 728 209 729 + 730 731 732 139 + 733 722 734 152 + 735 472 736 363 + 737 738 705 486 + 739 737 740 321 + 741 742 206 183 + 743 181 744 258 + 745 746 707 552 + 747 748 749 636 + 750 751 460 384 + 646 752 280 753 + 754 755 756 277 + 757 758 759 222 + 760 378 761 8 + 762 686 763 198 + 764 765 766 752 + 767 768 769 564 + 770 267 771 606 + 772 597 773 659 + 773 774 618 775 + 760 687 177 536 + 776 777 778 779 + 780 765 753 504 + 781 782 783 704 + 784 174 354 785 + 786 382 578 787 + 788 298 789 790 + 791 718 327 792 + 793 794 795 575 + 796 797 388 635 + 798 799 657 244 + 800 593 628 801 + 802 803 804 215 + 805 806 807 808 + 809 810 601 811 + 812 795 811 813 + 814 457 639 815 + 339 816 303 158 + 817 818 775 651 + 819 820 683 821 + 822 823 708 314 + 824 825 826 827 + 828 829 782 738 + 830 831 832 422 + 825 603 650 804 + 833 834 731 835 + 559 836 837 838 + 839 750 815 644 + 840 673 841 567 + 842 648 713 843 + 844 845 846 847 + 848 240 380 849 + 850 851 344 437 + 852 503 306 853 + 854 272 293 855 + 234 701 856 487 + 846 857 858 859 + 860 861 668 862 + 863 864 302 444 + 865 462 573 748 + 866 867 612 868 + 869 453 754 870 + 871 490 872 495 + 873 874 809 875 + 876 861 877 694 + 878 641 452 879 + 880 881 882 883 + 884 885 511 886 + 887 888 889 890 + 886 891 892 468 + 893 894 836 857 + 895 703 79 896 + 897 789 898 899 + 743 702 562 856 + 900 901 723 763 + 902 903 904 905 + 906 874 907 812 + 908 909 831 338 + 910 911 542 912 + 913 914 691 438 + 915 611 780 742 + 916 794 843 917 + 918 919 719 920 + 921 922 821 826 + 923 607 924 751 + 925 581 926 685 + 927 783 928 929 + 930 785 931 807 + 254 932 435 688 + 340 933 934 932 + 935 936 680 937 + 938 939 395 730 + 940 941 493 649 + 698 761 221 317 + 415 934 838 632 + 942 943 406 881 + 944 945 899 845 + 946 947 442 294 + 948 949 803 617 + 950 919 951 709 + 952 365 953 954 + 955 956 890 613 + 957 958 615 558 + 959 545 823 665 + 960 446 717 961 + 962 963 499 778 + 898 964 859 300 + 696 965 98 330 + 966 967 968 969 + 970 543 971 972 + 669 806 973 144 + 974 476 412 744 + 975 976 977 776 + 978 599 979 818 + 980 591 954 981 + 982 870 983 971 + 984 985 930 986 + 987 949 813 604 + 988 946 989 990 + 991 417 655 882 + 319 226 652 992 + 993 994 488 995 + 996 662 981 989 + 997 985 998 805 + 999 969 1000 496 + 1001 690 1002 142 + 1003 1004 1005 837 + 1006 402 790 1007 + 1008 936 1009 819 + 710 1010 588 1011 + 1012 1004 894 1013 + 1014 720 726 672 + 1015 551 901 1016 + 697 974 282 235 + 1017 734 1018 577 + 1019 1020 509 419 + 1021 1022 801 746 + 1023 771 114 1024 + 681 1025 1026 658 + 1027 1028 905 931 + 1029 525 451 1030 + 1031 979 1032 774 + 1033 1034 633 1035 + 1036 1037 883 469 + 1038 589 531 1039 + 1040 692 1041 872 + 1042 1043 834 1044 + 1045 1046 297 973 + 1047 1048 526 614 + 1049 1050 779 630 + 992 666 265 620 + 1051 1052 797 769 + 965 465 535 1053 + 1054 1055 621 715 + 1056 1057 541 732 + 1058 740 1059 252 + 1060 1061 1062 598 + 1063 586 1064 1033 + 1065 1066 1067 793 + 1068 1069 520 755 + 1070 893 554 1071 + 1072 1073 1011 414 + 1074 1075 827 682 + 1076 1043 693 1057 + 1077 1078 712 670 + 1079 820 425 656 + 1080 911 787 1081 + 1082 736 427 1083 + 1084 1085 1086 1026 + 1087 994 1088 829 + 1089 1090 1035 1005 + 1091 1092 995 561 + 1093 844 1071 1052 + 1094 1095 1096 832 + 1097 1098 547 1099 + 1100 1061 602 1101 + 1102 1073 594 1103 + 1104 961 1105 284 + 1106 1107 1010 888 + 1108 1096 1099 1109 + 1110 855 990 953 + 1111 1112 976 962 + 1113 1114 513 903 + 1115 1116 1117 387 + 1118 1119 957 867 + 1120 1121 1122 945 + 1123 1025 1124 1125 + 1126 1085 1127 699 + 1067 1128 574 1129 + 1130 1107 956 1064 + 1131 1037 729 1132 + 1133 1134 1030 943 + 1135 677 999 1136 + 1137 958 1003 1089 + 1138 1139 921 1140 + 1141 1142 880 1143 + 1144 1145 896 326 + 1146 963 1147 724 + 1148 1149 251 1147 + 1150 817 1136 941 + 1151 1075 1084 802 + 1152 1034 1090 1153 + 1154 922 940 491 + 1155 1078 1045 1072 + 1156 1157 1158 1094 + 1159 1160 777 1124 + 1161 1134 1132 456 + 1162 1163 1116 553 + 816 933 347 858 + 1164 1165 947 1105 + 1166 1167 647 1098 + 1168 1169 1056 485 + 1170 1165 792 1002 + 1171 917 1054 1172 + 1157 1173 1174 1108 + 1175 1141 942 1176 + 1177 1139 1178 824 + 1179 1022 1016 926 + 1180 1181 914 1046 + 1182 1114 1028 1183 + 1184 799 1149 1160 + 1185 1186 1187 1123 + 1188 1145 1083 1059 + 1189 1190 853 1091 + 1191 879 1081 1018 + 1192 1193 660 1055 + 1194 1195 849 675 + 1196 1167 1197 759 + 1198 1044 967 1041 + 1199 1024 972 1200 + 1201 851 1109 570 + 1202 1203 1069 583 + 1204 1205 1076 841 + 1206 1183 479 516 + 1207 909 530 1208 + 1209 766 1190 1210 + 1211 928 1212 714 + 1213 482 1214 983 + 1215 1186 1159 1216 + 1217 1181 808 904 + 1218 924 1200 1214 + 1219 1220 1066 906 + 1221 1210 993 1020 + 1222 1153 1223 679 + 1224 1225 1226 109 + 1227 1228 1113 885 + 1229 1230 1106 950 + 1231 1232 421 1233 + 1234 1092 1193 1235 + 1236 1223 1237 864 + 1238 1195 1007 1122 + 1239 1240 745 1241 + 1242 1243 1231 830 + 1241 1244 1245 706 + 1246 1247 634 1248 + 1249 1039 1168 1205 + 1250 1237 1013 964 + 1251 1252 860 997 + 1253 1095 1208 1197 + 1254 1169 1255 939 + 1256 810 1172 1032 + 1257 1258 891 1259 + 1260 1255 625 1203 + 1261 1262 1163 1119 + 1263 1264 920 877 + 1265 1266 404 1224 + 1267 1268 1246 796 + 1269 1088 1235 1212 + 1270 1271 1259 1036 + 1272 1273 260 1274 + 1275 1276 1277 76 + 1278 1279 986 1027 + 1280 1281 1282 1240 + 1283 1284 1097 1285 + 1286 1287 1112 1288 + 1289 1290 1216 975 + 1291 1276 563 1292 + 1293 1273 1294 627 + 1295 1296 1243 1158 + 1297 1298 935 1185 + 1299 1103 1048 889 + 1300 1301 866 955 + 1302 1127 1125 1050 + 1303 1304 1271 1142 + 1305 1306 1140 1009 + 1307 1308 1173 1284 + 1309 1310 1285 1128 + 1311 1312 1225 1277 + 1313 1314 1268 1115 + 1315 1316 1274 1232 + 1317 1318 1100 1177 + 1319 1320 875 1062 + 1321 1322 1176 1266 + 1323 1324 1292 1247 + 1325 1326 1244 1294 + 749 1327 49 271 + 1328 418 111 1327 + 366 1329 274 92 + 1330 269 1329 86 + 1331 239 1121 1332 + 768 1332 847 180 + 758 929 399 1333 + 224 201 1333 263 + 1334 1335 550 1282 + 1335 1288 358 1336 + 481 519 1337 756 + 459 1338 1053 1337 + 912 1339 352 117 + 1340 473 1339 121 + 214 1086 1341 1342 + 357 700 1343 1341 + 225 51 1342 1344 + 104 17 1344 1343 + 1345 626 1346 518 + 638 1346 332 1338 + 1347 515 1348 512 + 728 1348 82 430 + 1349 835 1350 968 + 557 1350 138 1000 + + + 6.29429108e+00 0.00000000e+00 2.92477739e-02 6.59164571e+00 3.48021489e-01 3.60894310e-01 6.84084917e+00 7.02014226e-01 6.91168376e-01 + 6.84084917e+00 7.02014226e-01 6.91168376e-01 6.91650492e+00 8.53019292e-01 3.51283762e-01 6.92875009e+00 9.96203868e-01 -4.89858720e-16 + 6.84084917e+00 7.02014226e-01 6.91168376e-01 6.20525882e+00 9.06027321e-01 6.25505064e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 5.91004055e+00 0.00000000e+00 8.16875302e-01 6.38532630e+00 3.53855133e-01 7.61401223e-01 6.84084917e+00 7.02014226e-01 6.91168376e-01 + 6.47176543e+00 7.54185877e-01 1.30501830e+00 6.68380571e+00 7.31107965e-01 1.01437254e+00 6.84084917e+00 7.02014226e-01 6.91168376e-01 + 6.84084917e+00 7.02014226e-01 6.91168376e-01 6.75892122e+00 1.07663263e+00 7.74063425e-01 6.65570529e+00 1.44786006e+00 8.47910322e-01 + 3.33327135e+00 1.26368365e+00 -1.39288137e+00 3.75388529e+00 1.75993657e+00 -1.19601511e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 3.33327135e+00 1.26368365e+00 -1.39288137e+00 3.73735292e+00 1.18286550e+00 -1.04182210e+00 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 3.33327135e+00 1.26368365e+00 -1.39288137e+00 3.46931826e+00 1.64809157e+00 -7.23128947e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 3.33327135e+00 1.26368365e+00 -1.39288137e+00 3.21192041e+00 1.63476122e+00 -1.43220376e+00 3.07425129e+00 1.99753337e+00 -1.49031131e+00 + 2.73498783e+00 1.45761881e+00 -6.21947363e-01 2.99847108e+00 1.34466022e+00 -1.03092223e+00 3.33327135e+00 1.26368365e+00 -1.39288137e+00 + 3.33327135e+00 1.26368365e+00 -1.39288137e+00 3.24373111e+00 9.68315158e-01 -1.17997789e+00 3.17077126e+00 6.77896230e-01 -9.54430520e-01 + 8.49686589e-01 4.80418933e+00 1.99632123e+00 8.32734977e-01 4.81962932e+00 1.52187184e+00 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 6.11050690e-16 5.50385532e+00 1.34131946e+00 4.28626594e-01 5.15908389e+00 1.68464745e+00 8.49686589e-01 4.80418933e+00 1.99632123e+00 + 9.34999077e-01 5.73790834e+00 1.82703946e+00 8.94045019e-01 5.28110361e+00 1.96801645e+00 8.49686589e-01 4.80418933e+00 1.99632123e+00 + 1.70582869e+00 4.21637311e+00 1.94834000e+00 1.27762508e+00 4.50981332e+00 1.97540277e+00 8.49686589e-01 4.80418933e+00 1.99632123e+00 + 8.49686589e-01 4.80418933e+00 1.99632123e+00 1.34602659e+00 4.87602414e+00 1.51017091e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 8.30275396e-01 3.84107074e+00 1.68956565e+00 8.36284810e-01 4.30360909e+00 1.90280843e+00 8.49686589e-01 4.80418933e+00 1.99632123e+00 + 5.37609367e-16 4.84235469e+00 1.41969404e+00 4.11064708e-01 4.83971619e+00 1.23322305e+00 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 6.11050690e-16 5.50385532e+00 1.34131946e+00 5.74330028e-16 5.17310500e+00 1.38050675e+00 5.37609367e-16 4.84235469e+00 1.41969404e+00 + 8.49686589e-01 4.80418933e+00 1.99632123e+00 4.21210678e-01 4.82187590e+00 1.73159247e+00 5.37609367e-16 4.84235469e+00 1.41969404e+00 + 5.37609367e-16 4.84235469e+00 1.41969404e+00 5.53807888e-16 4.98825800e+00 1.09273456e+00 5.70006409e-16 5.13416130e+00 7.65775070e-01 + 4.81636334e+00 4.81636334e+00 8.47910322e-01 4.51099326e+00 4.42960136e+00 7.21038363e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 4.07707079e+00 5.46855113e+00 8.26773302e-01 4.45633807e+00 5.15358355e+00 8.44190463e-01 4.81636334e+00 4.81636334e+00 8.47910322e-01 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 4.73477509e+00 5.09048399e+00 4.35277151e-01 4.81636334e+00 4.81636334e+00 8.47910322e-01 + 5.29024702e+00 4.58402514e+00 -4.89858720e-16 5.09048399e+00 4.73477509e+00 4.35277151e-01 4.81636334e+00 4.81636334e+00 8.47910322e-01 + 4.81636334e+00 4.81636334e+00 8.47910322e-01 4.50124211e+00 4.89429240e+00 1.13105771e+00 4.15141759e+00 4.93448788e+00 1.37905163e+00 + 4.81636334e+00 4.81636334e+00 8.47910322e-01 5.12363062e+00 4.48957244e+00 8.45846874e-01 5.41262889e+00 4.14677334e+00 8.32446705e-01 + 3.88713014e+00 0.00000000e+00 6.66829671e-16 4.01296255e+00 5.52425787e-01 -3.43079942e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 3.69635146e+00 0.00000000e+00 -6.64484250e-01 3.79174080e+00 0.00000000e+00 -3.32242125e-01 3.88713014e+00 0.00000000e+00 6.66829671e-16 + 2.91459649e+00 7.10760232e-01 5.93224540e-03 3.39580264e+00 3.54579387e-01 2.34272943e-03 3.88713014e+00 0.00000000e+00 6.66829671e-16 + 3.88713014e+00 0.00000000e+00 6.66829671e-16 4.32797653e+00 0.00000000e+00 2.13416421e-02 4.76882291e+00 0.00000000e+00 4.26832841e-02 + 3.88713014e+00 0.00000000e+00 6.66829671e-16 4.02443257e+00 5.30156873e-01 2.21161248e-01 4.16416613e+00 1.05434548e+00 4.43323150e-01 + 4.33718082e+00 0.00000000e+00 -8.53060355e-01 4.11215548e+00 0.00000000e+00 -4.26530178e-01 3.88713014e+00 0.00000000e+00 6.66829671e-16 + 3.17077126e+00 6.77896230e-01 -9.54430520e-01 3.65556297e+00 8.83251850e-01 -8.25709392e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 2.73498783e+00 1.45761881e+00 -6.21947363e-01 2.97029121e+00 1.07405356e+00 -7.80343057e-01 3.17077126e+00 6.77896230e-01 -9.54430520e-01 + 3.69635146e+00 0.00000000e+00 -6.64484250e-01 3.91225106e+00 5.49760461e-01 -6.80365635e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 3.69635146e+00 0.00000000e+00 -6.64484250e-01 3.43546619e+00 3.41348486e-01 -8.09661884e-01 3.17077126e+00 6.77896230e-01 -9.54430520e-01 + 3.69635146e+00 0.00000000e+00 -6.64484250e-01 3.30209863e+00 3.63424632e-01 -3.32768170e-01 2.91459649e+00 7.10760232e-01 5.93224540e-03 + 3.69635146e+00 0.00000000e+00 -6.64484250e-01 4.01676614e+00 0.00000000e+00 -7.58772303e-01 4.33718082e+00 0.00000000e+00 -8.53060355e-01 + 2.91459649e+00 7.10760232e-01 5.93224540e-03 3.52105501e+00 8.99662926e-01 -3.41743009e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 3.17077126e+00 6.77896230e-01 -9.54430520e-01 2.98409621e+00 6.80958761e-01 -4.89415654e-01 2.91459649e+00 7.10760232e-01 5.93224540e-03 + 2.91459649e+00 7.10760232e-01 5.93224540e-03 3.52760121e+00 8.77921193e-01 2.32168383e-01 4.16416613e+00 1.05434548e+00 4.43323150e-01 + 2.91459649e+00 7.10760232e-01 5.93224540e-03 3.25789641e+00 1.37452672e+00 -1.43856675e-02 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 2.73498783e+00 1.45761881e+00 -6.21947363e-01 2.82310606e+00 1.08354238e+00 -3.08289316e-01 2.91459649e+00 7.10760232e-01 5.93224540e-03 + 2.91459649e+00 7.10760232e-01 5.93224540e-03 2.98989544e+00 7.82545885e-01 5.95163084e-01 3.22867716e+00 8.97119914e-01 1.13171941e+00 + 2.72919104e+00 1.41103122e+00 5.33164898e-01 2.82512844e+00 1.06211181e+00 2.69079375e-01 2.91459649e+00 7.10760232e-01 5.93224540e-03 + 2.73498783e+00 1.45761881e+00 -6.21947363e-01 3.18034855e+00 1.74749186e+00 -3.28197592e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 2.73498783e+00 1.45761881e+00 -6.21947363e-01 2.85726865e+00 1.69941326e+00 -1.09203625e+00 3.07425129e+00 1.99753337e+00 -1.49031131e+00 + 2.73498783e+00 1.45761881e+00 -6.21947363e-01 2.54600566e+00 1.86861372e+00 -7.79461217e-01 2.32657264e+00 2.25725956e+00 -9.52959980e-01 + 2.73498783e+00 1.45761881e+00 -6.21947363e-01 2.47048700e+00 1.75147723e+00 -3.35626203e-01 2.19969685e+00 2.04087676e+00 -5.06174164e-02 + 2.73498783e+00 1.45761881e+00 -6.21947363e-01 3.43050264e+00 1.27503609e+00 -6.58897225e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 2.72919104e+00 1.41103122e+00 5.33164898e-01 2.65667842e+00 1.39473484e+00 -4.63663100e-02 2.73498783e+00 1.45761881e+00 -6.21947363e-01 + 8.30275396e-01 3.84107074e+00 1.68956565e+00 8.24554047e-01 4.33717779e+00 1.37825135e+00 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 1.04514325e+00 4.15519204e+00 4.72626700e-01 9.34207861e-01 3.99099947e+00 1.08793923e+00 8.30275396e-01 3.84107074e+00 1.68956565e+00 + 1.70582869e+00 4.21637311e+00 1.94834000e+00 1.26542759e+00 4.02038379e+00 1.83943150e+00 8.30275396e-01 3.84107074e+00 1.68956565e+00 + 8.30275396e-01 3.84107074e+00 1.68956565e+00 8.17372203e-01 3.43895293e+00 1.36127064e+00 8.26534753e-01 3.12967293e+00 9.44322863e-01 + 1.61933596e+00 3.29871374e+00 1.49789952e+00 1.22691063e+00 3.57602745e+00 1.58529970e+00 8.30275396e-01 3.84107074e+00 1.68956565e+00 + 6.92875009e+00 9.96203868e-01 -4.89858720e-16 6.84220032e+00 1.23102285e+00 4.35277151e-01 6.65570529e+00 1.44786006e+00 8.47910322e-01 + 6.65570529e+00 1.44786006e+00 8.47910322e-01 6.11098742e+00 1.28155030e+00 7.04016331e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 6.65570529e+00 1.44786006e+00 8.47910322e-01 6.50465451e+00 1.92200249e+00 9.06688824e-01 6.32434990e+00 2.38750096e+00 9.49952515e-01 + 6.71645082e+00 1.97212790e+00 -4.89858720e-16 6.73526970e+00 1.72257496e+00 4.35277151e-01 6.65570529e+00 1.44786006e+00 8.47910322e-01 + 6.65570529e+00 1.44786006e+00 8.47910322e-01 6.58469197e+00 1.10453830e+00 1.09028193e+00 6.47176543e+00 7.54185877e-01 1.30501830e+00 + 5.56236085e+00 2.93472089e+00 1.52914670e+00 5.13381199e+00 2.81412474e+00 1.11915118e+00 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 5.56236085e+00 2.93472089e+00 1.52914670e+00 5.97505642e+00 2.67530493e+00 1.26802620e+00 6.32434990e+00 2.38750096e+00 9.49952515e-01 + 5.55889845e+00 2.08882586e+00 1.76618606e+00 5.56974476e+00 2.51589073e+00 1.66262616e+00 5.56236085e+00 2.93472089e+00 1.52914670e+00 + 5.56236085e+00 2.93472089e+00 1.52914670e+00 5.78547706e+00 3.14800158e+00 1.21782415e+00 5.94337009e+00 3.32579295e+00 8.49502618e-01 + 5.56236085e+00 2.93472089e+00 1.52914670e+00 5.29814988e+00 3.28105532e+00 1.57562453e+00 5.02317376e+00 3.62072307e+00 1.60590616e+00 + 8.26534753e-01 3.12967293e+00 9.44322863e-01 8.07882084e-01 2.95348575e+00 4.94062215e-01 8.18991350e-01 2.88610338e+00 1.50447569e-02 + 8.26534753e-01 3.12967293e+00 9.44322863e-01 1.57105412e+00 3.38771306e+00 7.74427331e-01 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 8.26534753e-01 3.12967293e+00 9.44322863e-01 9.33099064e-01 3.63990883e+00 7.12182587e-01 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 8.26534753e-01 3.12967293e+00 9.44322863e-01 1.24186872e+00 2.89522839e+00 7.60739472e-01 1.63966782e+00 2.61990395e+00 5.95450771e-01 + 8.26534753e-01 3.12967293e+00 9.44322863e-01 1.21786261e+00 3.20086082e+00 1.23227000e+00 1.61933596e+00 3.29871374e+00 1.49789952e+00 + 7.02329418e-01 6.84062448e+00 6.91687670e-01 9.13122150e-01 6.20433999e+00 6.26148892e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 7.02329418e-01 6.84062448e+00 6.91687670e-01 3.48047563e-01 6.59104900e+00 3.61642558e-01 6.98806688e-16 6.29429108e+00 2.92477739e-02 + 9.96203868e-01 6.92875009e+00 -4.89858720e-16 8.53183010e-01 6.91643581e+00 3.51555759e-01 7.02329418e-01 6.84062448e+00 6.91687670e-01 + 6.56146310e-16 5.91004055e+00 8.16875302e-01 3.54192168e-01 6.38488147e+00 7.62046720e-01 7.02329418e-01 6.84062448e+00 6.91687670e-01 + 7.02329418e-01 6.84062448e+00 6.91687670e-01 7.25227992e-01 6.68430015e+00 1.01461935e+00 7.42174170e-01 6.47311362e+00 1.30506479e+00 + 9.34999077e-01 5.73790834e+00 1.82703946e+00 8.74995806e-01 5.28814989e+00 1.45036250e+00 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 9.34999077e-01 5.73790834e+00 1.82703946e+00 1.02830228e+00 5.65083519e+00 1.20166627e+00 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 9.34999077e-01 5.73790834e+00 1.82703946e+00 4.65432194e-01 5.62891945e+00 1.60119776e+00 6.11050690e-16 5.50385532e+00 1.34131946e+00 + 7.42174170e-01 6.47311362e+00 1.30506479e+00 8.42596914e-01 6.13470877e+00 1.60574364e+00 9.34999077e-01 5.73790834e+00 1.82703946e+00 + 9.34999077e-01 5.73790834e+00 1.82703946e+00 1.38907828e+00 5.34720522e+00 1.41635061e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 6.47176543e+00 7.54185877e-01 1.30501830e+00 6.01685205e+00 9.31180230e-01 9.34319258e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 5.91004055e+00 0.00000000e+00 8.16875302e-01 6.20320925e+00 3.73907735e-01 1.07215691e+00 6.47176543e+00 7.54185877e-01 1.30501830e+00 + 5.73252083e+00 7.51834686e-01 1.84094565e+00 6.13280658e+00 7.56794181e-01 1.61529972e+00 6.47176543e+00 7.54185877e-01 1.30501830e+00 + 4.67618055e+00 7.95671378e-01 -1.98346963e+00 4.50529850e+00 4.02766214e-01 -1.42650595e+00 4.33718082e+00 0.00000000e+00 -8.53060355e-01 + 4.67618055e+00 7.95671378e-01 -1.98346963e+00 4.40670508e+00 9.45166810e-01 -1.34588610e+00 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 5.43450550e+00 1.06264940e+00 -7.98648778e-01 5.06406489e+00 9.28008752e-01 -1.40897534e+00 4.67618055e+00 7.95671378e-01 -1.98346963e+00 + 5.15140664e+00 0.00000000e+00 -1.27674188e+00 4.91962223e+00 3.99465008e-01 -1.64462378e+00 4.67618055e+00 7.95671378e-01 -1.98346963e+00 + 4.67618055e+00 7.95671378e-01 -1.98346963e+00 4.84647820e+00 1.22551329e+00 -1.99999976e+00 5.01679319e+00 1.65535959e+00 -1.97989896e+00 + 5.13416130e+00 0.00000000e+00 7.65775070e-01 5.34572826e+00 5.57515540e-01 6.62611950e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 5.50385532e+00 0.00000000e+00 1.34131946e+00 5.31900831e+00 0.00000000e+00 1.05354727e+00 5.13416130e+00 0.00000000e+00 7.65775070e-01 + 5.91004055e+00 0.00000000e+00 8.16875302e-01 5.52210093e+00 0.00000000e+00 7.91325186e-01 5.13416130e+00 0.00000000e+00 7.65775070e-01 + 5.13416130e+00 0.00000000e+00 7.65775070e-01 4.98101848e+00 4.12069346e-01 8.98400488e-01 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 4.76882291e+00 0.00000000e+00 4.26832841e-02 4.95149211e+00 0.00000000e+00 4.04229177e-01 5.13416130e+00 0.00000000e+00 7.65775070e-01 + 5.13416130e+00 0.00000000e+00 7.65775070e-01 5.31947326e+00 0.00000000e+00 4.26534265e-01 5.50478521e+00 0.00000000e+00 8.72934590e-02 + 5.15140664e+00 0.00000000e+00 -1.27674188e+00 5.12278797e+00 0.00000000e+00 -9.27016349e-01 5.09416930e+00 0.00000000e+00 -5.77290822e-01 + 5.15140664e+00 0.00000000e+00 -1.27674188e+00 4.65034856e+00 5.52524418e-01 -9.89824469e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 5.15140664e+00 0.00000000e+00 -1.27674188e+00 5.29590355e+00 5.32957589e-01 -1.04559122e+00 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 5.15140664e+00 0.00000000e+00 -1.27674188e+00 4.74429373e+00 0.00000000e+00 -1.06490112e+00 4.33718082e+00 0.00000000e+00 -8.53060355e-01 + 5.15140664e+00 0.00000000e+00 -1.27674188e+00 5.48025164e+00 0.00000000e+00 -1.00271200e+00 5.80909663e+00 0.00000000e+00 -7.28682117e-01 + 4.76882291e+00 0.00000000e+00 4.26832841e-02 4.55300187e+00 0.00000000e+00 -4.05188536e-01 4.33718082e+00 0.00000000e+00 -8.53060355e-01 + 4.33718082e+00 0.00000000e+00 -8.53060355e-01 4.23931724e+00 5.51957120e-01 -7.74915163e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 5.43450550e+00 1.06264940e+00 -7.98648778e-01 4.88620696e+00 5.33535957e-01 -8.28828126e-01 4.33718082e+00 0.00000000e+00 -8.53060355e-01 + 5.09416930e+00 0.00000000e+00 -5.77290822e-01 4.71567506e+00 0.00000000e+00 -7.15175589e-01 4.33718082e+00 0.00000000e+00 -8.53060355e-01 + 2.71726342e+00 4.76227833e+00 1.94081239e+00 3.04942752e+00 4.36756912e+00 1.97312183e+00 3.37998430e+00 3.97055779e+00 1.98847851e+00 + 3.37998430e+00 3.97055779e+00 1.98847851e+00 2.91466155e+00 3.76453865e+00 1.98566691e+00 2.45654560e+00 3.56782772e+00 1.88505561e+00 + 3.37998430e+00 3.97055779e+00 1.98847851e+00 3.34779759e+00 3.72770117e+00 1.48681823e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 4.18879533e+00 4.22468914e+00 1.76035677e+00 3.79209295e+00 4.10596419e+00 1.91124809e+00 3.37998430e+00 3.97055779e+00 1.98847851e+00 + 3.52045619e+00 4.86774807e+00 1.72777047e+00 3.45888877e+00 4.43025585e+00 1.90127928e+00 3.37998430e+00 3.97055779e+00 1.98847851e+00 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 3.74521697e+00 3.66002999e+00 1.98595022e+00 3.37998430e+00 3.97055779e+00 1.98847851e+00 + 3.19684636e+00 2.95635512e+00 1.89289769e+00 3.28474919e+00 3.45959517e+00 1.98679735e+00 3.37998430e+00 3.97055779e+00 1.98847851e+00 + 8.67290394e-01 3.93082088e+00 -1.74644847e+00 1.20922834e+00 3.74341683e+00 -1.69215415e+00 1.54860554e+00 3.54808542e+00 -1.65108235e+00 + 1.76701972e+00 4.45263593e+00 -1.98899096e+00 1.31378948e+00 4.18101777e+00 -1.90231038e+00 8.67290394e-01 3.93082088e+00 -1.74644847e+00 + 8.67290394e-01 3.93082088e+00 -1.74644847e+00 9.13503784e-01 3.99709581e+00 -1.16222362e+00 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 4.81523801e-16 4.33718082e+00 -8.53060355e-01 4.32233002e-01 4.13117378e+00 -1.30756787e+00 8.67290394e-01 3.93082088e+00 -1.74644847e+00 + 9.17002933e-01 4.84172634e+00 -1.99869635e+00 8.89165279e-01 4.37161552e+00 -1.92603578e+00 8.67290394e-01 3.93082088e+00 -1.74644847e+00 + 8.67290394e-01 3.93082088e+00 -1.74644847e+00 8.87497192e-01 3.50951793e+00 -1.44761444e+00 9.28539289e-01 3.17060607e+00 -1.05963208e+00 + 1.70582869e+00 4.21637311e+00 1.94834000e+00 1.25912197e+00 4.52332802e+00 1.50790315e+00 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 2.31584155e+00 3.67268462e+00 5.81567251e-01 2.00683133e+00 3.93712453e+00 1.28800416e+00 1.70582869e+00 4.21637311e+00 1.94834000e+00 + 2.45654560e+00 3.56782772e+00 1.88505561e+00 2.08179368e+00 3.89323473e+00 1.91249351e+00 1.70582869e+00 4.21637311e+00 1.94834000e+00 + 1.70582869e+00 4.21637311e+00 1.94834000e+00 1.77497973e+00 4.58607864e+00 1.47691103e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 1.04514325e+00 4.15519204e+00 4.72626700e-01 1.37444095e+00 4.18734437e+00 1.22382537e+00 1.70582869e+00 4.21637311e+00 1.94834000e+00 + 1.61933596e+00 3.29871374e+00 1.49789952e+00 1.65140886e+00 3.73229068e+00 1.77651928e+00 1.70582869e+00 4.21637311e+00 1.94834000e+00 + 2.71726342e+00 4.76227833e+00 1.94081239e+00 2.21160268e+00 4.48944066e+00 1.99999465e+00 1.70582869e+00 4.21637311e+00 1.94834000e+00 + 2.71390420e+00 2.74576871e+00 -1.64373145e+00 2.27589525e+00 2.84107560e+00 -1.46665472e+00 1.84023910e+00 2.93931957e+00 -1.28551886e+00 + 2.71390420e+00 2.74576871e+00 -1.64373145e+00 3.10371845e+00 2.93138549e+00 -1.33816234e+00 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 2.71390420e+00 2.74576871e+00 -1.64373145e+00 2.70060884e+00 3.22023131e+00 -1.12087859e+00 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 2.32657264e+00 2.25725956e+00 -9.52959980e-01 2.49149869e+00 2.47298792e+00 -1.33462748e+00 2.71390420e+00 2.74576871e+00 -1.64373145e+00 + 2.71390420e+00 2.74576871e+00 -1.64373145e+00 2.53228499e+00 3.15750151e+00 -1.75862164e+00 2.35347470e+00 3.57273676e+00 -1.86522242e+00 + 2.71390420e+00 2.74576871e+00 -1.64373145e+00 2.96862946e+00 3.09254554e+00 -1.86851185e+00 3.25199430e+00 3.46915743e+00 -1.98494345e+00 + 3.07425129e+00 1.99753337e+00 -1.49031131e+00 2.89876901e+00 2.37549546e+00 -1.55946793e+00 2.71390420e+00 2.74576871e+00 -1.64373145e+00 + 2.19969685e+00 2.04087676e+00 -5.06174164e-02 2.52276548e+00 2.43540656e+00 7.81877416e-02 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 2.19969685e+00 2.04087676e+00 -5.06174164e-02 2.91745133e+00 2.04179580e+00 -4.49875129e-02 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 2.19969685e+00 2.04087676e+00 -5.06174164e-02 2.22453531e+00 2.11241422e+00 -5.16003361e-01 2.32657264e+00 2.25725956e+00 -9.52959980e-01 + 1.61330264e+00 2.59455891e+00 -4.66799866e-01 1.91631503e+00 2.32965021e+00 -2.56708945e-01 2.19969685e+00 2.04087676e+00 -5.06174164e-02 + 2.19969685e+00 2.04087676e+00 -5.06174164e-02 2.46919510e+00 1.72928143e+00 2.40570927e-01 2.72919104e+00 1.41103122e+00 5.33164898e-01 + 2.19969685e+00 2.04087676e+00 -5.06174164e-02 1.91929843e+00 2.32992432e+00 2.72499720e-01 1.63966782e+00 2.61990395e+00 5.95450771e-01 + 3.01195346e+00 1.97163196e+00 1.42817625e+00 2.82237714e+00 1.66293519e+00 1.01355441e+00 2.72919104e+00 1.41103122e+00 5.33164898e-01 + 2.72919104e+00 1.41103122e+00 5.33164898e-01 3.17673456e+00 1.72580966e+00 2.47197320e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 3.42748385e+00 1.22006262e+00 4.97333571e-01 2.72919104e+00 1.41103122e+00 5.33164898e-01 + 3.22867716e+00 8.97119914e-01 1.13171941e+00 2.96877689e+00 1.15014054e+00 8.37464870e-01 2.72919104e+00 1.41103122e+00 5.33164898e-01 + 2.72919104e+00 1.41103122e+00 5.33164898e-01 2.79094848e+00 2.12562312e+00 3.69602150e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 2.45654560e+00 3.56782772e+00 1.88505561e+00 2.14743264e+00 4.25604406e+00 1.45486703e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 2.45654560e+00 3.56782772e+00 1.88505561e+00 2.88673362e+00 3.52814486e+00 1.43088028e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 2.45654560e+00 3.56782772e+00 1.88505561e+00 2.38667940e+00 3.61669283e+00 1.23884484e+00 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 2.71726342e+00 4.76227833e+00 1.94081239e+00 2.58464455e+00 4.16141438e+00 1.99743549e+00 2.45654560e+00 3.56782772e+00 1.88505561e+00 + 2.45654560e+00 3.56782772e+00 1.88505561e+00 2.02978184e+00 3.41952556e+00 1.71831504e+00 1.61933596e+00 3.29871374e+00 1.49789952e+00 + 2.45654560e+00 3.56782772e+00 1.88505561e+00 2.82867041e+00 3.26436997e+00 1.88064520e+00 3.19684636e+00 2.95635512e+00 1.89289769e+00 + 4.18879533e+00 4.22468914e+00 1.76035677e+00 3.75777617e+00 3.85814037e+00 1.37625668e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 4.18879533e+00 4.22468914e+00 1.76035677e+00 4.19673165e+00 4.13257878e+00 1.18321318e+00 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 4.15141759e+00 4.93448788e+00 1.37905163e+00 4.18149699e+00 4.59209753e+00 1.59195051e+00 4.18879533e+00 4.22468914e+00 1.76035677e+00 + 3.52045619e+00 4.86774807e+00 1.72777047e+00 3.85743134e+00 4.54952756e+00 1.75194187e+00 4.18879533e+00 4.22468914e+00 1.76035677e+00 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 4.15673678e+00 3.79357107e+00 1.89898524e+00 4.18879533e+00 4.22468914e+00 1.76035677e+00 + 4.18879533e+00 4.22468914e+00 1.76035677e+00 4.61251185e+00 3.92826512e+00 1.69687471e+00 5.02317376e+00 3.62072307e+00 1.60590616e+00 + 5.71921026e-16 5.15140664e+00 -1.27674188e+00 6.02810354e-01 5.20410686e+00 -1.04158385e+00 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 5.71921026e-16 5.15140664e+00 -1.27674188e+00 5.26722413e-16 4.74429373e+00 -1.06490112e+00 4.81523801e-16 4.33718082e+00 -8.53060355e-01 + 9.17002933e-01 4.84172634e+00 -1.99869635e+00 4.58866703e-01 4.99883301e+00 -1.65294455e+00 5.71921026e-16 5.15140664e+00 -1.27674188e+00 + 5.71921026e-16 5.15140664e+00 -1.27674188e+00 5.68743715e-16 5.12278797e+00 -9.27016349e-01 5.65566405e-16 5.09416930e+00 -5.77290822e-01 + 6.44939283e-16 5.80909663e+00 -7.28682117e-01 6.08430155e-16 5.48025164e+00 -1.00271200e+00 5.71921026e-16 5.15140664e+00 -1.27674188e+00 + 5.70006409e-16 5.13416130e+00 7.65775070e-01 5.90580169e-16 5.31947326e+00 4.26534265e-01 6.11153928e-16 5.50478521e+00 8.72934590e-02 + 5.70006409e-16 5.13416130e+00 7.65775070e-01 5.49726055e-16 4.95149211e+00 4.04229177e-01 5.29445700e-16 4.76882291e+00 4.26832841e-02 + 5.70006409e-16 5.13416130e+00 7.65775070e-01 4.12120125e-01 4.98762059e+00 9.02341837e-01 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 5.70006409e-16 5.13416130e+00 7.65775070e-01 5.64316729e-01 5.34558717e+00 6.64733501e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 6.11050690e-16 5.50385532e+00 1.34131946e+00 5.90528550e-16 5.31900831e+00 1.05354727e+00 5.70006409e-16 5.13416130e+00 7.65775070e-01 + 5.70006409e-16 5.13416130e+00 7.65775070e-01 6.13076360e-16 5.52210093e+00 7.91325186e-01 6.56146310e-16 5.91004055e+00 8.16875302e-01 + 4.15141759e+00 4.93448788e+00 1.37905163e+00 4.17753157e+00 4.48775509e+00 9.88799821e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 3.70286543e+00 4.70115204e+00 9.20620012e-01 4.15141759e+00 4.93448788e+00 1.37905163e+00 + 4.07707079e+00 5.46855113e+00 8.26773302e-01 4.12982201e+00 5.22121409e+00 1.11988284e+00 4.15141759e+00 4.93448788e+00 1.37905163e+00 + 4.15141759e+00 4.93448788e+00 1.37905163e+00 3.73151731e+00 5.22396118e+00 1.40859242e+00 3.29955954e+00 5.49655452e+00 1.41755307e+00 + 3.52045619e+00 4.86774807e+00 1.72777047e+00 3.42161637e+00 4.17959247e+00 1.36261139e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 3.52045619e+00 4.86774807e+00 1.72777047e+00 3.86181521e+00 4.45770399e+00 1.17031212e+00 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 3.52045619e+00 4.86774807e+00 1.72777047e+00 3.38385785e+00 4.66431380e+00 1.09714610e+00 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 3.52045619e+00 4.86774807e+00 1.72777047e+00 3.84449896e+00 4.91205759e+00 1.57104485e+00 4.15141759e+00 4.93448788e+00 1.37905163e+00 + 3.52045619e+00 4.86774807e+00 1.72777047e+00 3.12356859e+00 4.82228280e+00 1.85585236e+00 2.71726342e+00 4.76227833e+00 1.94081239e+00 + 3.29955954e+00 5.49655452e+00 1.41755307e+00 3.41659055e+00 5.19215493e+00 1.58831078e+00 3.52045619e+00 4.86774807e+00 1.72777047e+00 + 5.41262889e+00 4.14677334e+00 8.32446705e-01 5.25744289e+00 3.91317948e+00 1.25911763e+00 5.02317376e+00 3.62072307e+00 1.60590616e+00 + 5.02317376e+00 3.62072307e+00 1.60590616e+00 4.61567483e+00 3.82949568e+00 1.10580790e+00 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 5.02317376e+00 3.62072307e+00 1.60590616e+00 4.86307268e+00 3.15766960e+00 1.15346214e+00 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 4.58484575e+00 3.49881747e+00 1.84692888e+00 5.02317376e+00 3.62072307e+00 1.60590616e+00 + 5.02317376e+00 3.62072307e+00 1.60590616e+00 5.52812840e+00 3.50167136e+00 1.27143343e+00 5.94337009e+00 3.32579295e+00 8.49502618e-01 + 3.36631027e+00 5.23557164e+00 -1.58139969e+00 3.15130362e+00 5.13623402e+00 -1.02399478e+00 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 3.54138495e+00 4.74969184e+00 -1.09469359e+00 3.36631027e+00 5.23557164e+00 -1.58139969e+00 + 2.85345437e+00 4.35227192e+00 -1.98954064e+00 3.12543817e+00 4.81790131e+00 -1.85691858e+00 3.36631027e+00 5.23557164e+00 -1.58139969e+00 + 3.75674562e+00 4.26273080e+00 -1.88016210e+00 3.57072631e+00 4.76141686e+00 -1.75912362e+00 3.36631027e+00 5.23557164e+00 -1.58139969e+00 + 3.36631027e+00 5.23557164e+00 -1.58139969e+00 2.91367651e+00 5.23446573e+00 -1.73735576e+00 2.44916181e+00 5.21201554e+00 -1.85047539e+00 + 3.36631027e+00 5.23557164e+00 -1.58139969e+00 3.76022028e+00 5.38398386e+00 -1.24268278e+00 4.09839280e+00 5.45258967e+00 -8.26773302e-01 + 2.65894205e+00 5.84727816e+00 -1.40492233e+00 3.01745664e+00 5.55031008e+00 -1.50471131e+00 3.36631027e+00 5.23557164e+00 -1.58139969e+00 + 1.61933596e+00 3.29871374e+00 1.49789952e+00 1.72498386e+00 4.11466459e+00 1.26246261e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 1.61933596e+00 3.29871374e+00 1.49789952e+00 1.96531624e+00 3.48082659e+00 1.04249368e+00 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 1.61933596e+00 3.29871374e+00 1.49789952e+00 1.33183546e+00 3.72318754e+00 9.90706875e-01 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 1.61933596e+00 3.29871374e+00 1.49789952e+00 1.60119613e+00 2.90790327e+00 1.08455010e+00 1.63966782e+00 2.61990395e+00 5.95450771e-01 + 4.81523801e-16 4.33718082e+00 -8.53060355e-01 4.82164005e-01 4.20736994e+00 -7.13794459e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 1.20153714e+00 5.25120069e+00 -7.90659956e-01 6.03427056e-01 4.79186548e+00 -8.26329066e-01 4.81523801e-16 4.33718082e+00 -8.53060355e-01 + 5.65566405e-16 5.09416930e+00 -5.77290822e-01 5.23545103e-16 4.71567506e+00 -7.15175589e-01 4.81523801e-16 4.33718082e+00 -8.53060355e-01 + 5.29445700e-16 4.76882291e+00 4.26832841e-02 5.05484750e-16 4.55300187e+00 -4.05188536e-01 4.81523801e-16 4.33718082e+00 -8.53060355e-01 + 9.17002933e-01 4.84172634e+00 -1.99869635e+00 9.37164663e-01 4.44986478e+00 -1.30338424e+00 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 9.17002933e-01 4.84172634e+00 -1.99869635e+00 1.05968504e+00 5.05000748e+00 -1.40317186e+00 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 9.17002933e-01 4.84172634e+00 -1.99869635e+00 4.63154971e-01 4.58954231e+00 -1.43485733e+00 4.81523801e-16 4.33718082e+00 -8.53060355e-01 + 9.17002933e-01 4.84172634e+00 -1.99869635e+00 1.34202238e+00 4.64721942e+00 -1.99335601e+00 1.76701972e+00 4.45263593e+00 -1.98899096e+00 + 9.17002933e-01 4.84172634e+00 -1.99869635e+00 1.26187087e+00 5.06798675e+00 -1.98756022e+00 1.60546045e+00 5.28911299e+00 -1.92920779e+00 + 5.80909663e+00 0.00000000e+00 -7.28682117e-01 5.65694092e+00 0.00000000e+00 -3.20694329e-01 5.50478521e+00 0.00000000e+00 8.72934590e-02 + 5.80909663e+00 0.00000000e+00 -7.28682117e-01 5.62817111e+00 5.33136640e-01 -7.67950691e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 6.29429108e+00 0.00000000e+00 2.92477739e-02 6.05169386e+00 0.00000000e+00 -3.49717172e-01 5.80909663e+00 0.00000000e+00 -7.28682117e-01 + 6.84886319e+00 6.86722414e-01 -6.73452256e-01 6.33876019e+00 3.46393453e-01 -7.08811056e-01 5.80909663e+00 0.00000000e+00 -7.28682117e-01 + 5.80909663e+00 0.00000000e+00 -7.28682117e-01 5.45163297e+00 0.00000000e+00 -6.52986470e-01 5.09416930e+00 0.00000000e+00 -5.77290822e-01 + 6.11050690e-16 5.50385532e+00 1.34131946e+00 4.10662987e-01 5.17236960e+00 1.19561432e+00 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 1.04514325e+00 4.15519204e+00 4.72626700e-01 9.32610423e-01 4.49556585e+00 7.54392898e-01 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 5.29445700e-16 4.76882291e+00 4.26832841e-02 4.12249624e-01 4.80460658e+00 5.36610592e-01 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 1.12146756e+00 5.55164805e+00 5.56236736e-01 9.71284794e-01 5.19449557e+00 7.97336437e-01 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 8.19698711e-01 4.83633089e+00 1.03462865e+00 1.32978385e+00 4.89220415e+00 1.01002963e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 3.66669029e+00 1.60543495e+00 1.73363787e+00 3.41977746e+00 1.24114933e+00 1.46460333e+00 3.22867716e+00 8.97119914e-01 1.13171941e+00 + 3.22867716e+00 8.97119914e-01 1.13171941e+00 3.41542049e+00 1.46526107e+00 5.55579485e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 3.69060505e+00 9.70142605e-01 7.91509570e-01 3.22867716e+00 8.97119914e-01 1.13171941e+00 + 3.01195346e+00 1.97163196e+00 1.42817625e+00 3.13604891e+00 1.44160851e+00 1.26579265e+00 3.22867716e+00 8.97119914e-01 1.13171941e+00 + 7.42174170e-01 6.47311362e+00 -1.30506479e+00 1.11374603e+00 6.59032881e+00 -1.07930431e+00 1.47742668e+00 6.66084957e+00 -8.23188188e-01 + 7.42174170e-01 6.47311362e+00 -1.30506479e+00 9.73218449e-01 5.86872954e+00 -1.05850154e+00 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 7.42174170e-01 6.47311362e+00 -1.30506479e+00 3.68872483e-01 6.15241385e+00 -1.02695186e+00 6.44939283e-16 5.80909663e+00 -7.28682117e-01 + 7.42174170e-01 6.47311362e+00 -1.30506479e+00 7.19830710e-01 6.69030958e+00 -1.00539886e+00 6.91202058e-01 6.84908918e+00 -6.71566734e-01 + 7.42174170e-01 6.47311362e+00 -1.30506479e+00 1.27328629e+00 6.26749945e+00 -1.43265323e+00 1.79787339e+00 6.02976719e+00 -1.52659565e+00 + 2.90790509e+00 6.36742397e+00 -4.89858720e-16 3.35474291e+00 6.14375293e+00 -4.89858720e-16 3.78448572e+00 5.88877473e+00 -4.89858720e-16 + 2.90790509e+00 6.36742397e+00 -4.89858720e-16 2.49224429e+00 6.04920594e+00 6.94753833e-02 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 2.90790509e+00 6.36742397e+00 -4.89858720e-16 2.92490841e+00 5.70739469e+00 -2.31400220e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 2.90790509e+00 6.36742397e+00 -4.89858720e-16 3.10882837e+00 6.21822391e+00 4.35277151e-01 3.26434043e+00 5.97819314e+00 8.47910322e-01 + 2.40016886e+00 6.39010822e+00 -8.15916232e-01 2.67207529e+00 6.42211973e+00 -4.17993502e-01 2.90790509e+00 6.36742397e+00 -4.89858720e-16 + 1.97212790e+00 6.71645082e+00 -4.89858720e-16 2.44624926e+00 6.55864807e+00 -4.89858720e-16 2.90790509e+00 6.36742397e+00 -4.89858720e-16 + 5.01679319e+00 1.65535959e+00 -1.97989896e+00 4.59710436e+00 1.95828502e+00 -1.49329042e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 5.01679319e+00 1.65535959e+00 -1.97989896e+00 4.58366979e+00 1.37770889e+00 -1.34774296e+00 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 5.01679319e+00 1.65535959e+00 -1.97989896e+00 5.24151095e+00 1.36016327e+00 -1.40838500e+00 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 5.48202315e+00 2.40466127e+00 -1.73992713e+00 5.26040566e+00 2.03426330e+00 -1.89482027e+00 5.01679319e+00 1.65535959e+00 -1.97989896e+00 + 5.01679319e+00 1.65535959e+00 -1.97989896e+00 5.60293452e+00 1.74951359e+00 -1.80099367e+00 6.11057364e+00 1.81915532e+00 -1.45178853e+00 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 3.64949643e+00 3.14931543e+00 1.99192670e+00 3.19684636e+00 2.95635512e+00 1.89289769e+00 + 3.19684636e+00 2.95635512e+00 1.89289769e+00 3.26085370e+00 3.22364104e+00 1.43801128e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 3.19684636e+00 2.95635512e+00 1.89289769e+00 3.08678370e+00 2.45001137e+00 1.69656510e+00 3.01195346e+00 1.97163196e+00 1.42817625e+00 + 3.19684636e+00 2.95635512e+00 1.89289769e+00 3.56657789e+00 2.64730769e+00 1.92049557e+00 3.93477797e+00 2.33712352e+00 1.95465416e+00 + 6.56146310e-16 5.91004055e+00 8.16875302e-01 5.62973498e-01 5.73700965e+00 6.90089179e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 6.56146310e-16 5.91004055e+00 8.16875302e-01 6.77476499e-16 6.10216582e+00 4.23061538e-01 6.98806688e-16 6.29429108e+00 2.92477739e-02 + 6.56146310e-16 5.91004055e+00 8.16875302e-01 6.33650119e-16 5.70741288e+00 4.52084380e-01 6.11153928e-16 5.50478521e+00 8.72934590e-02 + 6.11050690e-16 5.50385532e+00 1.34131946e+00 5.61418430e-01 5.53207561e+00 9.57972716e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 6.56146310e-16 5.91004055e+00 8.16875302e-01 6.33598500e-16 5.70694794e+00 1.07909738e+00 6.11050690e-16 5.50385532e+00 1.34131946e+00 + 7.42174170e-01 6.47311362e+00 1.30506479e+00 3.74759286e-01 5.99875347e+00 1.33669376e+00 6.11050690e-16 5.50385532e+00 1.34131946e+00 + 7.42174170e-01 6.47311362e+00 1.30506479e+00 9.32348399e-01 6.01600138e+00 9.36172427e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 6.56146310e-16 5.91004055e+00 8.16875302e-01 3.67629959e-01 6.20600646e+00 1.07289337e+00 7.42174170e-01 6.47311362e+00 1.30506479e+00 + 1.04514325e+00 4.15519204e+00 4.72626700e-01 1.33785600e+00 3.38259941e+00 5.36244428e-01 1.63966782e+00 2.61990395e+00 5.95450771e-01 + 1.63966782e+00 2.61990395e+00 5.95450771e-01 1.97863191e+00 3.13871448e+00 5.96538247e-01 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 1.61330264e+00 2.59455891e+00 -4.66799866e-01 1.58845529e+00 2.54627002e+00 6.67238775e-02 1.63966782e+00 2.61990395e+00 5.95450771e-01 + 8.18991350e-01 2.88610338e+00 1.50447569e-02 1.23268409e+00 2.76051587e+00 3.03982610e-01 1.63966782e+00 2.61990395e+00 5.95450771e-01 + 1.63966782e+00 2.61990395e+00 5.95450771e-01 2.24629900e+00 2.73647915e+00 4.03222857e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 3.75674562e+00 4.26273080e+00 -1.88016210e+00 4.27351282e+00 4.19061774e+00 -1.74043746e+00 4.76414707e+00 4.09287863e+00 -1.53606293e+00 + 4.19318871e+00 3.34729677e+00 -1.96634244e+00 3.97718864e+00 3.80714028e+00 -1.93502014e+00 3.75674562e+00 4.26273080e+00 -1.88016210e+00 + 3.75674562e+00 4.26273080e+00 -1.88016210e+00 3.62838771e+00 3.69438253e+00 -1.47379427e+00 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 3.75674562e+00 4.26273080e+00 -1.88016210e+00 3.73659687e+00 4.26158317e+00 -1.24531023e+00 3.70930390e+00 4.24678754e+00 -5.94643898e-01 + 2.85345437e+00 4.35227192e+00 -1.98954064e+00 3.30748392e+00 4.31060830e+00 -1.95249777e+00 3.75674562e+00 4.26273080e+00 -1.88016210e+00 + 3.25199430e+00 3.46915743e+00 -1.98494345e+00 3.50852348e+00 3.87052618e+00 -1.98741065e+00 3.75674562e+00 4.26273080e+00 -1.88016210e+00 + 5.73252083e+00 7.51834686e-01 1.84094565e+00 5.27956527e+00 7.83785617e-01 1.44766444e+00 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 5.73252083e+00 7.51834686e-01 1.84094565e+00 5.64902536e+00 9.30440779e-01 1.20609611e+00 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 5.35379131e+00 1.37066032e+00 1.92946545e+00 5.54565930e+00 1.06172675e+00 1.89266839e+00 5.73252083e+00 7.51834686e-01 1.84094565e+00 + 5.50385532e+00 0.00000000e+00 1.34131946e+00 5.16626834e+00 4.10672035e-01 1.19009445e+00 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 5.50385532e+00 0.00000000e+00 1.34131946e+00 5.53208670e+00 5.56221358e-01 9.54353404e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 5.50385532e+00 0.00000000e+00 1.34131946e+00 5.62499314e+00 3.73315808e-01 1.60659233e+00 5.73252083e+00 7.51834686e-01 1.84094565e+00 + 5.50385532e+00 0.00000000e+00 1.34131946e+00 5.70694794e+00 0.00000000e+00 1.07909738e+00 5.91004055e+00 0.00000000e+00 8.16875302e-01 + 5.91004055e+00 0.00000000e+00 8.16875302e-01 5.73785075e+00 5.55495592e-01 6.90438445e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 5.73252083e+00 7.51834686e-01 1.84094565e+00 5.83286365e+00 3.81022302e-01 1.34049844e+00 5.91004055e+00 0.00000000e+00 8.16875302e-01 + 6.29429108e+00 0.00000000e+00 2.92477739e-02 6.10216582e+00 0.00000000e+00 4.23061538e-01 5.91004055e+00 0.00000000e+00 8.16875302e-01 + 5.50478521e+00 0.00000000e+00 8.72934590e-02 5.70741288e+00 0.00000000e+00 4.52084380e-01 5.91004055e+00 0.00000000e+00 8.16875302e-01 + 9.28539289e-01 3.17060607e+00 -1.05963208e+00 1.22924390e+00 3.33404427e+00 -1.38110326e+00 1.54860554e+00 3.54808542e+00 -1.65108235e+00 + 9.28539289e-01 3.17060607e+00 -1.05963208e+00 9.42573966e-01 3.61796949e+00 -8.17945745e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 9.28539289e-01 3.17060607e+00 -1.05963208e+00 1.39143234e+00 3.07050509e+00 -1.16041966e+00 1.84023910e+00 2.93931957e+00 -1.28551886e+00 + 9.28539289e-01 3.17060607e+00 -1.05963208e+00 1.27127621e+00 2.88338823e+00 -7.62852624e-01 1.61330264e+00 2.59455891e+00 -4.66799866e-01 + 9.28539289e-01 3.17060607e+00 -1.05963208e+00 8.52556207e-01 2.95484675e+00 -5.43915116e-01 8.18991350e-01 2.88610338e+00 1.50447569e-02 + 5.94337009e+00 3.32579295e+00 8.49502618e-01 5.95878269e+00 3.58080518e+00 4.35878417e-01 5.88877473e+00 3.78448572e+00 -4.89858720e-16 + 6.32434990e+00 2.38750096e+00 9.49952515e-01 6.14809712e+00 2.86327744e+00 9.07727041e-01 5.94337009e+00 3.32579295e+00 8.49502618e-01 + 5.94337009e+00 3.32579295e+00 8.49502618e-01 5.43360854e+00 3.15928973e+00 1.87471484e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 5.94337009e+00 3.32579295e+00 8.49502618e-01 5.32865507e+00 3.01151495e+00 7.82343525e-01 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 5.94337009e+00 3.32579295e+00 8.49502618e-01 6.20201996e+00 3.14045702e+00 4.36436877e-01 6.36742397e+00 2.90790509e+00 -4.89858720e-16 + 5.41262889e+00 4.14677334e+00 8.32446705e-01 5.69005463e+00 3.74421577e+00 8.47728111e-01 5.94337009e+00 3.32579295e+00 8.49502618e-01 + 3.29955954e+00 5.49655452e+00 1.41755307e+00 3.02639965e+00 5.16008672e+00 1.74225951e+00 2.71726342e+00 4.76227833e+00 1.94081239e+00 + 2.71726342e+00 4.76227833e+00 1.94081239e+00 2.28278593e+00 4.85630300e+00 1.46501009e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 2.71726342e+00 4.76227833e+00 1.94081239e+00 3.01389498e+00 4.12600887e+00 1.47240274e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 2.71726342e+00 4.76227833e+00 1.94081239e+00 2.51461828e+00 4.21637828e+00 1.29213386e+00 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 2.71726342e+00 4.76227833e+00 1.94081239e+00 2.98215220e+00 4.61399676e+00 1.20836013e+00 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 2.51312670e+00 5.79940159e+00 1.50208175e+00 2.62760885e+00 5.30590702e+00 1.77537475e+00 2.71726342e+00 4.76227833e+00 1.94081239e+00 + 6.36742397e+00 2.90790509e+00 -4.89858720e-16 6.21822391e+00 3.10882837e+00 -4.35277151e-01 5.97819314e+00 3.26434043e+00 -8.47910322e-01 + 5.97819314e+00 3.26434043e+00 -8.47910322e-01 5.43677190e+00 3.12381865e+00 -6.74683553e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 5.97819314e+00 3.26434043e+00 -8.47910322e-01 5.96729954e+00 2.98891895e+00 -1.09440300e+00 5.92163036e+00 2.69607897e+00 -1.31546814e+00 + 6.39713060e+00 2.40233486e+00 -7.99297168e-01 6.20049452e+00 2.83921373e+00 -8.30042010e-01 5.97819314e+00 3.26434043e+00 -8.47910322e-01 + 5.88877473e+00 3.78448572e+00 -4.89858720e-16 5.97713850e+00 3.55034333e+00 -4.35277151e-01 5.97819314e+00 3.26434043e+00 -8.47910322e-01 + 5.45258967e+00 4.09839280e+00 -8.26773302e-01 5.72775733e+00 3.68933169e+00 -8.44190463e-01 5.97819314e+00 3.26434043e+00 -8.47910322e-01 + 4.19318871e+00 3.34729677e+00 -1.96634244e+00 4.18847485e+00 2.80753813e+00 -1.48716958e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 3.95853998e+00 3.80230080e+00 -1.30483796e+00 4.19318871e+00 3.34729677e+00 -1.96634244e+00 + 4.19318871e+00 3.34729677e+00 -1.96634244e+00 3.84426372e+00 3.23053018e+00 -1.49617594e+00 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 4.19318871e+00 3.34729677e+00 -1.96634244e+00 4.54637995e+00 3.16311903e+00 -1.24986225e+00 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 4.76414707e+00 4.09287863e+00 -1.53606293e+00 4.50004986e+00 3.73784807e+00 -1.81040849e+00 4.19318871e+00 3.34729677e+00 -1.96634244e+00 + 3.25199430e+00 3.46915743e+00 -1.98494345e+00 3.72301021e+00 3.40861044e+00 -1.99943073e+00 4.19318871e+00 3.34729677e+00 -1.96634244e+00 + 5.50478521e+00 0.00000000e+00 8.72934590e-02 5.29947725e+00 0.00000000e+00 -2.44998682e-01 5.09416930e+00 0.00000000e+00 -5.77290822e-01 + 5.50478521e+00 0.00000000e+00 8.72934590e-02 5.13680406e+00 0.00000000e+00 6.49883716e-02 4.76882291e+00 0.00000000e+00 4.26832841e-02 + 5.50478521e+00 0.00000000e+00 8.72934590e-02 5.47428899e+00 5.34457797e-01 -3.53579577e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 5.50478521e+00 0.00000000e+00 8.72934590e-02 5.53296116e+00 5.57569236e-01 3.19527906e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 6.29429108e+00 0.00000000e+00 2.92477739e-02 5.89953815e+00 0.00000000e+00 5.82706165e-02 5.50478521e+00 0.00000000e+00 8.72934590e-02 + 4.07707079e+00 5.46855113e+00 8.26773302e-01 3.67822598e+00 5.73509792e+00 8.43824359e-01 3.26434043e+00 5.97819314e+00 8.47910322e-01 + 4.07707079e+00 5.46855113e+00 8.26773302e-01 4.14605682e+00 4.76392877e+00 7.15623311e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 4.07707079e+00 5.46855113e+00 8.26773302e-01 3.66499812e+00 4.96657076e+00 6.39554245e-01 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 4.07707079e+00 5.46855113e+00 8.26773302e-01 3.95820253e+00 5.71828186e+00 4.23835113e-01 3.78448572e+00 5.88877473e+00 -4.89858720e-16 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 4.36105148e+00 5.41729049e+00 4.23937374e-01 4.07707079e+00 5.46855113e+00 8.26773302e-01 + 4.07707079e+00 5.46855113e+00 8.26773302e-01 3.70633936e+00 5.50934517e+00 1.14470162e+00 3.29955954e+00 5.49655452e+00 1.41755307e+00 + 3.07425129e+00 1.99753337e+00 -1.49031131e+00 3.62307716e+00 2.12903590e+00 -1.24397917e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 3.07425129e+00 1.99753337e+00 -1.49031131e+00 3.28427191e+00 2.55582886e+00 -1.25996893e+00 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 3.07425129e+00 1.99753337e+00 -1.49031131e+00 3.34427644e+00 2.01360282e+00 -7.70804108e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 3.07425129e+00 1.99753337e+00 -1.49031131e+00 2.69001231e+00 2.11920357e+00 -1.23198824e+00 2.32657264e+00 2.25725956e+00 -9.52959980e-01 + 2.51312670e+00 5.79940159e+00 1.50208175e+00 2.90956382e+00 5.65423694e+00 1.46741830e+00 3.29955954e+00 5.49655452e+00 1.41755307e+00 + 2.51312670e+00 5.79940159e+00 1.50208175e+00 2.17837730e+00 5.37559899e+00 1.25321599e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 2.51312670e+00 5.79940159e+00 1.50208175e+00 2.29715648e+00 5.76945737e+00 8.30098584e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 2.51312670e+00 5.79940159e+00 1.50208175e+00 2.90549685e+00 5.92296999e+00 1.20368028e+00 3.26434043e+00 5.97819314e+00 8.47910322e-01 + 5.09416930e+00 0.00000000e+00 -5.77290822e-01 4.62158720e+00 5.53390418e-01 -6.36112207e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 5.43450550e+00 1.06264940e+00 -7.98648778e-01 5.26674899e+00 5.34315818e-01 -6.89677751e-01 5.09416930e+00 0.00000000e+00 -5.77290822e-01 + 4.76882291e+00 0.00000000e+00 4.26832841e-02 4.93149611e+00 0.00000000e+00 -2.67303769e-01 5.09416930e+00 0.00000000e+00 -5.77290822e-01 + 4.09839280e+00 5.45258967e+00 -8.26773302e-01 3.90953538e+00 4.85722258e+00 -7.17297171e-01 3.70930390e+00 4.24678754e+00 -5.94643898e-01 + 4.09839280e+00 5.45258967e+00 -8.26773302e-01 3.51700756e+00 5.24756826e+00 -6.49904642e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 4.37149675e+00 5.40889369e+00 -4.23835113e-01 4.09839280e+00 5.45258967e+00 -8.26773302e-01 + 3.78448572e+00 5.88877473e+00 -4.89858720e-16 3.96920198e+00 5.71062535e+00 -4.23937374e-01 4.09839280e+00 5.45258967e+00 -8.26773302e-01 + 4.09839280e+00 5.45258967e+00 -8.26773302e-01 4.47300064e+00 5.14747996e+00 -8.30521181e-01 4.82901422e+00 4.82097219e+00 -8.21328667e-01 + 2.85345437e+00 4.35227192e+00 -1.98954064e+00 3.05257539e+00 3.91052387e+00 -1.99961753e+00 3.25199430e+00 3.46915743e+00 -1.98494345e+00 + 3.25199430e+00 3.46915743e+00 -1.98494345e+00 3.37096225e+00 3.29069990e+00 -1.50547980e+00 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 3.25199430e+00 3.46915743e+00 -1.98494345e+00 3.48486138e+00 3.86135389e+00 -1.31208214e+00 3.70930390e+00 4.24678754e+00 -5.94643898e-01 + 3.25199430e+00 3.46915743e+00 -1.98494345e+00 2.96972247e+00 3.58437720e+00 -1.29912437e+00 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 2.35347470e+00 3.57273676e+00 -1.86522242e+00 2.80099578e+00 3.51876281e+00 -1.93583761e+00 3.25199430e+00 3.46915743e+00 -1.98494345e+00 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 4.02133650e+00 2.84233751e+00 1.99857186e+00 3.93477797e+00 2.33712352e+00 1.95465416e+00 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 3.71392744e+00 3.41685174e+00 1.48320225e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 4.15728917e+00 3.69401159e+00 1.30113915e+00 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 4.40622368e+00 3.02150505e+00 1.34619966e+00 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 3.93477797e+00 2.33712352e+00 1.95465416e+00 4.30620014e+00 2.02915100e+00 1.98558855e+00 4.67943156e+00 1.72203103e+00 1.99995258e+00 + 3.93477797e+00 2.33712352e+00 1.95465416e+00 4.31691240e+00 2.51456957e+00 1.33289746e+00 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 3.93477797e+00 2.33712352e+00 1.95465416e+00 3.44187793e+00 2.13484724e+00 1.76007796e+00 3.01195346e+00 1.97163196e+00 1.42817625e+00 + 3.93477797e+00 2.33712352e+00 1.95465416e+00 3.63052897e+00 2.91231801e+00 1.47027069e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 3.93477797e+00 2.33712352e+00 1.95465416e+00 3.79401805e+00 1.96779589e+00 1.86356541e+00 3.66669029e+00 1.60543495e+00 1.73363787e+00 + 5.41262889e+00 4.14677334e+00 8.32446705e-01 5.17219920e+00 3.57340883e+00 1.77315440e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 5.41262889e+00 4.14677334e+00 8.32446705e-01 5.06929742e+00 3.42689884e+00 7.78371314e-01 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 5.41262889e+00 4.14677334e+00 8.32446705e-01 4.80967266e+00 4.09422585e+00 7.14216562e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 5.29024702e+00 4.58402514e+00 -4.89858720e-16 5.38850143e+00 4.39563351e+00 4.26667781e-01 5.41262889e+00 4.14677334e+00 8.32446705e-01 + 5.88877473e+00 3.78448572e+00 -4.89858720e-16 5.69199782e+00 3.99461083e+00 4.27255715e-01 5.41262889e+00 4.14677334e+00 8.32446705e-01 + 6.44939283e-16 5.80909663e+00 -7.28682117e-01 6.03521848e-01 5.53756924e+00 -7.64583249e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 6.98806688e-16 6.29429108e+00 2.92477739e-02 6.71872986e-16 6.05169386e+00 -3.49717172e-01 6.44939283e-16 5.80909663e+00 -7.28682117e-01 + 6.91202058e-01 6.84908918e+00 -6.71566734e-01 3.48601264e-01 6.33902941e+00 -7.08130403e-01 6.44939283e-16 5.80909663e+00 -7.28682117e-01 + 5.88877473e+00 3.78448572e+00 -4.89858720e-16 6.14375293e+00 3.35474291e+00 -4.89858720e-16 6.36742397e+00 2.90790509e+00 -4.89858720e-16 + 5.45258967e+00 4.09839280e+00 -8.26773302e-01 5.71062535e+00 3.96920198e+00 -4.23937374e-01 5.88877473e+00 3.78448572e+00 -4.89858720e-16 + 5.88877473e+00 3.78448572e+00 -4.89858720e-16 5.06882053e+00 3.92902580e+00 3.00175591e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 4.88089306e+00 2.97077601e+00 -4.90278395e-01 5.39664344e+00 3.38033943e+00 -2.49048530e-01 5.88877473e+00 3.78448572e+00 -4.89858720e-16 + 5.29024702e+00 4.58402514e+00 -4.89858720e-16 5.60378869e+00 4.19494367e+00 -4.89858720e-16 5.88877473e+00 3.78448572e+00 -4.89858720e-16 + 2.31584155e+00 3.67268462e+00 5.81567251e-01 2.81781224e+00 3.58045547e+00 7.76455373e-01 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 2.31584155e+00 3.67268462e+00 5.81567251e-01 1.63970805e+00 3.87548621e+00 9.07722360e-03 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 2.50218519e+00 3.68694245e+00 -1.94569836e-03 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 1.61330264e+00 2.59455891e+00 -4.66799866e-01 1.96442096e+00 3.11939315e+00 6.09233859e-02 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 1.96316234e+00 4.67346532e+00 -1.68911610e-02 2.14092151e+00 4.17437789e+00 2.86088435e-01 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 1.61330264e+00 2.59455891e+00 -4.66799866e-01 1.28496053e+00 3.32953539e+00 -5.18956758e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 2.14523294e+00 3.14624858e+00 -5.31204749e-01 1.61330264e+00 2.59455891e+00 -4.66799866e-01 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 3.24947853e+00 3.48400133e+00 -2.93071909e-01 3.81137977e+00 3.26482023e+00 2.43818043e-03 + 3.81137977e+00 3.26482023e+00 2.43818043e-03 3.56753721e+00 3.37608613e+00 4.83982081e-01 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 3.81137977e+00 3.26482023e+00 2.43818043e-03 3.72548696e+00 2.65397545e+00 -1.65008728e-02 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 3.81137977e+00 3.26482023e+00 2.43818043e-03 4.25331317e+00 2.97806657e+00 3.48065288e-01 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 3.81137977e+00 3.26482023e+00 2.43818043e-03 4.00637005e+00 3.65067634e+00 2.97870688e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 3.76206809e+00 3.75602298e+00 -2.99393832e-01 3.81137977e+00 3.26482023e+00 2.43818043e-03 + 4.88089306e+00 2.97077601e+00 -4.90278395e-01 4.34885095e+00 3.12076826e+00 -2.43784280e-01 3.81137977e+00 3.26482023e+00 2.43818043e-03 + 2.85345437e+00 4.35227192e+00 -1.98954064e+00 3.28327070e+00 4.30695841e+00 -1.30701088e+00 3.70930390e+00 4.24678754e+00 -5.94643898e-01 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 3.19994510e+00 3.97542308e+00 -5.92917504e-01 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 3.95712172e+00 4.14464082e+00 -5.94995836e-04 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 4.30076154e+00 3.61082443e+00 -5.46638503e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 5.45258967e+00 4.09839280e+00 -8.26773302e-01 4.59422308e+00 4.18246761e+00 -7.22812625e-01 3.70930390e+00 4.24678754e+00 -5.94643898e-01 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 3.31812061e+00 4.63672338e+00 -5.29009515e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 4.19489205e+00 4.03465652e+00 5.92789158e-01 3.75957543e+00 3.76261087e+00 7.80576629e-01 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 4.69391929e+00 2.68789105e+00 6.89739971e-01 4.45015680e+00 3.36360434e+00 6.45894132e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 4.88089306e+00 2.97077601e+00 -4.90278395e-01 4.55171623e+00 3.51148653e+00 5.31837698e-02 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 5.45258967e+00 4.09839280e+00 -8.26773302e-01 4.84926860e+00 4.08722344e+00 -1.21068164e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 5.29024702e+00 4.58402514e+00 -4.89858720e-16 4.75162087e+00 4.32152416e+00 3.01182905e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 4.88089306e+00 2.97077601e+00 -4.90278395e-01 5.11091116e+00 3.79254677e+00 -2.49228323e-01 5.29024702e+00 4.58402514e+00 -4.89858720e-16 + 5.45258967e+00 4.09839280e+00 -8.26773302e-01 5.17657680e+00 3.53700396e+00 -6.66157889e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 5.45258967e+00 4.09839280e+00 -8.26773302e-01 5.40889369e+00 4.37149675e+00 -4.23835113e-01 5.29024702e+00 4.58402514e+00 -4.89858720e-16 + 5.48202315e+00 2.40466127e+00 -1.73992713e+00 5.18705823e+00 2.69144979e+00 -1.12452739e+00 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 5.48202315e+00 2.40466127e+00 -1.73992713e+00 5.16451934e+00 2.09946233e+00 -9.77183441e-01 4.83769328e+00 1.79640676e+00 -1.84951288e-01 + 5.48202315e+00 2.40466127e+00 -1.73992713e+00 5.71825671e+00 2.55771908e+00 -1.54976160e+00 5.92163036e+00 2.69607897e+00 -1.31546814e+00 + 5.48202315e+00 2.40466127e+00 -1.73992713e+00 5.47600409e+00 1.73024657e+00 -1.30081520e+00 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 1.47742668e+00 6.66084957e+00 -8.23188188e-01 1.08617480e+00 6.76655937e+00 -7.52141650e-01 6.91202058e-01 6.84908918e+00 -6.71566734e-01 + 1.47742668e+00 6.66084957e+00 -8.23188188e-01 1.34222378e+00 5.96381560e+00 -8.16246887e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 1.47742668e+00 6.66084957e+00 -8.23188188e-01 1.30560955e+00 6.13126864e+00 -1.39414098e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 1.47742668e+00 6.66084957e+00 -8.23188188e-01 1.24550253e+00 6.84252576e+00 -4.22067230e-01 9.96203868e-01 6.92875009e+00 -4.89858720e-16 + 4.67943156e+00 1.72203103e+00 1.99995258e+00 4.15711215e+00 1.65737447e+00 1.92995048e+00 3.66669029e+00 1.60543495e+00 1.73363787e+00 + 4.67943156e+00 1.72203103e+00 1.99995258e+00 4.74883311e+00 1.27322124e+00 1.51629558e+00 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 4.69391929e+00 2.68789105e+00 6.89739971e-01 4.68811291e+00 2.20403757e+00 1.35373689e+00 4.67943156e+00 1.72203103e+00 1.99995258e+00 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 4.41591747e+00 1.38846761e+00 1.24321152e+00 4.67943156e+00 1.72203103e+00 1.99995258e+00 + 4.67943156e+00 1.72203103e+00 1.99995258e+00 5.13279861e+00 1.91050308e+00 1.94232726e+00 5.55889845e+00 2.08882586e+00 1.76618606e+00 + 5.55517653e+00 1.10950218e+00 5.53521335e-01 5.50023695e+00 1.08643914e+00 -1.22783344e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 5.13781513e+00 1.43024678e+00 -4.93708939e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 6.71645082e+00 1.97212790e+00 -4.89858720e-16 6.09570033e+00 1.52042695e+00 -3.99124513e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 6.39713060e+00 2.40233486e+00 -7.99297168e-01 5.93140618e+00 1.73509732e+00 -8.08814382e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 4.80301419e+00 1.06082134e+00 -1.75026309e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 4.82274819e+00 8.19003004e-01 1.02744998e+00 5.13487879e+00 9.43148532e-01 1.17206995e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 6.71645082e+00 1.97212790e+00 -4.89858720e-16 6.15013616e+00 1.54463553e+00 2.80697318e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 6.71645082e+00 1.97212790e+00 -4.89858720e-16 6.58076878e+00 2.19999601e+00 4.91099763e-01 6.32434990e+00 2.38750096e+00 9.49952515e-01 + 6.36742397e+00 2.90790509e+00 -4.89858720e-16 6.55864807e+00 2.44624926e+00 -4.89858720e-16 6.71645082e+00 1.97212790e+00 -4.89858720e-16 + 6.71645082e+00 1.97212790e+00 -4.89858720e-16 5.79085343e+00 1.89063247e+00 -9.24826462e-02 4.83769328e+00 1.79640676e+00 -1.84951288e-01 + 6.71645082e+00 1.97212790e+00 -4.89858720e-16 6.60015123e+00 2.20169570e+00 -4.09202918e-01 6.39713060e+00 2.40233486e+00 -7.99297168e-01 + 6.36742397e+00 2.90790509e+00 -4.89858720e-16 6.42399198e+00 2.67247390e+00 -4.09089625e-01 6.39713060e+00 2.40233486e+00 -7.99297168e-01 + 6.39713060e+00 2.40233486e+00 -7.99297168e-01 5.65237533e+00 2.69208768e+00 -6.47749668e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 6.39713060e+00 2.40233486e+00 -7.99297168e-01 5.62248166e+00 2.09903430e+00 -4.95182292e-01 4.83769328e+00 1.79640676e+00 -1.84951288e-01 + 5.92163036e+00 2.69607897e+00 -1.31546814e+00 5.40783205e+00 2.84052531e+00 -9.08450474e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 5.92163036e+00 2.69607897e+00 -1.31546814e+00 5.38746575e+00 2.24793734e+00 -7.59714741e-01 4.83769328e+00 1.79640676e+00 -1.84951288e-01 + 6.39713060e+00 2.40233486e+00 -7.99297168e-01 6.18022633e+00 2.55783447e+00 -1.07170099e+00 5.92163036e+00 2.69607897e+00 -1.31546814e+00 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 4.86162553e+00 2.38290792e+00 -3.37446246e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 6.36742397e+00 2.90790509e+00 -4.89858720e-16 5.63761053e+00 2.94617949e+00 -2.46762016e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 4.69391929e+00 2.68789105e+00 6.89739971e-01 4.79152320e+00 2.83334931e+00 1.00623332e-01 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 4.69391929e+00 2.68789105e+00 6.89739971e-01 5.54961943e+00 2.80990568e+00 3.49664678e-01 6.36742397e+00 2.90790509e+00 -4.89858720e-16 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 5.61766474e+00 2.35708231e+00 -9.11018113e-02 6.36742397e+00 2.90790509e+00 -4.89858720e-16 + 4.69391929e+00 2.68789105e+00 6.89739971e-01 4.75840809e+00 1.75350759e+00 8.66601475e-01 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 5.55517653e+00 1.10950218e+00 5.53521335e-01 5.18932414e+00 9.64221405e-01 7.90687705e-01 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 5.29445700e-16 4.76882291e+00 4.26832841e-02 5.07185448e-16 4.56832039e+00 4.79278610e-01 4.84925196e-16 4.36781787e+00 9.15873936e-01 + 4.84925196e-16 4.36781787e+00 9.15873936e-01 4.58241667e-16 4.12747401e+00 4.57936968e-01 4.31558139e-16 3.88713014e+00 6.66829671e-16 + 5.70006409e-16 5.13416130e+00 7.65775070e-01 5.27465803e-16 4.75098959e+00 8.40824503e-01 4.84925196e-16 4.36781787e+00 9.15873936e-01 + 3.33327135e+00 1.26368365e+00 -1.39288137e+00 3.63790578e+00 1.46519397e+00 -1.68453548e+00 3.99545782e+00 1.68801727e+00 -1.88705283e+00 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 3.09064609e+00 3.40985302e+00 -8.03097961e-01 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 3.99545782e+00 1.68801727e+00 -1.88705283e+00 3.52095796e+00 1.83553080e+00 -1.71479012e+00 3.07425129e+00 1.99753337e+00 -1.49031131e+00 + 2.40016886e+00 6.39010822e+00 -8.15916232e-01 2.84606761e+00 6.19577864e+00 -8.33168300e-01 3.27995423e+00 5.97529909e+00 -8.37233641e-01 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 4.50125587e+00 1.42612809e+00 1.31520763e-01 4.16416613e+00 1.05434548e+00 4.43323150e-01 + 3.27995423e+00 5.97529909e+00 -8.37233641e-01 3.55745105e+00 5.97441017e+00 -4.29459421e-01 3.78448572e+00 5.88877473e+00 -4.89858720e-16 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 4.15767315e+00 4.77928794e+00 -3.00479340e-01 3.70930390e+00 4.24678754e+00 -5.94643898e-01 + 3.27995423e+00 5.97529909e+00 -8.37233641e-01 3.69692239e+00 5.72594616e+00 -8.38601610e-01 4.09839280e+00 5.45258967e+00 -8.26773302e-01 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 4.23782080e+00 1.92096763e+00 -1.10108852e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 3.36631027e+00 5.23557164e+00 -1.58139969e+00 3.34721220e+00 5.64605326e+00 -1.24697240e+00 3.27995423e+00 5.97529909e+00 -8.37233641e-01 + 2.38239817e+00 2.71913079e+00 1.44300412e+00 2.85161401e+00 3.10044027e+00 1.21631869e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 2.38239817e+00 2.71913079e+00 1.44300412e+00 2.77333146e+00 2.82117113e+00 1.70592484e+00 3.19684636e+00 2.95635512e+00 1.89289769e+00 + 1.60546045e+00 5.28911299e+00 -1.92920779e+00 1.40524961e+00 5.27620279e+00 -1.36674026e+00 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 1.63966782e+00 2.61990395e+00 5.95450771e-01 1.98336361e+00 2.63278804e+00 1.04750018e+00 2.38239817e+00 2.71913079e+00 1.44300412e+00 + 2.38239817e+00 2.71913079e+00 1.44300412e+00 2.34661504e+00 3.18805903e+00 1.01697142e+00 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 2.45654560e+00 3.56782772e+00 1.88505561e+00 2.40618749e+00 3.12621961e+00 1.69910709e+00 2.38239817e+00 2.71913079e+00 1.44300412e+00 + 1.61933596e+00 3.29871374e+00 1.49789952e+00 2.00887133e+00 3.02095914e+00 1.45512175e+00 2.38239817e+00 2.71913079e+00 1.44300412e+00 + 9.96203868e-01 6.92875009e+00 -4.89858720e-16 1.23102285e+00 6.84220032e+00 4.35277151e-01 1.44786006e+00 6.65570529e+00 8.47910322e-01 + 1.20153714e+00 5.25120069e+00 -7.90659956e-01 1.08117227e+00 4.66061152e+00 -6.79563598e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 1.44786006e+00 6.65570529e+00 8.47910322e-01 1.09854917e+00 6.58558340e+00 1.09044940e+00 7.42174170e-01 6.47311362e+00 1.30506479e+00 + 1.44786006e+00 6.65570529e+00 8.47910322e-01 1.72257496e+00 6.73526970e+00 4.35277151e-01 1.97212790e+00 6.71645082e+00 -4.89858720e-16 + 4.90549429e+00 8.32101447e-01 1.99985075e+00 5.32718019e+00 7.93184921e-01 1.96241586e+00 5.73252083e+00 7.51834686e-01 1.84094565e+00 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 3.48020000e+00 4.35346685e+00 -7.24176175e-02 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 3.27995423e+00 5.97529909e+00 -8.37233641e-01 3.10863720e+00 5.50447604e+00 -6.52379815e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 4.49150870e+00 9.35715856e-01 7.39442341e-01 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 4.90549429e+00 8.32101447e-01 1.99985075e+00 5.13206938e+00 1.10190189e+00 1.98443536e+00 5.35379131e+00 1.37066032e+00 1.92946545e+00 + 4.67943156e+00 1.72203103e+00 1.99995258e+00 4.79246891e+00 1.27706783e+00 1.99959401e+00 4.90549429e+00 8.32101447e-01 1.99985075e+00 + 3.99134937e+00 8.13497743e-01 1.77240692e+00 4.43525595e+00 8.20364376e-01 1.93916916e+00 4.90549429e+00 8.32101447e-01 1.99985075e+00 + 4.84235469e+00 0.00000000e+00 1.41969404e+00 4.98825800e+00 0.00000000e+00 1.09273456e+00 5.13416130e+00 0.00000000e+00 7.65775070e-01 + 4.84235469e+00 0.00000000e+00 1.41969404e+00 4.42029102e+00 4.11677070e-01 1.60825013e+00 3.99134937e+00 8.13497743e-01 1.77240692e+00 + 2.31584155e+00 3.67268462e+00 5.81567251e-01 2.78029052e+00 4.06240301e+00 5.20552107e-01 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 4.84235469e+00 0.00000000e+00 1.41969404e+00 4.60508628e+00 0.00000000e+00 1.16778399e+00 4.36781787e+00 0.00000000e+00 9.15873936e-01 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 3.28415594e+00 3.97021875e+00 7.10621830e-01 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 4.57236485e+00 2.45689195e+00 -1.99089249e+00 4.79485801e+00 2.05624541e+00 -1.98817490e+00 5.01679319e+00 1.65535959e+00 -1.97989896e+00 + 1.76701972e+00 4.45263593e+00 -1.98899096e+00 2.05892734e+00 4.01011567e+00 -1.93848744e+00 2.35347470e+00 3.57273676e+00 -1.86522242e+00 + 3.99545782e+00 1.68801727e+00 -1.88705283e+00 4.27879104e+00 2.06997753e+00 -1.98471336e+00 4.57236485e+00 2.45689195e+00 -1.99089249e+00 + 1.44786006e+00 6.65570529e+00 8.47910322e-01 1.91370388e+00 6.53850637e+00 8.44827634e-01 2.37171589e+00 6.39454874e+00 8.28751343e-01 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 3.52651384e+00 5.18730202e+00 2.26284934e-01 3.78448572e+00 5.88877473e+00 -4.89858720e-16 + 2.90790509e+00 6.36742397e+00 -4.89858720e-16 2.65848377e+00 6.42612367e+00 4.24998312e-01 2.37171589e+00 6.39454874e+00 8.28751343e-01 + 3.63985639e+00 2.04297305e+00 -3.66114706e-02 3.56734194e+00 2.58019033e+00 -5.27832973e-01 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 1.97212790e+00 6.71645082e+00 -4.89858720e-16 2.18714904e+00 6.60145978e+00 4.24902179e-01 2.37171589e+00 6.39454874e+00 8.28751343e-01 + 3.99545782e+00 1.68801727e+00 -1.88705283e+00 3.91590724e+00 1.23744826e+00 -1.78945539e+00 3.84030955e+00 7.88128395e-01 -1.68355288e+00 + 1.20153714e+00 5.25120069e+00 -7.90659956e-01 1.12586091e+00 4.70582416e+00 -1.59711116e-01 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 3.84030955e+00 7.88128395e-01 -1.68355288e+00 3.58333259e+00 1.02491699e+00 -1.54257535e+00 3.33327135e+00 1.26368365e+00 -1.39288137e+00 + 4.81523801e-16 4.33718082e+00 -8.53060355e-01 4.45950625e-16 4.01676614e+00 -7.58772303e-01 4.10377450e-16 3.69635146e+00 -6.64484250e-01 + 6.92875009e+00 9.96203868e-01 -4.89858720e-16 6.84309367e+00 1.25114646e+00 -4.14720997e-01 6.66455249e+00 1.48910661e+00 -8.09427054e-01 + 4.10377450e-16 3.69635146e+00 -6.64484250e-01 4.64529591e-01 3.43731805e+00 -8.60182699e-01 9.28539289e-01 3.17060607e+00 -1.05963208e+00 + 1.54860554e+00 3.54808542e+00 -1.65108235e+00 1.94961142e+00 3.55780388e+00 -1.76371263e+00 2.35347470e+00 3.57273676e+00 -1.86522242e+00 + 6.66455249e+00 1.48910661e+00 -8.09427054e-01 6.58890709e+00 1.15497452e+00 -1.07052840e+00 6.46725517e+00 8.12777923e-01 -1.30203159e+00 + 5.29445700e-16 4.76882291e+00 4.26832841e-02 5.64160752e-01 5.16183028e+00 2.97263159e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 7.02329418e-01 6.84062448e+00 6.91687670e-01 1.07678734e+00 6.75878903e+00 7.74316392e-01 1.44786006e+00 6.65570529e+00 8.47910322e-01 + 2.85345437e+00 4.35227192e+00 -1.98954064e+00 2.65403979e+00 4.78707088e+00 -1.94312401e+00 2.44916181e+00 5.21201554e+00 -1.85047539e+00 + 6.11057364e+00 1.81915532e+00 -1.45178853e+00 6.30184527e+00 1.31867243e+00 -1.38967405e+00 6.46725517e+00 8.12777923e-01 -1.30203159e+00 + 2.19969685e+00 2.04087676e+00 -5.06174164e-02 2.24376450e+00 2.04742624e+00 3.85501302e-01 2.35711984e+00 2.11720046e+00 8.03194791e-01 + 2.35711984e+00 2.11720046e+00 8.03194791e-01 2.55763470e+00 1.77415970e+00 6.61998609e-01 2.72919104e+00 1.41103122e+00 5.33164898e-01 + 1.63966782e+00 2.61990395e+00 5.95450771e-01 2.01387376e+00 2.38689945e+00 6.90492101e-01 2.35711984e+00 2.11720046e+00 8.03194791e-01 + 9.34999077e-01 5.73790834e+00 1.82703946e+00 1.32452419e+00 5.95745359e+00 1.66840348e+00 1.70602213e+00 6.14089415e+00 1.45381775e+00 + 9.96203868e-01 6.92875009e+00 -4.89858720e-16 1.53602601e+00 6.33911573e+00 7.06277655e-02 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 2.51312670e+00 5.79940159e+00 1.50208175e+00 2.11190592e+00 5.97674609e+00 1.48571515e+00 1.70602213e+00 6.14089415e+00 1.45381775e+00 + 1.84023910e+00 2.93931957e+00 -1.28551886e+00 1.69071047e+00 3.23659676e+00 -1.47708238e+00 1.54860554e+00 3.54808542e+00 -1.65108235e+00 + 1.70602213e+00 6.14089415e+00 1.45381775e+00 2.04942242e+00 6.30016385e+00 1.16575703e+00 2.37171589e+00 6.39454874e+00 8.28751343e-01 + 5.55889845e+00 2.08882586e+00 1.76618606e+00 5.99812393e+00 2.25944643e+00 1.41884183e+00 6.32434990e+00 2.38750096e+00 9.49952515e-01 + 1.70602213e+00 6.14089415e+00 1.45381775e+00 1.22641385e+00 6.31893524e+00 1.39120921e+00 7.42174170e-01 6.47311362e+00 1.30506479e+00 + 5.29445700e-16 4.76882291e+00 4.26832841e-02 4.83788529e-01 4.42607932e+00 -2.61324913e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 3.39519120e-16 3.05811637e+00 4.78631329e-01 4.14361862e-01 3.10208843e+00 7.08346368e-01 8.26534753e-01 3.12967293e+00 9.44322863e-01 + 3.29955954e+00 5.49655452e+00 1.41755307e+00 2.57424152e+00 5.23061999e+00 1.21534778e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 9.34999077e-01 5.73790834e+00 1.82703946e+00 4.68088615e-01 5.49640793e+00 1.93220869e+00 5.81876032e-16 5.24107336e+00 1.98541775e+00 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 3.72162697e+00 4.24597673e+00 5.22669163e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 3.84030955e+00 7.88128395e-01 -1.68355288e+00 3.66734572e+00 3.93602876e-01 -1.50987562e+00 3.50297850e+00 0.00000000e+00 -1.32624532e+00 + 1.12146756e+00 5.55164805e+00 5.56236736e-01 1.59668896e+00 5.63493560e+00 3.46044323e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 3.17077126e+00 6.77896230e-01 -9.54430520e-01 3.33882363e+00 3.39146062e-01 -1.13898085e+00 3.50297850e+00 0.00000000e+00 -1.32624532e+00 + 3.26434043e+00 5.97819314e+00 8.47910322e-01 3.29480837e+00 5.75985236e+00 1.15095430e+00 3.29955954e+00 5.49655452e+00 1.41755307e+00 + 3.50297850e+00 0.00000000e+00 -1.32624532e+00 3.59966498e+00 0.00000000e+00 -9.95364783e-01 3.69635146e+00 0.00000000e+00 -6.64484250e-01 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 3.27326150e+00 4.97960029e+00 9.36585053e-01 3.29955954e+00 5.49655452e+00 1.41755307e+00 + 4.33718082e+00 0.00000000e+00 -8.53060355e-01 3.92007966e+00 0.00000000e+00 -1.08965284e+00 3.50297850e+00 0.00000000e+00 -1.32624532e+00 + 6.92875009e+00 9.96203868e-01 -4.89858720e-16 6.19876230e+00 1.03265435e+00 -3.99584620e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 6.44939283e-16 5.80909663e+00 -7.28682117e-01 4.18781960e-01 5.76714418e+00 -1.30046544e+00 8.28226845e-01 5.70140723e+00 -1.84945887e+00 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 2.26115061e+00 3.32008308e+00 -9.39951305e-01 1.84023910e+00 2.93931957e+00 -1.28551886e+00 + 5.71921026e-16 5.15140664e+00 -1.27674188e+00 4.13163969e-01 5.43191131e+00 -1.57995397e+00 8.28226845e-01 5.70140723e+00 -1.84945887e+00 + 6.71645082e+00 1.97212790e+00 -4.89858720e-16 6.73492452e+00 1.74210802e+00 -4.14432589e-01 6.66455249e+00 1.48910661e+00 -8.09427054e-01 + 8.28226845e-01 5.70140723e+00 -1.84945887e+00 1.01398179e+00 5.48013874e+00 -1.32628023e+00 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 6.39713060e+00 2.40233486e+00 -7.99297168e-01 6.54414566e+00 1.94968440e+00 -8.10515886e-01 6.66455249e+00 1.48910661e+00 -8.09427054e-01 + 7.42174170e-01 6.47311362e+00 -1.30506479e+00 7.89334488e-01 6.11930908e+00 -1.62206117e+00 8.28226845e-01 5.70140723e+00 -1.84945887e+00 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 3.92628536e+00 4.88647845e+00 2.27804251e-01 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 8.28226845e-01 5.70140723e+00 -1.84945887e+00 8.73921099e-01 5.27945775e+00 -1.96890535e+00 9.17002933e-01 4.84172634e+00 -1.99869635e+00 + 6.11153928e-16 5.50478521e+00 8.72934590e-02 5.64487630e-01 5.53211693e+00 3.19941028e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 1.60546045e+00 5.28911299e+00 -1.92920779e+00 1.21745167e+00 5.49800595e+00 -1.89778924e+00 8.28226845e-01 5.70140723e+00 -1.84945887e+00 + 3.26434043e+00 5.97819314e+00 8.47910322e-01 3.55034333e+00 5.97713850e+00 4.35277151e-01 3.78448572e+00 5.88877473e+00 -4.89858720e-16 + 8.28226845e-01 5.70140723e+00 -1.84945887e+00 1.31669704e+00 5.88187856e+00 -1.71590818e+00 1.79787339e+00 6.02976719e+00 -1.52659565e+00 + 6.66455249e+00 1.48910661e+00 -8.09427054e-01 6.76840622e+00 1.08979810e+00 -7.46204642e-01 6.84886319e+00 6.86722414e-01 -6.73452256e-01 + 8.67290394e-01 3.93082088e+00 -1.74644847e+00 4.33875600e-01 4.11298969e+00 -1.80365665e+00 4.76373410e-16 4.29079023e+00 -1.87003249e+00 + 6.66455249e+00 1.48910661e+00 -8.09427054e-01 6.05379605e+00 1.27647454e+00 -8.09254844e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 9.17002933e-01 4.84172634e+00 -1.99869635e+00 4.58034508e-01 4.56160780e+00 -1.95637366e+00 4.76373410e-16 4.29079023e+00 -1.87003249e+00 + 4.76414707e+00 4.09287863e+00 -1.53606293e+00 4.83611117e+00 3.53847437e+00 -1.02751967e+00 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 4.76373410e-16 4.29079023e+00 -1.87003249e+00 4.78948605e-16 4.31398552e+00 -1.36154642e+00 4.81523801e-16 4.33718082e+00 -8.53060355e-01 + 4.76414707e+00 4.09287863e+00 -1.53606293e+00 4.24185822e+00 4.17143104e+00 -1.06920024e+00 3.70930390e+00 4.24678754e+00 -5.94643898e-01 + 5.71921026e-16 5.15140664e+00 -1.27674188e+00 5.24147218e-16 4.72109843e+00 -1.57338718e+00 4.76373410e-16 4.29079023e+00 -1.87003249e+00 + 4.76373410e-16 4.29079023e+00 1.87003249e+00 4.80649303e-16 4.32930405e+00 1.39295321e+00 4.84925196e-16 4.36781787e+00 9.15873936e-01 + 4.76414707e+00 4.09287863e+00 -1.53606293e+00 4.14172881e+00 3.61445294e+00 -1.30651241e+00 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 5.37609367e-16 4.84235469e+00 1.41969404e+00 5.06991388e-16 4.56657246e+00 1.64486326e+00 4.76373410e-16 4.29079023e+00 1.87003249e+00 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 3.60393536e+00 3.68546141e+00 -8.17274364e-01 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 4.76373410e-16 4.29079023e+00 1.87003249e+00 4.09173934e-01 4.56062095e+00 1.46461908e+00 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 1.61330264e+00 2.59455891e+00 -4.66799866e-01 1.22204487e+00 2.75362076e+00 -2.24237057e-01 8.18991350e-01 2.88610338e+00 1.50447569e-02 + 8.49686589e-01 4.80418933e+00 1.99632123e+00 4.24457502e-01 4.54336028e+00 1.95170622e+00 4.76373410e-16 4.29079023e+00 1.87003249e+00 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 4.15183965e+00 1.07786529e+00 -1.21366428e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 8.30275396e-01 3.84107074e+00 1.68956565e+00 4.15150775e-01 4.06605856e+00 1.77954808e+00 4.76373410e-16 4.29079023e+00 1.87003249e+00 + 5.81876032e-16 5.24107336e+00 1.98541775e+00 5.28346993e-16 4.75892664e+00 1.98541775e+00 4.76373410e-16 4.29079023e+00 1.87003249e+00 + 3.88908739e-16 3.50297850e+00 -1.32624532e+00 4.35216270e-16 3.92007966e+00 -1.08965284e+00 4.81523801e-16 4.33718082e+00 -8.53060355e-01 + 2.92502923e+00 5.02069415e+00 -4.56159172e-01 3.08851953e+00 4.73921464e+00 -2.44848529e-03 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 3.88908739e-16 3.50297850e+00 -1.32624532e+00 3.99643094e-16 3.59966498e+00 -9.95364783e-01 4.10377450e-16 3.69635146e+00 -6.64484250e-01 + 6.92875009e+00 9.96203868e-01 -4.89858720e-16 6.25345972e+00 1.05589993e+00 2.79981804e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 3.88908739e-16 3.50297850e+00 -1.32624532e+00 4.80461516e-01 3.78911909e+00 -9.52422133e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 5.55517653e+00 1.10950218e+00 5.53521335e-01 6.12829260e+00 1.30242760e+00 -1.33995789e-01 6.66455249e+00 1.48910661e+00 -8.09427054e-01 + 3.88908739e-16 3.50297850e+00 -1.32624532e+00 4.66578894e-01 3.35338929e+00 -1.18068293e+00 9.28539289e-01 3.17060607e+00 -1.05963208e+00 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 4.94974747e+00 4.94974747e+00 -4.89858720e-16 5.29024702e+00 4.58402514e+00 -4.89858720e-16 + 3.88908739e-16 3.50297850e+00 -1.32624532e+00 4.32588810e-01 3.70784509e+00 -1.54748091e+00 8.67290394e-01 3.93082088e+00 -1.74644847e+00 + 5.29182930e+00 3.20197153e+00 -1.61103065e+00 4.95457327e+00 2.84232582e+00 -1.86898297e+00 4.57236485e+00 2.45689195e+00 -1.99089249e+00 + 4.76373410e-16 4.29079023e+00 -1.87003249e+00 4.28975800e-16 3.86387051e+00 -1.64596773e+00 3.88908739e-16 3.50297850e+00 -1.32624532e+00 + 8.30275396e-01 3.84107074e+00 1.68956565e+00 4.14690807e-01 3.66807173e+00 1.51250355e+00 3.88908739e-16 3.50297850e+00 1.32624532e+00 + 5.35379131e+00 1.37066032e+00 1.92946545e+00 5.46170527e+00 1.73144242e+00 1.86217861e+00 5.55889845e+00 2.08882586e+00 1.76618606e+00 + 3.88908739e-16 3.50297850e+00 1.32624532e+00 4.14232170e-01 3.32406784e+00 1.12994189e+00 8.26534753e-01 3.12967293e+00 9.44322863e-01 + 5.35379131e+00 1.37066032e+00 1.92946545e+00 5.46179573e+00 1.24360624e+00 1.25283253e+00 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 3.88908739e-16 3.50297850e+00 1.32624532e+00 4.00068269e-16 3.60349461e+00 1.00321648e+00 4.11227798e-16 3.70401072e+00 6.80187645e-01 + 5.35379131e+00 1.37066032e+00 1.92946545e+00 5.09044338e+00 1.09353342e+00 1.48712488e+00 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 3.88908739e-16 3.50297850e+00 1.32624532e+00 4.36916968e-16 3.93539819e+00 1.12105963e+00 4.84925196e-16 4.36781787e+00 9.15873936e-01 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 4.46918590e+00 5.30241018e-01 2.42406460e-01 4.76882291e+00 0.00000000e+00 4.26832841e-02 + 4.57236485e+00 2.45689195e+00 -1.99089249e+00 5.03937988e+00 2.43666879e+00 -1.90864330e+00 5.48202315e+00 2.40466127e+00 -1.73992713e+00 + 1.20153714e+00 5.25120069e+00 -7.90659956e-01 2.06371963e+00 5.14047107e+00 -6.26215256e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 3.88908739e-16 3.50297850e+00 1.32624532e+00 4.28975800e-16 3.86387051e+00 1.64596773e+00 4.76373410e-16 4.29079023e+00 1.87003249e+00 + 3.17077126e+00 6.77896230e-01 -9.54430520e-01 3.46043709e+00 7.23581161e-01 -1.36183374e+00 3.84030955e+00 7.88128395e-01 -1.68355288e+00 + 3.39519120e-16 3.05811637e+00 4.78631329e-01 3.58500779e-16 3.22908795e+00 9.29446344e-01 3.88908739e-16 3.50297850e+00 1.32624532e+00 + 3.50297850e+00 0.00000000e+00 1.32624532e+00 3.73400570e+00 4.05320565e-01 1.56598661e+00 3.99134937e+00 8.13497743e-01 1.77240692e+00 + 2.35347470e+00 3.57273676e+00 -1.86522242e+00 2.51983446e+00 3.63485875e+00 -1.23187943e+00 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 3.50297850e+00 0.00000000e+00 1.32624532e+00 3.93539819e+00 0.00000000e+00 1.12105963e+00 4.36781787e+00 0.00000000e+00 9.15873936e-01 + 2.44916181e+00 5.21201554e+00 -1.85047539e+00 2.02826961e+00 5.25304665e+00 -1.89784478e+00 1.60546045e+00 5.28911299e+00 -1.92920779e+00 + 3.50297850e+00 0.00000000e+00 1.32624532e+00 3.60349461e+00 0.00000000e+00 1.00321648e+00 3.70401072e+00 0.00000000e+00 6.80187645e-01 + 1.60546045e+00 5.28911299e+00 -1.92920779e+00 1.68713556e+00 4.87346113e+00 -1.99380988e+00 1.76701972e+00 4.45263593e+00 -1.98899096e+00 + 3.50297850e+00 0.00000000e+00 1.32624532e+00 3.38237259e+00 4.50764858e-01 1.21619702e+00 3.22867716e+00 8.97119914e-01 1.13171941e+00 + 3.49317869e+00 3.11807753e+00 -1.01200289e+00 2.90246033e+00 2.68715061e+00 -9.94375999e-01 2.32657264e+00 2.25725956e+00 -9.52959980e-01 + 3.27995423e+00 5.97529909e+00 -8.37233641e-01 3.11626475e+00 6.21591262e+00 -4.29576881e-01 2.90790509e+00 6.36742397e+00 -4.89858720e-16 + 6.98806688e-16 6.29429108e+00 2.92477739e-02 6.05322356e-01 5.78191462e+00 -3.80505659e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 6.81247225e-16 6.13612949e+00 -1.64596773e+00 6.26584125e-16 5.64376807e+00 -1.46135480e+00 5.71921026e-16 5.15140664e+00 -1.27674188e+00 + 4.84235469e+00 0.00000000e+00 1.41969404e+00 4.56657246e+00 0.00000000e+00 1.64486326e+00 4.29079023e+00 0.00000000e+00 1.87003249e+00 + 4.25164652e+00 4.79855501e+00 -1.41728728e+00 4.51351944e+00 4.45126191e+00 -1.48543432e+00 4.76414707e+00 4.09287863e+00 -1.53606293e+00 + 5.43450550e+00 1.06264940e+00 -7.98648778e-01 5.10280614e+00 5.34030593e-01 -3.75320690e-01 4.76882291e+00 0.00000000e+00 4.26832841e-02 + 4.67618055e+00 7.95671378e-01 -1.98346963e+00 4.33494459e+00 1.24159383e+00 -1.93885547e+00 3.99545782e+00 1.68801727e+00 -1.88705283e+00 + 2.06981752e+00 5.70808899e+00 1.34251287e-01 1.95472467e+00 5.33071138e+00 5.55876884e-01 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 5.24107336e+00 0.00000000e+00 1.98541775e+00 4.75892664e+00 0.00000000e+00 1.98541775e+00 4.29079023e+00 0.00000000e+00 1.87003249e+00 + 1.61330264e+00 2.59455891e+00 -4.66799866e-01 2.22866953e+00 2.71844081e+00 -1.31450201e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 3.05811637e+00 0.00000000e+00 -4.78631329e-01 3.11438049e+00 3.38941223e-01 -7.16555369e-01 3.17077126e+00 6.77896230e-01 -9.54430520e-01 + 1.70602213e+00 6.14089415e+00 1.45381775e+00 1.89284838e+00 5.93732864e+00 8.03394579e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 2.44916181e+00 5.21201554e+00 -1.85047539e+00 2.56350563e+00 5.55011457e+00 -1.66133551e+00 2.65894205e+00 5.84727816e+00 -1.40492233e+00 + 4.29079023e+00 0.00000000e+00 1.87003249e+00 3.86387051e+00 0.00000000e+00 1.64596773e+00 3.50297850e+00 0.00000000e+00 1.32624532e+00 + 4.29079023e+00 0.00000000e+00 -1.87003249e+00 4.48106189e+00 3.97620644e-01 -1.93614738e+00 4.67618055e+00 7.95671378e-01 -1.98346963e+00 + 3.69635146e+00 0.00000000e+00 -6.64484250e-01 3.76280678e+00 4.00699914e-01 -1.18048981e+00 3.84030955e+00 7.88128395e-01 -1.68355288e+00 + 7.51722246e-16 6.77091205e+00 -9.29446344e-01 3.72096877e-01 6.64003248e+00 -1.12960800e+00 7.42174170e-01 6.47311362e+00 -1.30506479e+00 + 5.50385532e+00 0.00000000e+00 1.34131946e+00 5.17310500e+00 0.00000000e+00 1.38050675e+00 4.84235469e+00 0.00000000e+00 1.41969404e+00 + 6.91202058e-01 6.84908918e+00 -6.71566734e-01 3.46197719e-01 6.82175828e+00 -8.05688186e-01 7.51722246e-16 6.77091205e+00 -9.29446344e-01 + 5.24107336e+00 0.00000000e+00 1.98541775e+00 5.37246434e+00 0.00000000e+00 1.66336861e+00 5.50385532e+00 0.00000000e+00 1.34131946e+00 + 2.35347470e+00 3.57273676e+00 -1.86522242e+00 2.59942220e+00 3.95635185e+00 -1.98221733e+00 2.85345437e+00 4.35227192e+00 -1.98954064e+00 + 5.37609367e-16 4.84235469e+00 1.41969404e+00 5.59742699e-16 5.04171402e+00 1.70255590e+00 5.81876032e-16 5.24107336e+00 1.98541775e+00 + 2.65894205e+00 5.84727816e+00 -1.40492233e+00 2.54064290e+00 6.14551239e+00 -1.13029961e+00 2.40016886e+00 6.39010822e+00 -8.15916232e-01 + 6.81247225e-16 6.13612949e+00 -1.64596773e+00 7.21314286e-16 6.49702150e+00 -1.32624532e+00 7.51722246e-16 6.77091205e+00 -9.29446344e-01 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 3.52830105e+00 3.85805417e+00 2.26450192e-01 3.81137977e+00 3.26482023e+00 2.43818043e-03 + 8.49686589e-01 4.80418933e+00 1.99632123e+00 1.29825281e+00 5.05285688e+00 1.98819568e+00 1.74506816e+00 5.29470996e+00 1.91559919e+00 + 4.57236485e+00 2.45689195e+00 -1.99089249e+00 4.37538415e+00 2.36015357e+00 -1.49364679e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 6.77091205e+00 0.00000000e+00 -9.29446344e-01 6.82148474e+00 3.43945945e-01 -8.06566767e-01 6.84886319e+00 6.86722414e-01 -6.73452256e-01 + 3.39519120e-16 3.05811637e+00 -4.78631329e-01 4.64901812e-01 3.11860185e+00 -7.67350369e-01 9.28539289e-01 3.17060607e+00 -1.05963208e+00 + 2.65894205e+00 5.84727816e+00 -1.40492233e+00 2.23128107e+00 5.94617991e+00 -1.47468610e+00 1.79787339e+00 6.02976719e+00 -1.52659565e+00 + 5.80909663e+00 0.00000000e+00 -7.28682117e-01 6.29000434e+00 0.00000000e+00 -8.29064231e-01 6.77091205e+00 0.00000000e+00 -9.29446344e-01 + 4.10377450e-16 3.69635146e+00 -6.64484250e-01 3.74948285e-16 3.37723391e+00 -5.71557789e-01 3.39519120e-16 3.05811637e+00 -4.78631329e-01 + 1.79787339e+00 6.02976719e+00 -1.52659565e+00 1.49915629e+00 5.64564392e+00 -1.16534705e+00 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 6.29429108e+00 0.00000000e+00 2.92477739e-02 6.53260157e+00 0.00000000e+00 -4.50099285e-01 6.77091205e+00 0.00000000e+00 -9.29446344e-01 + 4.25164652e+00 4.79855501e+00 -1.41728728e+00 3.81535837e+00 5.02546682e+00 -1.51152035e+00 3.36631027e+00 5.23557164e+00 -1.58139969e+00 + 3.66669029e+00 1.60543495e+00 1.73363787e+00 4.24122644e+00 1.20863508e+00 1.40210786e+00 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 3.84030955e+00 7.88128395e-01 -1.68355288e+00 4.08613309e+00 3.93944906e-01 -1.27445702e+00 4.33718082e+00 0.00000000e+00 -8.53060355e-01 + 6.77091205e+00 0.00000000e+00 -9.29446344e-01 6.63838928e+00 4.07574263e-01 -1.12896607e+00 6.46725517e+00 8.12777923e-01 -1.30203159e+00 + 1.44786006e+00 6.65570529e+00 8.47910322e-01 1.76280216e+00 6.19523394e+00 4.93970497e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 3.32200926e+00 3.48880988e+00 9.65261350e-01 3.08674710e+00 3.16424791e+00 5.84437003e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 6.77091205e+00 0.00000000e+00 -9.29446344e-01 6.49702150e+00 0.00000000e+00 -1.32624532e+00 6.13612949e+00 0.00000000e+00 -1.64596773e+00 + 4.29079023e+00 0.00000000e+00 -1.87003249e+00 4.06497348e+00 3.94008328e-01 -1.77791674e+00 3.84030955e+00 7.88128395e-01 -1.68355288e+00 + 2.37171589e+00 6.39454874e+00 8.28751343e-01 2.22450555e+00 6.06182128e+00 4.80645804e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 6.77091205e+00 0.00000000e+00 9.29446344e-01 6.63959446e+00 3.78132623e-01 1.12974953e+00 6.47176543e+00 7.54185877e-01 1.30501830e+00 + 3.49317869e+00 3.11807753e+00 -1.01200289e+00 3.55523500e+00 2.84593899e+00 -1.47226379e+00 3.61427973e+00 2.57594904e+00 -1.91950416e+00 + 6.11153928e-16 5.50478521e+00 8.72934590e-02 5.70299814e-16 5.13680406e+00 6.49883716e-02 5.29445700e-16 4.76882291e+00 4.26832841e-02 + 2.65894205e+00 5.84727816e+00 -1.40492233e+00 2.98193432e+00 5.93614490e+00 -1.14038455e+00 3.27995423e+00 5.97529909e+00 -8.37233641e-01 + 6.77091205e+00 0.00000000e+00 9.29446344e-01 6.81718815e+00 3.51590289e-01 8.15362529e-01 6.84084917e+00 7.02014226e-01 6.91168376e-01 + 3.61427973e+00 2.57594904e+00 -1.91950416e+00 3.89657751e+00 2.42129702e+00 -1.45317167e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 5.65566405e-16 5.09416930e+00 -5.77290822e-01 6.05219438e-01 5.17553298e+00 -6.86495899e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 3.84030955e+00 7.88128395e-01 -1.68355288e+00 4.24196107e+00 7.88871578e-01 -1.87892271e+00 4.67618055e+00 7.95671378e-01 -1.98346963e+00 + 5.91004055e+00 0.00000000e+00 8.16875302e-01 6.34047630e+00 0.00000000e+00 8.73160823e-01 6.77091205e+00 0.00000000e+00 9.29446344e-01 + 3.39519120e-16 3.05811637e+00 -4.78631329e-01 3.85538629e-16 3.47262325e+00 -2.39315664e-01 4.31558139e-16 3.88713014e+00 6.66829671e-16 + 6.11153928e-16 5.50478521e+00 8.72934590e-02 6.05731093e-01 5.38356803e+00 -3.50277554e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 3.84030955e+00 7.88128395e-01 -1.68355288e+00 3.98786015e+00 9.41290652e-01 -1.18802536e+00 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 6.29429108e+00 0.00000000e+00 2.92477739e-02 6.53260157e+00 0.00000000e+00 4.79347059e-01 6.77091205e+00 0.00000000e+00 9.29446344e-01 + 1.74506816e+00 5.29470996e+00 1.91559919e+00 1.34084224e+00 5.51963788e+00 1.88079166e+00 9.34999077e-01 5.73790834e+00 1.82703946e+00 + 4.76414707e+00 4.09287863e+00 -1.53606293e+00 5.14128776e+00 4.12202885e+00 -1.21363026e+00 5.45258967e+00 4.09839280e+00 -8.26773302e-01 + 7.51722246e-16 6.77091205e+00 9.29446344e-01 3.51747609e-01 6.81706519e+00 8.15619347e-01 7.02329418e-01 6.84062448e+00 6.91687670e-01 + 2.32657264e+00 2.25725956e+00 -9.52959980e-01 2.50858738e+00 2.97587631e+00 -7.72062819e-01 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 1.74506816e+00 5.29470996e+00 1.91559919e+00 1.28212734e+00 5.06951522e+00 1.49995736e+00 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 1.96316234e+00 4.67346532e+00 -1.68911610e-02 1.50384012e+00 4.41564108e+00 2.28985311e-01 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 6.56146310e-16 5.91004055e+00 8.16875302e-01 7.03934278e-16 6.34047630e+00 8.73160823e-01 7.51722246e-16 6.77091205e+00 9.29446344e-01 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 2.77034359e+00 3.26920810e+00 -1.89231956e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 1.74506816e+00 5.29470996e+00 1.91559919e+00 1.79518150e+00 5.12072596e+00 1.45442538e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 3.63985639e+00 2.04297305e+00 -3.66114706e-02 2.98056624e+00 2.15440821e+00 -4.99005938e-01 2.32657264e+00 2.25725956e+00 -9.52959980e-01 + 6.98806688e-16 6.29429108e+00 2.92477739e-02 7.25264467e-16 6.53260157e+00 4.79347059e-01 7.51722246e-16 6.77091205e+00 9.29446344e-01 + 7.51722246e-16 6.77091205e+00 9.29446344e-01 3.72096877e-01 6.64003248e+00 1.12960800e+00 7.42174170e-01 6.47311362e+00 1.30506479e+00 + 4.84235469e+00 0.00000000e+00 1.41969404e+00 4.83272911e+00 4.10685976e-01 1.22919851e+00 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 6.44939283e-16 5.80909663e+00 -7.28682117e-01 6.98330765e-16 6.29000434e+00 -8.29064231e-01 7.51722246e-16 6.77091205e+00 -9.29446344e-01 + 6.11050690e-16 5.50385532e+00 1.34131946e+00 5.96463361e-16 5.37246434e+00 1.66336861e+00 5.81876032e-16 5.24107336e+00 1.98541775e+00 + 2.40016886e+00 6.39010822e+00 -8.15916232e-01 1.80532290e+00 5.83850283e+00 -8.16656495e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 7.77156117e-16 7.00000000e+00 -4.89858720e-16 7.70703905e-16 6.94188363e+00 4.78631329e-01 7.51722246e-16 6.77091205e+00 9.29446344e-01 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 2.96895919e+00 4.07876133e+00 -6.80160783e-02 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 3.61427973e+00 2.57594904e+00 -1.91950416e+00 3.32462713e+00 2.27331288e+00 -1.74766302e+00 3.07425129e+00 1.99753337e+00 -1.49031131e+00 + 9.96203868e-01 6.92875009e+00 -4.89858720e-16 4.99374282e-01 6.98216480e+00 -4.89858720e-16 7.77156117e-16 7.00000000e+00 -4.89858720e-16 + 6.84886319e+00 6.86722414e-01 -6.73452256e-01 6.68706457e+00 7.53016405e-01 -1.00469989e+00 6.46725517e+00 8.12777923e-01 -1.30203159e+00 + 2.65894205e+00 5.84727816e+00 -1.40492233e+00 2.79813632e+00 5.44033587e+00 -9.34547279e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 6.13612949e+00 0.00000000e+00 1.64596773e+00 6.49702150e+00 0.00000000e+00 1.32624532e+00 6.77091205e+00 0.00000000e+00 9.29446344e-01 + 1.04514325e+00 4.15519204e+00 4.72626700e-01 1.44147885e+00 4.55042629e+00 7.27503505e-01 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 5.80909663e+00 0.00000000e+00 -7.28682117e-01 6.15051054e+00 4.04319787e-01 -1.02676659e+00 6.46725517e+00 8.12777923e-01 -1.30203159e+00 + 2.65894205e+00 5.84727816e+00 -1.40492233e+00 2.37205959e+00 5.79542394e+00 -6.45803146e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 6.13612949e+00 0.00000000e+00 1.64596773e+00 6.31950261e+00 3.78023425e-01 1.49297496e+00 6.47176543e+00 7.54185877e-01 1.30501830e+00 + 6.13612949e+00 0.00000000e+00 -1.64596773e+00 5.64376807e+00 0.00000000e+00 -1.46135480e+00 5.15140664e+00 0.00000000e+00 -1.27674188e+00 + 4.82901422e+00 4.82097219e+00 -8.21328667e-01 4.82841885e+00 4.48650909e+00 -1.21179648e+00 4.76414707e+00 4.09287863e+00 -1.53606293e+00 + 6.46725517e+00 8.12777923e-01 -1.30203159e+00 5.95582965e+00 9.37551423e-01 -1.05928621e+00 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 1.20153714e+00 5.25120069e+00 -7.90659956e-01 1.63692950e+00 5.48391889e+00 -3.30098719e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 6.13612949e+00 0.00000000e+00 1.64596773e+00 6.02308502e+00 0.00000000e+00 1.23142152e+00 5.91004055e+00 0.00000000e+00 8.16875302e-01 + 3.39519120e-16 3.05811637e+00 4.78631329e-01 4.11526089e-01 2.98684657e+00 2.45001900e-01 8.18991350e-01 2.88610338e+00 1.50447569e-02 + 5.48202315e+00 2.40466127e+00 -1.73992713e+00 5.80837823e+00 2.11630964e+00 -1.61340828e+00 6.11057364e+00 1.81915532e+00 -1.45178853e+00 + 7.77156117e-16 7.00000000e+00 -4.89858720e-16 7.70703905e-16 6.94188363e+00 -4.78631329e-01 7.51722246e-16 6.77091205e+00 -9.29446344e-01 + 5.24107336e+00 0.00000000e+00 1.98541775e+00 5.70920977e+00 0.00000000e+00 1.87003249e+00 6.13612949e+00 0.00000000e+00 1.64596773e+00 + 4.29079023e+00 0.00000000e+00 1.87003249e+00 4.14322877e+00 4.06960932e-01 1.81651067e+00 3.99134937e+00 8.13497743e-01 1.77240692e+00 + 6.13612949e+00 0.00000000e+00 1.64596773e+00 5.94209588e+00 3.76409589e-01 1.75780332e+00 5.73252083e+00 7.51834686e-01 1.84094565e+00 + 4.29079023e+00 0.00000000e+00 1.87003249e+00 4.32930405e+00 0.00000000e+00 1.39295321e+00 4.36781787e+00 0.00000000e+00 9.15873936e-01 + 4.25164652e+00 4.79855501e+00 -1.41728728e+00 4.56043893e+00 4.83106545e+00 -1.13961989e+00 4.82901422e+00 4.82097219e+00 -8.21328667e-01 + 5.50385532e+00 0.00000000e+00 1.34131946e+00 5.81999241e+00 0.00000000e+00 1.49364360e+00 6.13612949e+00 0.00000000e+00 1.64596773e+00 + 2.91459649e+00 7.10760232e-01 5.93224540e-03 2.99280633e+00 3.56147662e-01 -2.35579087e-01 3.05811637e+00 0.00000000e+00 -4.78631329e-01 + 6.81247225e-16 6.13612949e+00 -1.64596773e+00 3.71993889e-01 6.32002781e+00 -1.49282598e+00 7.42174170e-01 6.47311362e+00 -1.30506479e+00 + 4.82901422e+00 4.82097219e+00 -8.21328667e-01 5.15125903e+00 4.46875409e+00 -8.30368889e-01 5.45258967e+00 4.09839280e+00 -8.26773302e-01 + 2.38239817e+00 2.71913079e+00 1.44300412e+00 2.35051797e+00 2.39853156e+00 1.14222551e+00 2.35711984e+00 2.11720046e+00 8.03194791e-01 + 2.92502923e+00 5.02069415e+00 -4.56159172e-01 2.50001464e+00 5.36884896e+00 -1.61831932e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 5.24107336e+00 0.00000000e+00 -1.98541775e+00 5.47656824e+00 4.14516690e-01 -1.93848050e+00 5.70140723e+00 8.28226845e-01 -1.84945887e+00 + 5.65566405e-16 5.09416930e+00 -5.77290822e-01 4.83505872e-01 4.58808256e+00 -5.74828281e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 3.01195346e+00 1.97163196e+00 1.42817625e+00 2.66594436e+00 2.03025721e+00 1.13172449e+00 2.35711984e+00 2.11720046e+00 8.03194791e-01 + 3.26434043e+00 5.97819314e+00 8.47910322e-01 3.26064280e+00 5.22439635e+00 6.52302509e-01 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 4.67618055e+00 7.95671378e-01 -1.98346963e+00 4.95843027e+00 3.97819909e-01 -1.99983568e+00 5.24107336e+00 0.00000000e+00 -1.98541775e+00 + 6.13612949e+00 0.00000000e+00 -1.64596773e+00 5.70920977e+00 0.00000000e+00 -1.87003249e+00 5.24107336e+00 0.00000000e+00 -1.98541775e+00 + 2.35711984e+00 2.11720046e+00 8.03194791e-01 2.59787621e+00 2.47374442e+00 5.04647821e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 3.26434043e+00 5.97819314e+00 8.47910322e-01 2.67322559e+00 5.85576743e+00 4.94537606e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 5.15140664e+00 0.00000000e+00 -1.27674188e+00 5.19624000e+00 0.00000000e+00 -1.63107981e+00 5.24107336e+00 0.00000000e+00 -1.98541775e+00 + 1.70602213e+00 6.14089415e+00 1.45381775e+00 1.77543463e+00 5.54887428e+00 1.23143889e+00 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 1.04514325e+00 4.15519204e+00 4.72626700e-01 1.00420784e+00 4.11422256e+00 -4.76311902e-02 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 5.24107336e+00 0.00000000e+00 -1.98541775e+00 4.75892664e+00 0.00000000e+00 -1.98541775e+00 4.29079023e+00 0.00000000e+00 -1.87003249e+00 + 1.44786006e+00 6.65570529e+00 8.47910322e-01 1.58418889e+00 6.42770701e+00 1.17278966e+00 1.70602213e+00 6.14089415e+00 1.45381775e+00 + 3.63985639e+00 2.04297305e+00 -3.66114706e-02 3.24547965e+00 2.43990694e+00 8.53681569e-02 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 7.77156117e-16 7.00000000e+00 -4.89858720e-16 3.53161539e-01 6.95966325e+00 3.52907229e-01 7.02329418e-01 6.84062448e+00 6.91687670e-01 + 2.31584155e+00 3.67268462e+00 5.81567251e-01 2.58071938e+00 3.25223315e+00 3.96668057e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 3.05811637e+00 0.00000000e+00 -4.78631329e-01 3.37723391e+00 0.00000000e+00 -5.71557789e-01 3.69635146e+00 0.00000000e+00 -6.64484250e-01 + 7.77156117e-16 7.00000000e+00 -4.89858720e-16 7.37981403e-16 6.64714554e+00 1.46238870e-02 6.98806688e-16 6.29429108e+00 2.92477739e-02 + 7.77156117e-16 7.00000000e+00 -4.89858720e-16 3.47461934e-01 6.96183012e+00 -3.42267786e-01 6.91202058e-01 6.84908918e+00 -6.71566734e-01 + 4.90549429e+00 8.32101447e-01 1.99985075e+00 4.86050747e+00 8.25268956e-01 1.52031586e+00 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 7.51722246e-16 6.77091205e+00 -9.29446344e-01 7.25264467e-16 6.53260157e+00 -4.50099285e-01 6.98806688e-16 6.29429108e+00 2.92477739e-02 + 3.75674562e+00 4.26273080e+00 -1.88016210e+00 4.02094204e+00 4.54959054e+00 -1.68856326e+00 4.25164652e+00 4.79855501e+00 -1.41728728e+00 + 1.97212790e+00 6.71645082e+00 -4.89858720e-16 1.73665070e+00 6.73469506e+00 -4.21854772e-01 1.47742668e+00 6.66084957e+00 -8.23188188e-01 + 6.77091205e+00 0.00000000e+00 9.29446344e-01 6.94188363e+00 0.00000000e+00 4.78631329e-01 7.00000000e+00 0.00000000e+00 -4.89858720e-16 + 6.46725517e+00 8.12777923e-01 -1.30203159e+00 6.11653901e+00 8.24845767e-01 -1.62069030e+00 5.70140723e+00 8.28226845e-01 -1.84945887e+00 + 4.90549429e+00 8.32101447e-01 1.99985075e+00 4.59282270e+00 4.15569397e-01 1.96192099e+00 4.29079023e+00 0.00000000e+00 1.87003249e+00 + 4.81935933e+00 4.29199656e+00 1.37382079e+00 4.51222990e+00 4.16715834e+00 9.86334020e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 6.29429108e+00 0.00000000e+00 2.92477739e-02 5.87239570e+00 5.33957513e-01 -3.83872486e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 4.11227798e-16 3.70401072e+00 6.80187645e-01 3.75373459e-16 3.38106354e+00 5.79409487e-01 3.39519120e-16 3.05811637e+00 4.78631329e-01 + 6.11057364e+00 1.81915532e+00 -1.45178853e+00 5.48346979e+00 1.80804518e+00 -8.34593632e-01 4.83769328e+00 1.79640676e+00 -1.84951288e-01 + 7.00000000e+00 0.00000000e+00 -4.89858720e-16 6.94188363e+00 0.00000000e+00 -4.78631329e-01 6.77091205e+00 0.00000000e+00 -9.29446344e-01 + 5.81876032e-16 5.24107336e+00 -1.98541775e+00 4.14516690e-01 5.47656824e+00 -1.93848050e+00 8.28226845e-01 5.70140723e+00 -1.84945887e+00 + 1.70602213e+00 6.14089415e+00 1.45381775e+00 1.41476763e+00 5.85469301e+00 1.01211910e+00 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 3.01195346e+00 1.97163196e+00 1.42817625e+00 2.92925815e+00 2.39882138e+00 8.20436410e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 7.00000000e+00 0.00000000e+00 -4.89858720e-16 6.95972080e+00 3.53000235e-01 3.52632063e-01 6.84084917e+00 7.02014226e-01 6.91168376e-01 + 6.13612949e+00 0.00000000e+00 -1.64596773e+00 5.97261306e+00 0.00000000e+00 -1.18732492e+00 5.80909663e+00 0.00000000e+00 -7.28682117e-01 + 7.00000000e+00 0.00000000e+00 -4.89858720e-16 6.64714554e+00 0.00000000e+00 1.46238870e-02 6.29429108e+00 0.00000000e+00 2.92477739e-02 + 6.46725517e+00 8.12777923e-01 -1.30203159e+00 6.31818092e+00 4.07452292e-01 -1.49252338e+00 6.13612949e+00 0.00000000e+00 -1.64596773e+00 + 4.76882291e+00 0.00000000e+00 4.26832841e-02 5.16236272e+00 5.57125287e-01 2.96620416e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 7.00000000e+00 0.00000000e+00 -4.89858720e-16 6.96177283e+00 3.45212844e-01 -3.43239120e-01 6.84886319e+00 6.86722414e-01 -6.73452256e-01 + 6.13612949e+00 0.00000000e+00 -1.64596773e+00 5.92756883e+00 4.14729157e-01 -1.76423459e+00 5.70140723e+00 8.28226845e-01 -1.84945887e+00 + 6.92875009e+00 9.96203868e-01 -4.89858720e-16 6.98216480e+00 4.99374282e-01 -4.89858720e-16 7.00000000e+00 0.00000000e+00 -4.89858720e-16 + 5.81876032e-16 5.24107336e+00 -1.98541775e+00 6.33849614e-16 5.70920977e+00 -1.87003249e+00 6.81247225e-16 6.13612949e+00 -1.64596773e+00 + 1.79787339e+00 6.02976719e+00 -1.52659565e+00 1.70800441e+00 5.68051745e+00 -1.76970555e+00 1.60546045e+00 5.28911299e+00 -1.92920779e+00 + 4.31558139e-16 3.88713014e+00 6.66829671e-16 4.20967794e-16 3.79174080e+00 -3.32242125e-01 4.10377450e-16 3.69635146e+00 -6.64484250e-01 + 5.81876032e-16 5.24107336e+00 -1.98541775e+00 4.58521176e-01 5.04161657e+00 -1.99902557e+00 9.17002933e-01 4.84172634e+00 -1.99869635e+00 + 6.44939283e-16 5.80909663e+00 -7.28682117e-01 6.28046606e-16 5.65694092e+00 -3.20694329e-01 6.11153928e-16 5.50478521e+00 8.72934590e-02 + 5.81876032e-16 5.24107336e+00 -1.98541775e+00 5.76898529e-16 5.19624000e+00 -1.63107981e+00 5.71921026e-16 5.15140664e+00 -1.27674188e+00 + 8.18991350e-01 2.88610338e+00 1.50447569e-02 4.18047659e-01 3.29702580e+00 -3.25645588e-01 4.10377450e-16 3.69635146e+00 -6.64484250e-01 + 4.76373410e-16 4.29079023e+00 -1.87003249e+00 5.28346993e-16 4.75892664e+00 -1.98541775e+00 5.81876032e-16 5.24107336e+00 -1.98541775e+00 + 5.65566405e-16 5.09416930e+00 -5.77290822e-01 6.05252844e-16 5.45163297e+00 -6.52986470e-01 6.44939283e-16 5.80909663e+00 -7.28682117e-01 + 4.31558139e-16 3.88713014e+00 6.66829671e-16 3.85538629e-16 3.47262325e+00 2.39315664e-01 3.39519120e-16 3.05811637e+00 4.78631329e-01 + 6.11057364e+00 1.81915532e+00 -1.45178853e+00 6.02499980e+00 2.26095616e+00 -1.39285121e+00 5.92163036e+00 2.69607897e+00 -1.31546814e+00 + 7.51722246e-16 6.77091205e+00 9.29446344e-01 7.21314286e-16 6.49702150e+00 1.32624532e+00 6.81247225e-16 6.13612949e+00 1.64596773e+00 + 3.99545782e+00 1.68801727e+00 -1.88705283e+00 4.08982299e+00 1.97453444e+00 -1.43712331e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 1.12146756e+00 5.55164805e+00 5.56236736e-01 5.62751446e-01 5.93060044e+00 2.90755407e-01 6.98806688e-16 6.29429108e+00 2.92477739e-02 + 6.81247225e-16 6.13612949e+00 -1.64596773e+00 6.63093254e-16 5.97261306e+00 -1.18732492e+00 6.44939283e-16 5.80909663e+00 -7.28682117e-01 + 3.99545782e+00 1.68801727e+00 -1.88705283e+00 4.06661716e+00 1.39436134e+00 -1.29159116e+00 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 6.91202058e-01 6.84908918e+00 -6.71566734e-01 3.42651491e-01 6.59143437e+00 -3.21657675e-01 6.98806688e-16 6.29429108e+00 2.92477739e-02 + 8.28226845e-01 5.70140723e+00 -1.84945887e+00 4.14729157e-01 5.92756883e+00 -1.76423459e+00 6.81247225e-16 6.13612949e+00 -1.64596773e+00 + 1.96316234e+00 4.67346532e+00 -1.68911610e-02 1.90182262e+00 4.80985904e+00 4.80414202e-01 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 3.05811637e+00 0.00000000e+00 4.78631329e-01 3.00000000e+00 0.00000000e+00 2.44929360e-16 3.05811637e+00 0.00000000e+00 -4.78631329e-01 + 3.50297850e+00 0.00000000e+00 1.32624532e+00 3.22908795e+00 0.00000000e+00 9.29446344e-01 3.05811637e+00 0.00000000e+00 4.78631329e-01 + 3.05811637e+00 0.00000000e+00 4.78631329e-01 3.47262325e+00 0.00000000e+00 2.39315664e-01 3.88713014e+00 0.00000000e+00 6.66829671e-16 + 5.01679319e+00 1.65535959e+00 -1.97989896e+00 4.50081125e+00 1.66971694e+00 -1.99002983e+00 3.99545782e+00 1.68801727e+00 -1.88705283e+00 + 5.55889845e+00 2.08882586e+00 1.76618606e+00 5.19656028e+00 1.45755277e+00 1.40945696e+00 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 3.05811637e+00 0.00000000e+00 4.78631329e-01 3.38106354e+00 0.00000000e+00 5.79409487e-01 3.70401072e+00 0.00000000e+00 6.80187645e-01 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 2.60465490e+00 4.56450298e+00 2.19607270e-01 1.96316234e+00 4.67346532e+00 -1.68911610e-02 + 3.22867716e+00 8.97119914e-01 1.13171941e+00 3.13842124e+00 4.47849954e-01 8.07393063e-01 3.05811637e+00 0.00000000e+00 4.78631329e-01 + 3.05811637e+00 0.00000000e+00 4.78631329e-01 2.99350136e+00 3.56230372e-01 2.41406887e-01 2.91459649e+00 7.10760232e-01 5.93224540e-03 + 4.10377450e-16 3.69635146e+00 -6.64484250e-01 4.82020628e-01 3.88500274e+00 -6.16875168e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 6.81247225e-16 6.13612949e+00 1.64596773e+00 6.33849614e-16 5.70920977e+00 1.87003249e+00 5.81876032e-16 5.24107336e+00 1.98541775e+00 + 2.38239817e+00 2.71913079e+00 1.44300412e+00 2.70954122e+00 2.35613396e+00 1.41908997e+00 3.01195346e+00 1.97163196e+00 1.42817625e+00 + 9.34999077e-01 5.73790834e+00 1.82703946e+00 4.68181587e-01 5.94568060e+00 1.75229558e+00 6.81247225e-16 6.13612949e+00 1.64596773e+00 + 6.11050690e-16 5.50385532e+00 1.34131946e+00 6.46148957e-16 5.81999241e+00 1.49364360e+00 6.81247225e-16 6.13612949e+00 1.64596773e+00 + 2.92502923e+00 5.02069415e+00 -4.56159172e-01 2.67121582e+00 5.72237380e+00 -6.39832866e-01 2.40016886e+00 6.39010822e+00 -8.15916232e-01 + 6.56146310e-16 5.91004055e+00 8.16875302e-01 6.68696767e-16 6.02308502e+00 1.23142152e+00 6.81247225e-16 6.13612949e+00 1.64596773e+00 + 7.42174170e-01 6.47311362e+00 1.30506479e+00 3.71993889e-01 6.32002781e+00 1.49282598e+00 6.81247225e-16 6.13612949e+00 1.64596773e+00 + 5.70140723e+00 8.28226845e-01 -1.84945887e+00 5.92821608e+00 1.32867245e+00 -1.68634431e+00 6.11057364e+00 1.81915532e+00 -1.45178853e+00 + 1.47742668e+00 6.66084957e+00 -8.23188188e-01 1.94280837e+00 6.53897751e+00 -8.25937478e-01 2.40016886e+00 6.39010822e+00 -8.15916232e-01 + 2.38239817e+00 2.71913079e+00 1.44300412e+00 2.61107414e+00 2.77325909e+00 8.31666189e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 5.70140723e+00 8.28226845e-01 -1.84945887e+00 5.36423952e+00 1.24298408e+00 -1.93483661e+00 5.01679319e+00 1.65535959e+00 -1.97989896e+00 + 5.15140664e+00 0.00000000e+00 -1.27674188e+00 5.43162714e+00 4.14117643e-01 -1.58167568e+00 5.70140723e+00 8.28226845e-01 -1.84945887e+00 + 5.70140723e+00 8.28226845e-01 -1.84945887e+00 5.19742758e+00 8.13300123e-01 -1.98293926e+00 4.67618055e+00 7.95671378e-01 -1.98346963e+00 + 5.70140723e+00 8.28226845e-01 -1.84945887e+00 5.57459641e+00 9.44827289e-01 -1.33266927e+00 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 5.70140723e+00 8.28226845e-01 -1.84945887e+00 5.76683417e+00 4.18990654e-01 -1.30071294e+00 5.80909663e+00 0.00000000e+00 -7.28682117e-01 + 4.90549429e+00 8.32101447e-01 1.99985075e+00 4.87205684e+00 4.14033873e-01 1.72735363e+00 4.84235469e+00 0.00000000e+00 1.41969404e+00 + 3.50297850e+00 0.00000000e+00 -1.32624532e+00 3.86387051e+00 0.00000000e+00 -1.64596773e+00 4.29079023e+00 0.00000000e+00 -1.87003249e+00 + 4.90549429e+00 8.32101447e-01 1.99985075e+00 5.07352390e+00 4.16070412e-01 1.99794886e+00 5.24107336e+00 0.00000000e+00 1.98541775e+00 + 6.71645082e+00 1.97212790e+00 -4.89858720e-16 6.84002806e+00 1.48795703e+00 -4.89858720e-16 6.92875009e+00 9.96203868e-01 -4.89858720e-16 + 4.29079023e+00 0.00000000e+00 -1.87003249e+00 4.72109843e+00 0.00000000e+00 -1.57338718e+00 5.15140664e+00 0.00000000e+00 -1.27674188e+00 + 4.29079023e+00 0.00000000e+00 -1.87003249e+00 4.31398552e+00 0.00000000e+00 -1.36154642e+00 4.33718082e+00 0.00000000e+00 -8.53060355e-01 + 8.49686589e-01 4.80418933e+00 1.99632123e+00 4.24858263e-01 5.02280831e+00 1.99958492e+00 5.81876032e-16 5.24107336e+00 1.98541775e+00 + 3.05811637e+00 0.00000000e+00 -4.78631329e-01 3.22908795e+00 0.00000000e+00 -9.29446344e-01 3.50297850e+00 0.00000000e+00 -1.32624532e+00 + 3.61427973e+00 2.57594904e+00 -1.91950416e+00 4.09035441e+00 2.51459596e+00 -1.99012288e+00 4.57236485e+00 2.45689195e+00 -1.99089249e+00 + 3.05811637e+00 0.00000000e+00 -4.78631329e-01 3.47262325e+00 0.00000000e+00 -2.39315664e-01 3.88713014e+00 0.00000000e+00 6.66829671e-16 + 3.26434043e+00 5.97819314e+00 8.47910322e-01 2.82410975e+00 6.19972175e+00 8.45171255e-01 2.37171589e+00 6.39454874e+00 8.28751343e-01 + 1.74506816e+00 5.29470996e+00 1.91559919e+00 2.13755413e+00 5.56908847e+00 1.75166915e+00 2.51312670e+00 5.79940159e+00 1.50208175e+00 + 4.19318871e+00 3.34729677e+00 -1.96634244e+00 3.90150298e+00 2.95993014e+00 -1.99735810e+00 3.61427973e+00 2.57594904e+00 -1.91950416e+00 + 5.65566405e-16 5.09416930e+00 -5.77290822e-01 5.88360167e-16 5.29947725e+00 -2.44998682e-01 6.11153928e-16 5.50478521e+00 8.72934590e-02 + 4.90549429e+00 8.32101447e-01 1.99985075e+00 5.20968709e+00 4.18971608e-01 1.68404778e+00 5.50385532e+00 0.00000000e+00 1.34131946e+00 + 2.71726342e+00 4.76227833e+00 1.94081239e+00 2.23195205e+00 5.03026617e+00 1.93566315e+00 1.74506816e+00 5.29470996e+00 1.91559919e+00 + 4.84235469e+00 0.00000000e+00 1.41969404e+00 5.04171402e+00 0.00000000e+00 1.70255590e+00 5.24107336e+00 0.00000000e+00 1.98541775e+00 + 3.81137977e+00 3.26482023e+00 2.43818043e-03 3.65452690e+00 3.19369522e+00 -5.07954912e-01 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 1.70582869e+00 4.21637311e+00 1.94834000e+00 1.72614603e+00 4.75746421e+00 1.99907157e+00 1.74506816e+00 5.29470996e+00 1.91559919e+00 + 1.70602213e+00 6.14089415e+00 1.45381775e+00 1.73345307e+00 5.74400592e+00 1.73212473e+00 1.74506816e+00 5.29470996e+00 1.91559919e+00 + 2.32657264e+00 2.25725956e+00 -9.52959980e-01 2.58373830e+00 2.53615697e+00 -3.73465241e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 2.51312670e+00 5.79940159e+00 1.50208175e+00 2.45625110e+00 6.13149826e+00 1.19305827e+00 2.37171589e+00 6.39454874e+00 8.28751343e-01 + 3.61427973e+00 2.57594904e+00 -1.91950416e+00 3.80695950e+00 2.13315465e+00 -1.89613505e+00 3.99545782e+00 1.68801727e+00 -1.88705283e+00 + 4.25164652e+00 4.79855501e+00 -1.41728728e+00 4.19417210e+00 5.14908533e+00 -1.14315489e+00 4.09839280e+00 5.45258967e+00 -8.26773302e-01 + 5.65566405e-16 5.09416930e+00 -5.77290822e-01 5.47506052e-16 4.93149611e+00 -2.67303769e-01 5.29445700e-16 4.76882291e+00 4.26832841e-02 + 1.44786006e+00 6.65570529e+00 8.47910322e-01 1.28620750e+00 6.11071300e+00 7.03949699e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 3.61427973e+00 2.57594904e+00 -1.91950416e+00 3.43284014e+00 3.02229187e+00 -1.95403678e+00 3.25199430e+00 3.46915743e+00 -1.98494345e+00 + 3.61427973e+00 2.57594904e+00 -1.91950416e+00 3.15768566e+00 2.65547146e+00 -1.79884242e+00 2.71390420e+00 2.74576871e+00 -1.64373145e+00 + 4.25164652e+00 4.79855501e+00 -1.41728728e+00 3.98422682e+00 4.52717094e+00 -1.01362994e+00 3.70930390e+00 4.24678754e+00 -5.94643898e-01 + 4.76882291e+00 0.00000000e+00 4.26832841e-02 4.45819459e+00 5.53462439e-01 -3.22072760e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 4.19318871e+00 3.34729677e+00 -1.96634244e+00 4.38329398e+00 2.90243683e+00 -1.98340229e+00 4.57236485e+00 2.45689195e+00 -1.99089249e+00 + 2.65894205e+00 5.84727816e+00 -1.40492233e+00 1.93318241e+00 5.55942373e+00 -1.10588480e+00 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 3.39519120e-16 3.05811637e+00 -4.78631329e-01 3.58500779e-16 3.22908795e+00 -9.29446344e-01 3.88908739e-16 3.50297850e+00 -1.32624532e+00 + 3.39519120e-16 3.05811637e+00 -4.78631329e-01 3.33066907e-16 3.00000000e+00 2.44929360e-16 3.39519120e-16 3.05811637e+00 4.78631329e-01 + 3.39519120e-16 3.05811637e+00 -4.78631329e-01 4.11285522e-01 2.98510054e+00 -2.30273346e-01 8.18991350e-01 2.88610338e+00 1.50447569e-02 + 2.40016886e+00 6.39010822e+00 -8.15916232e-01 2.11262086e+00 6.25017241e+00 -1.20324404e+00 1.79787339e+00 6.02976719e+00 -1.52659565e+00 + 5.24107336e+00 0.00000000e+00 1.98541775e+00 5.49250647e+00 3.76308510e-01 1.93509396e+00 5.73252083e+00 7.51834686e-01 1.84094565e+00 + 4.81935933e+00 4.29199656e+00 1.37382079e+00 4.49145451e+00 4.61948118e+00 1.38478674e+00 4.15141759e+00 4.93448788e+00 1.37905163e+00 + 4.81935933e+00 4.29199656e+00 1.37382079e+00 5.13553179e+00 4.23549853e+00 1.12025749e+00 5.41262889e+00 4.14677334e+00 8.32446705e-01 + 6.29429108e+00 0.00000000e+00 2.92477739e-02 5.93109605e+00 5.55601071e-01 2.91201265e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 4.81636334e+00 4.81636334e+00 8.47910322e-01 4.83451968e+00 4.56992659e+00 1.12649106e+00 4.81935933e+00 4.29199656e+00 1.37382079e+00 + 4.18879533e+00 4.22468914e+00 1.76035677e+00 4.51608418e+00 4.26969463e+00 1.58869574e+00 4.81935933e+00 4.29199656e+00 1.37382079e+00 + 1.97212790e+00 6.71645082e+00 -4.89858720e-16 2.02467909e+00 6.22104761e+00 6.87668066e-02 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 4.81935933e+00 4.29199656e+00 1.37382079e+00 4.92807695e+00 3.96183491e+00 1.49976830e+00 5.02317376e+00 3.62072307e+00 1.60590616e+00 + 6.92875009e+00 9.96203868e-01 -4.89858720e-16 6.63052160e+00 4.96546535e-01 1.49272141e-02 6.29429108e+00 0.00000000e+00 2.92477739e-02 + 4.84925196e-16 4.36781787e+00 9.15873936e-01 4.12347493e-01 4.60151750e+00 9.76222280e-01 8.19698711e-01 4.83633089e+00 1.03462865e+00 + 5.37609367e-16 4.84235469e+00 1.41969404e+00 5.11267281e-16 4.60508628e+00 1.16778399e+00 4.84925196e-16 4.36781787e+00 9.15873936e-01 + 4.88089306e+00 2.97077601e+00 -4.90278395e-01 4.19125535e+00 3.04766946e+00 -7.58833090e-01 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 4.84925196e-16 4.36781787e+00 9.15873936e-01 5.25596798e-01 4.26324317e+00 6.97842383e-01 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 5.55889845e+00 2.08882586e+00 1.76618606e+00 5.13171573e+00 2.38832428e+00 1.23386911e+00 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 4.11227798e-16 3.70401072e+00 6.80187645e-01 4.48076497e-16 4.03591429e+00 7.98030791e-01 4.84925196e-16 4.36781787e+00 9.15873936e-01 + 5.55889845e+00 2.08882586e+00 1.76618606e+00 5.56776890e+00 1.60477982e+00 1.16951489e+00 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 4.84925196e-16 4.36781787e+00 9.15873936e-01 4.13324357e-01 4.10156702e+00 1.31449795e+00 8.30275396e-01 3.84107074e+00 1.68956565e+00 + 1.76701972e+00 4.45263593e+00 -1.98899096e+00 1.48682613e+00 4.85276533e+00 -1.39665184e+00 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 5.97819314e+00 3.26434043e+00 -8.47910322e-01 5.67729884e+00 3.25741901e+00 -1.26952049e+00 5.29182930e+00 3.20197153e+00 -1.61103065e+00 + 5.45258967e+00 4.09839280e+00 -8.26773302e-01 5.41779493e+00 3.68115549e+00 -1.26383749e+00 5.29182930e+00 3.20197153e+00 -1.61103065e+00 + 5.29182930e+00 3.20197153e+00 -1.61103065e+00 5.61822143e+00 2.95506960e+00 -1.47748106e+00 5.92163036e+00 2.69607897e+00 -1.31546814e+00 + 3.81137977e+00 3.26482023e+00 2.43818043e-03 3.33044115e+00 3.05040425e+00 1.05080672e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 4.76414707e+00 4.09287863e+00 -1.53606293e+00 5.03491360e+00 3.65244894e+00 -1.58465812e+00 5.29182930e+00 3.20197153e+00 -1.61103065e+00 + 5.29182930e+00 3.20197153e+00 -1.61103065e+00 4.76036520e+00 3.28696359e+00 -1.83954158e+00 4.19318871e+00 3.34729677e+00 -1.96634244e+00 + 5.29182930e+00 3.20197153e+00 -1.61103065e+00 4.74445447e+00 2.74040603e+00 -1.32028181e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 2.85345437e+00 4.35227192e+00 -1.98954064e+00 2.76908020e+00 4.02558962e+00 -1.30186761e+00 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 5.29182930e+00 3.20197153e+00 -1.61103065e+00 5.09616201e+00 3.09542228e+00 -1.05721215e+00 4.88089306e+00 2.97077601e+00 -4.90278395e-01 + 2.85345437e+00 4.35227192e+00 -1.98954064e+00 2.31016766e+00 4.40232171e+00 -1.99979907e+00 1.76701972e+00 4.45263593e+00 -1.98899096e+00 + 5.29182930e+00 3.20197153e+00 -1.61103065e+00 5.39197461e+00 2.80594354e+00 -1.68436799e+00 5.48202315e+00 2.40466127e+00 -1.73992713e+00 + 6.32434990e+00 2.38750096e+00 9.49952515e-01 5.52117035e+00 2.54099856e+00 8.30365226e-01 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 6.13925419e+00 1.44742402e+00 1.51335806e+00 6.31452120e+00 1.10237814e+00 1.41839014e+00 6.47176543e+00 7.54185877e-01 1.30501830e+00 + 3.49317869e+00 3.11807753e+00 -1.01200289e+00 3.17280892e+00 2.97907294e+00 -4.05363936e-01 2.84978830e+00 2.83609927e+00 2.06376458e-01 + 6.65570529e+00 1.44786006e+00 8.47910322e-01 6.43186432e+00 1.45542269e+00 1.20732822e+00 6.13925419e+00 1.44742402e+00 1.51335806e+00 + 4.88089306e+00 2.97077601e+00 -4.90278395e-01 4.53330876e+00 2.61752741e+00 -7.38696655e-01 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 5.73252083e+00 7.51834686e-01 1.84094565e+00 5.95047287e+00 1.10233131e+00 1.70114500e+00 6.13925419e+00 1.44742402e+00 1.51335806e+00 + 3.26434043e+00 5.97819314e+00 8.47910322e-01 3.10605449e+00 5.51719388e+00 1.99356875e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 5.35379131e+00 1.37066032e+00 1.92946545e+00 5.76921025e+00 1.41460513e+00 1.76527480e+00 6.13925419e+00 1.44742402e+00 1.51335806e+00 + 6.13925419e+00 1.44742402e+00 1.51335806e+00 5.85344470e+00 1.27998550e+00 1.03841854e+00 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 3.01195346e+00 1.97163196e+00 1.42817625e+00 3.31288528e+00 2.00560289e+00 7.00120016e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 6.13925419e+00 1.44742402e+00 1.51335806e+00 5.85959205e+00 1.77130376e+00 1.65599391e+00 5.55889845e+00 2.08882586e+00 1.76618606e+00 + 3.01195346e+00 1.97163196e+00 1.42817625e+00 3.84609101e+00 2.32923002e+00 1.07989586e+00 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 6.13925419e+00 1.44742402e+00 1.51335806e+00 6.26413246e+00 1.92741023e+00 1.25906242e+00 6.32434990e+00 2.38750096e+00 9.49952515e-01 + 2.44916181e+00 5.21201554e+00 -1.85047539e+00 2.69072499e+00 5.12158099e+00 -1.15982745e+00 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 3.70401072e+00 0.00000000e+00 6.80187645e-01 3.79557043e+00 0.00000000e+00 3.40093823e-01 3.88713014e+00 0.00000000e+00 6.66829671e-16 + 3.70401072e+00 0.00000000e+00 6.80187645e-01 3.30877807e+00 3.64117424e-01 3.43948236e-01 2.91459649e+00 7.10760232e-01 5.93224540e-03 + 3.70401072e+00 0.00000000e+00 6.80187645e-01 3.47028061e+00 4.52198797e-01 9.00465990e-01 3.22867716e+00 8.97119914e-01 1.13171941e+00 + 3.70401072e+00 0.00000000e+00 6.80187645e-01 3.92805379e+00 5.28684064e-01 5.65836196e-01 4.16416613e+00 1.05434548e+00 4.43323150e-01 + 2.44916181e+00 5.21201554e+00 -1.85047539e+00 2.20951475e+00 4.94887360e+00 -9.48487379e-01 1.96316234e+00 4.67346532e+00 -1.68911610e-02 + 3.70401072e+00 0.00000000e+00 6.80187645e-01 3.84601314e+00 4.09029512e-01 1.23545137e+00 3.99134937e+00 8.13497743e-01 1.77240692e+00 + 4.69391929e+00 2.68789105e+00 6.89739971e-01 4.16716511e+00 2.36804371e+00 3.29275409e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 4.36781787e+00 0.00000000e+00 9.15873936e-01 4.03591429e+00 0.00000000e+00 7.98030791e-01 3.70401072e+00 0.00000000e+00 6.80187645e-01 + 3.66669029e+00 1.60543495e+00 1.73363787e+00 3.64471608e+00 1.82584169e+00 8.57433488e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 4.36781787e+00 0.00000000e+00 9.15873936e-01 4.75098959e+00 0.00000000e+00 8.40824503e-01 5.13416130e+00 0.00000000e+00 7.65775070e-01 + 4.36781787e+00 0.00000000e+00 9.15873936e-01 4.56832039e+00 0.00000000e+00 4.79278610e-01 4.76882291e+00 0.00000000e+00 4.26832841e-02 + 4.36781787e+00 0.00000000e+00 9.15873936e-01 4.12747401e+00 0.00000000e+00 4.57936968e-01 3.88713014e+00 0.00000000e+00 6.66829671e-16 + 4.36781787e+00 0.00000000e+00 9.15873936e-01 4.59369988e+00 4.11824966e-01 9.73896925e-01 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 4.14243838e+00 1.09783743e+00 -6.87996555e-01 4.16036887e+00 1.68016705e+00 -8.36464312e-01 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 4.36781787e+00 0.00000000e+00 9.15873936e-01 4.26472619e+00 5.30634829e-01 6.84458480e-01 4.16416613e+00 1.05434548e+00 4.43323150e-01 + 2.44916181e+00 5.21201554e+00 -1.85047539e+00 2.11151832e+00 4.84018265e+00 -1.98020276e+00 1.76701972e+00 4.45263593e+00 -1.98899096e+00 + 4.36781787e+00 0.00000000e+00 9.15873936e-01 4.17613530e+00 4.05182972e-01 1.35484206e+00 3.99134937e+00 8.13497743e-01 1.77240692e+00 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 3.89963198e+00 1.54828064e+00 2.03390384e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 4.11227798e-16 3.70401072e+00 6.80187645e-01 4.21012307e-01 3.77082974e+00 1.19035864e+00 8.30275396e-01 3.84107074e+00 1.68956565e+00 + 1.96316234e+00 4.67346532e+00 -1.68911610e-02 1.58353566e+00 4.96325656e+00 -4.05890810e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 4.11227798e-16 3.70401072e+00 6.80187645e-01 4.16993884e-01 3.42393358e+00 8.10810641e-01 8.26534753e-01 3.12967293e+00 9.44322863e-01 + 3.63985639e+00 2.04297305e+00 -3.66114706e-02 3.48429736e+00 2.76673601e+00 4.65043005e-01 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 4.11227798e-16 3.70401072e+00 6.80187645e-01 5.24282245e-01 3.92698029e+00 5.79768215e-01 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 8.18991350e-01 2.88610338e+00 1.50447569e-02 4.17695051e-01 3.30067598e+00 3.48844593e-01 4.11227798e-16 3.70401072e+00 6.80187645e-01 + 4.31558139e-16 3.88713014e+00 6.66829671e-16 4.21392969e-16 3.79557043e+00 3.40093823e-01 4.11227798e-16 3.70401072e+00 6.80187645e-01 + 4.81523801e-16 4.33718082e+00 -8.53060355e-01 4.56540970e-16 4.11215548e+00 -4.26530178e-01 4.31558139e-16 3.88713014e+00 6.66829671e-16 + 2.31584155e+00 3.67268462e+00 5.81567251e-01 2.07507596e+00 4.30573036e+00 7.90096525e-01 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 5.29445700e-16 4.76882291e+00 4.26832841e-02 4.80501919e-16 4.32797653e+00 2.13416421e-02 4.31558139e-16 3.88713014e+00 6.66829671e-16 + 4.31558139e-16 3.88713014e+00 6.66829671e-16 4.84433174e-01 3.98331192e+00 -2.80464856e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 4.31558139e-16 3.88713014e+00 6.66829671e-16 5.25942610e-01 4.02215003e+00 2.34404600e-01 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 8.18991350e-01 2.88610338e+00 1.50447569e-02 4.09372885e-01 3.38568226e+00 8.16939402e-03 4.31558139e-16 3.88713014e+00 6.66829671e-16 + 3.99134937e+00 8.13497743e-01 1.77240692e+00 3.57275301e+00 8.46480874e-01 1.49516397e+00 3.22867716e+00 8.97119914e-01 1.13171941e+00 + 4.67943156e+00 1.72203103e+00 1.99995258e+00 4.32278243e+00 1.26407752e+00 1.93747242e+00 3.99134937e+00 8.13497743e-01 1.77240692e+00 + 3.99134937e+00 8.13497743e-01 1.77240692e+00 4.40655584e+00 8.13738893e-01 1.41658895e+00 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 5.19786798e+00 1.45404956e+00 1.84734069e-01 5.55517653e+00 1.10950218e+00 5.53521335e-01 + 3.99134937e+00 8.13497743e-01 1.77240692e+00 4.06666976e+00 9.32767414e-01 1.11992288e+00 4.16416613e+00 1.05434548e+00 4.43323150e-01 + 1.12146756e+00 5.55164805e+00 5.56236736e-01 1.16623508e+00 5.41002069e+00 -1.17720199e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 3.66669029e+00 1.60543495e+00 1.73363787e+00 3.83394893e+00 1.21102329e+00 1.74381814e+00 3.99134937e+00 8.13497743e-01 1.77240692e+00 + 9.96203868e-01 6.92875009e+00 -4.89858720e-16 1.10599020e+00 6.11177679e+00 -3.97039875e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 4.84518766e+00 2.71206661e+00 1.92214852e+00 5.22207897e+00 2.83332528e+00 1.76469408e+00 5.56236085e+00 2.93472089e+00 1.52914670e+00 + 6.92875009e+00 9.96203868e-01 -4.89858720e-16 6.91911067e+00 8.45164757e-01 -3.42025074e-01 6.84886319e+00 6.86722414e-01 -6.73452256e-01 + 5.02317376e+00 3.62072307e+00 1.60590616e+00 4.94759728e+00 3.17500461e+00 1.79662114e+00 4.84518766e+00 2.71206661e+00 1.92214852e+00 + 1.61330264e+00 2.59455891e+00 -4.66799866e-01 1.70159976e+00 2.72660562e+00 -9.00120722e-01 1.84023910e+00 2.93931957e+00 -1.28551886e+00 + 5.55889845e+00 2.08882586e+00 1.76618606e+00 5.20768897e+00 2.40305151e+00 1.85989349e+00 4.84518766e+00 2.71206661e+00 1.92214852e+00 + 4.84518766e+00 2.71206661e+00 1.92214852e+00 4.76494199e+00 2.21827430e+00 1.98354985e+00 4.67943156e+00 1.72203103e+00 1.99995258e+00 + 4.84518766e+00 2.71206661e+00 1.92214852e+00 4.77208258e+00 2.70084768e+00 1.31325831e+00 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 1.76701972e+00 4.45263593e+00 -1.98899096e+00 2.34759745e+00 4.74222692e+00 -1.24360623e+00 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 4.84518766e+00 2.71206661e+00 1.92214852e+00 4.39171838e+00 2.52559316e+00 1.99890596e+00 3.93477797e+00 2.33712352e+00 1.95465416e+00 + 1.76701972e+00 4.45263593e+00 -1.98899096e+00 2.22649439e+00 4.07772026e+00 -1.29901331e+00 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 4.10991321e+00 3.34897797e+00 1.97712747e+00 4.47896968e+00 3.03148287e+00 1.95785323e+00 4.84518766e+00 2.71206661e+00 1.92214852e+00 + 1.76701972e+00 4.45263593e+00 -1.98899096e+00 1.86696488e+00 4.56436999e+00 -1.00947426e+00 1.96316234e+00 4.67346532e+00 -1.68911610e-02 + 3.70930390e+00 4.24678754e+00 -5.94643898e-01 4.27489257e+00 4.54063888e+00 -7.15102213e-01 4.82901422e+00 4.82097219e+00 -8.21328667e-01 + 4.82901422e+00 4.82097219e+00 -8.21328667e-01 4.53035443e+00 4.44716717e+00 -1.18392318e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 4.82901422e+00 4.82097219e+00 -8.21328667e-01 5.09458172e+00 4.73498275e+00 -4.20937107e-01 5.29024702e+00 4.58402514e+00 -4.89858720e-16 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 4.73916621e+00 5.09067758e+00 -4.20980463e-01 4.82901422e+00 4.82097219e+00 -8.21328667e-01 + 6.84886319e+00 6.86722414e-01 -6.73452256e-01 6.14999347e+00 8.75054172e-01 -7.41169284e-01 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 6.84886319e+00 6.86722414e-01 -6.73452256e-01 6.59440626e+00 3.41037685e-01 -3.21878889e-01 6.29429108e+00 0.00000000e+00 2.92477739e-02 + 1.61330264e+00 2.59455891e+00 -4.66799866e-01 1.97281044e+00 2.42944699e+00 -7.08154522e-01 2.32657264e+00 2.25725956e+00 -9.52959980e-01 + 2.32657264e+00 2.25725956e+00 -9.52959980e-01 2.08861476e+00 2.60478576e+00 -1.11365747e+00 1.84023910e+00 2.93931957e+00 -1.28551886e+00 + 6.11153928e-16 5.50478521e+00 8.72934590e-02 6.54980308e-16 5.89953815e+00 5.82706165e-02 6.98806688e-16 6.29429108e+00 2.92477739e-02 + 2.44916181e+00 5.21201554e+00 -1.85047539e+00 2.12952526e+00 5.63679348e+00 -1.71699324e+00 1.79787339e+00 6.02976719e+00 -1.52659565e+00 + 1.79787339e+00 6.02976719e+00 -1.52659565e+00 1.64810627e+00 6.38582256e+00 -1.20654177e+00 1.47742668e+00 6.66084957e+00 -8.23188188e-01 + 2.40016886e+00 6.39010822e+00 -8.15916232e-01 2.20117966e+00 6.59833784e+00 -4.18112538e-01 1.97212790e+00 6.71645082e+00 -4.89858720e-16 + 1.04514325e+00 4.15519204e+00 4.72626700e-01 9.29699200e-01 3.51437908e+00 2.43775124e-01 8.18991350e-01 2.88610338e+00 1.50447569e-02 + 1.97212790e+00 6.71645082e+00 -4.89858720e-16 1.48795703e+00 6.84002806e+00 -4.89858720e-16 9.96203868e-01 6.92875009e+00 -4.89858720e-16 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 4.48945720e+00 1.44779156e+00 -4.38018669e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 5.43450550e+00 1.06264940e+00 -7.98648778e-01 4.79025102e+00 1.08124101e+00 -7.43770767e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 3.63985639e+00 2.04297305e+00 -3.66114706e-02 3.88766136e+00 1.57053010e+00 -3.62547851e-01 4.14243838e+00 1.09783743e+00 -6.87996555e-01 + 4.76882291e+00 0.00000000e+00 4.26832841e-02 4.79810783e+00 4.11634865e-01 5.33623076e-01 4.82274819e+00 8.19003004e-01 1.02744998e+00 + 6.32434990e+00 2.38750096e+00 9.49952515e-01 6.40378799e+00 2.67186116e+00 4.90860040e-01 6.36742397e+00 2.90790509e+00 -4.89858720e-16 + 3.78448572e+00 5.88877473e+00 -4.89858720e-16 3.36118864e+00 5.46787383e+00 -2.34628514e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 4.40226639e+00 4.67558296e+00 3.00608860e-01 4.19489205e+00 4.03465652e+00 5.92789158e-01 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 3.76714928e+00 5.17338347e+00 -2.35027807e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 4.58402514e+00 5.29024702e+00 -4.89858720e-16 4.19494367e+00 5.60378869e+00 -4.89858720e-16 3.78448572e+00 5.88877473e+00 -4.89858720e-16 + 2.35347470e+00 3.57273676e+00 -1.86522242e+00 2.92256767e+00 3.33962716e+00 -1.45809003e+00 3.49317869e+00 3.11807753e+00 -1.01200289e+00 + 2.35347470e+00 3.57273676e+00 -1.86522242e+00 2.07704211e+00 3.22525949e+00 -1.62651811e+00 1.84023910e+00 2.93931957e+00 -1.28551886e+00 + 3.81137977e+00 3.26482023e+00 2.43818043e-03 3.99746641e+00 2.76535199e+00 -4.90011916e-01 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 6.32434990e+00 2.38750096e+00 9.49952515e-01 5.59629281e+00 2.09956247e+00 3.86696275e-01 4.83769328e+00 1.79640676e+00 -1.84951288e-01 + 5.43450550e+00 1.06264940e+00 -7.98648778e-01 4.81040217e+00 1.66386077e+00 -8.91536291e-01 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 4.50997740e+00 2.02911122e+00 -5.83803024e-01 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 5.48202315e+00 2.40466127e+00 -1.73992713e+00 4.83431541e+00 2.34106464e+00 -1.37688758e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 3.49317869e+00 3.11807753e+00 -1.01200289e+00 3.83642611e+00 2.68924718e+00 -1.00064287e+00 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 3.63985639e+00 2.04297305e+00 -3.66114706e-02 3.91031673e+00 2.15411773e+00 -5.06481406e-01 4.18113253e+00 2.26361079e+00 -9.79147108e-01 + 5.35379131e+00 1.37066032e+00 1.92946545e+00 5.01896032e+00 1.54706971e+00 1.98406189e+00 4.67943156e+00 1.72203103e+00 1.99995258e+00 + 5.29445700e-16 4.76882291e+00 4.26832841e-02 5.25997325e-01 4.46602506e+00 2.56287048e-01 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 5.29445700e-16 4.76882291e+00 4.26832841e-02 6.05331706e-01 5.01191251e+00 -3.72316542e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 6.11057364e+00 1.81915532e+00 -1.45178853e+00 6.42096552e+00 1.66278090e+00 -1.15501600e+00 6.66455249e+00 1.48910661e+00 -8.09427054e-01 + 1.84023910e+00 2.93931957e+00 -1.28551886e+00 1.40404871e+00 3.50948612e+00 -9.25878748e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 2.40016886e+00 6.39010822e+00 -8.15916232e-01 2.23906025e+00 6.06093509e+00 -3.41483204e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 6.11057364e+00 1.81915532e+00 -1.45178853e+00 5.77806900e+00 1.43841207e+00 -1.13723685e+00 5.43450550e+00 1.06264940e+00 -7.98648778e-01 + 6.11057364e+00 1.81915532e+00 -1.45178853e+00 6.28748879e+00 2.12209785e+00 -1.15050945e+00 6.39713060e+00 2.40233486e+00 -7.99297168e-01 + 8.18991350e-01 2.88610338e+00 1.50447569e-02 8.84486300e-01 3.46716554e+00 -2.84365660e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 2.31584155e+00 3.67268462e+00 5.81567251e-01 1.56892502e+00 3.27013433e+00 3.01391672e-01 8.18991350e-01 2.88610338e+00 1.50447569e-02 + 1.12146756e+00 5.55164805e+00 5.56236736e-01 1.08486449e+00 4.85445462e+00 5.13741464e-01 1.04514325e+00 4.15519204e+00 4.72626700e-01 + 1.04514325e+00 4.15519204e+00 4.72626700e-01 1.68077978e+00 3.91425796e+00 5.27269674e-01 2.31584155e+00 3.67268462e+00 5.81567251e-01 + 1.12146756e+00 5.55164805e+00 5.56236736e-01 1.48137101e+00 5.25066599e+00 7.67372723e-01 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 2.06981752e+00 5.70808899e+00 1.34251287e-01 2.65978930e+00 5.08287803e+00 2.94482303e-01 3.24632001e+00 4.45266669e+00 4.50926957e-01 + 3.26434043e+00 5.97819314e+00 8.47910322e-01 2.55561115e+00 5.47999104e+00 9.23295521e-01 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 3.24632001e+00 4.45266669e+00 4.50926957e-01 2.54208932e+00 4.70180446e+00 7.19489594e-01 1.84084531e+00 4.94604334e+00 9.74277421e-01 + 1.47742668e+00 6.66084957e+00 -8.23188188e-01 1.77849585e+00 6.20145122e+00 -3.48335610e-01 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 1.96316234e+00 4.67346532e+00 -1.68911610e-02 2.01752898e+00 5.19141615e+00 5.75073402e-02 2.06981752e+00 5.70808899e+00 1.34251287e-01 + 9.96203868e-01 6.92875009e+00 -4.89858720e-16 4.97455991e-01 6.63444694e+00 1.67704089e-02 6.98806688e-16 6.29429108e+00 2.92477739e-02 + 2.85345437e+00 4.35227192e+00 -1.98954064e+00 2.89851824e+00 4.69601119e+00 -1.24343247e+00 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 5.55517653e+00 1.10950218e+00 5.53521335e-01 5.94985867e+00 1.75502290e+00 7.59411491e-01 6.32434990e+00 2.38750096e+00 9.49952515e-01 + 4.69391929e+00 2.68789105e+00 6.89739971e-01 4.00797416e+00 3.08616901e+00 8.30545903e-01 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 3.01195346e+00 1.97163196e+00 1.42817625e+00 3.17266124e+00 2.72658612e+00 1.20500575e+00 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 3.00671793e+00 3.59649512e+00 1.89290662e-01 3.32200926e+00 3.48880988e+00 9.65261350e-01 + 3.66669029e+00 1.60543495e+00 1.73363787e+00 3.33500912e+00 1.78622355e+00 1.58728927e+00 3.01195346e+00 1.97163196e+00 1.42817625e+00 + 4.16416613e+00 1.05434548e+00 4.43323150e-01 3.58374487e+00 1.50733160e+00 9.42114502e-01 3.01195346e+00 1.97163196e+00 1.42817625e+00 + 2.44916181e+00 5.21201554e+00 -1.85047539e+00 1.82819309e+00 5.23663445e+00 -1.32836472e+00 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 4.88089306e+00 2.97077601e+00 -4.90278395e-01 4.26334775e+00 2.50936206e+00 -2.62702176e-01 3.63985639e+00 2.04297305e+00 -3.66114706e-02 + 4.69391929e+00 2.68789105e+00 6.89739971e-01 4.42757919e+00 1.87101991e+00 5.73070811e-01 4.16416613e+00 1.05434548e+00 4.43323150e-01 + 3.66669029e+00 1.60543495e+00 1.73363787e+00 4.17427584e+00 2.14405092e+00 1.22760001e+00 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 3.66669029e+00 1.60543495e+00 1.73363787e+00 3.91264220e+00 1.32777449e+00 1.09393894e+00 4.16416613e+00 1.05434548e+00 4.43323150e-01 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 2.80817281e+00 4.36353844e+00 -5.22802749e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 1.96316234e+00 4.67346532e+00 -1.68911610e-02 2.44360114e+00 4.84857967e+00 -2.38747635e-01 2.92502923e+00 5.02069415e+00 -4.56159172e-01 + 1.76701972e+00 4.45263593e+00 -1.98899096e+00 1.36345147e+00 4.25940295e+00 -1.29527721e+00 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 1.76701972e+00 4.45263593e+00 -1.98899096e+00 1.64979390e+00 3.98101120e+00 -1.87695662e+00 1.54860554e+00 3.54808542e+00 -1.65108235e+00 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 1.82355980e+00 3.88719736e+00 -5.75207338e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 1.54860554e+00 3.54808542e+00 -1.65108235e+00 1.25222353e+00 3.80681884e+00 -1.11420950e+00 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 1.96316234e+00 4.67346532e+00 -1.68911610e-02 1.46184940e+00 4.37410479e+00 -2.94697422e-01 9.59140167e-01 4.07341982e+00 -5.67357895e-01 + 2.68895544e+00 3.70210606e+00 -5.87199511e-01 2.32562399e+00 4.18726767e+00 -3.04018043e-01 1.96316234e+00 4.67346532e+00 -1.68911610e-02 + 1.54860554e+00 3.54808542e+00 -1.65108235e+00 2.11805996e+00 3.62295628e+00 -1.12431541e+00 2.68895544e+00 3.70210606e+00 -5.87199511e-01 + 1.54860554e+00 3.54808542e+00 -1.65108235e+00 1.75569205e+00 4.10868733e+00 -8.46145927e-01 1.96316234e+00 4.67346532e+00 -1.68911610e-02 + 9.96203868e-01 6.92875009e+00 -4.89858720e-16 8.47388504e-01 6.91901245e+00 -3.41029814e-01 6.91202058e-01 6.84908918e+00 -6.71566734e-01 + 9.96203868e-01 6.92875009e+00 -4.89858720e-16 1.06063624e+00 6.24847480e+00 2.77768918e-01 1.12146756e+00 5.55164805e+00 5.56236736e-01 + 1.12146756e+00 5.55164805e+00 5.56236736e-01 9.10755599e-01 6.21945497e+00 -6.37561656e-02 6.91202058e-01 6.84908918e+00 -6.71566734e-01 + 1.12146756e+00 5.55164805e+00 5.56236736e-01 1.54407133e+00 5.11514858e+00 2.69402629e-01 1.96316234e+00 4.67346532e+00 -1.68911610e-02 + 6.91202058e-01 6.84908918e+00 -6.71566734e-01 9.48976276e-01 6.05930912e+00 -7.37472356e-01 1.20153714e+00 5.25120069e+00 -7.90659956e-01 + 5.55517653e+00 1.10950218e+00 5.53521335e-01 5.12774395e+00 1.90025804e+00 6.27183586e-01 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 4.76735292e+00 2.24396265e+00 2.53765496e-01 4.69391929e+00 2.68789105e+00 6.89739971e-01 + 4.83769328e+00 1.79640676e+00 -1.84951288e-01 4.83122351e+00 1.30930802e+00 4.25026606e-01 4.82274819e+00 8.19003004e-01 1.02744998e+00 + + + A[0-591] + F[1323,1291,1275,1311,1325,1315,1293,1272,1280,1239,1286,1334,1289,1111,1297,1215,1305,1008,1317,1138,1319,1060,1219,873,1309,1065,1307,1283,1295,1156,1242,592,232,800,337,108,63,579,166,471,735,381,362,426,112,1340,1082,1313,1267,770,266,1023,1330,283,308,605,854,1261,1162,960,445,1104,391,1300,1118,1238,1194,716,1006,1229,1130,1331,238,1120,848,1263,918,767,89,1251,876,1278,984,1227,1182,1257,884,1303,1270,1321,1175,1265,1184,798,1079,1206,1347,514,1014,725,1063,1256,916,1171,1199,923,1218,364,952,1110,910,1080,786,1188,1144,324,1164,1170,791,788,301,643,622,373,784,1154,978,1150,1146,1015,900,1137,1012,1070,1166,1196,1253,1131,1161,1133,944,1093,1051,925,1179,1021,529,1207,908,524,1029,450,840,1038,1249,1204,678,1152,1222,1254,1260,624,938,1042,833,1202,582,393,1068,1345,517,640,878,869,721,348,175,1191,733,1017,982,970,250,1148,576,684,762,1040,1198,353,608,871,1349,966,478,610,915,741,852,595,676,764,1209,1189,645,236,204,1221,1019,370,1087,1269,1234,828,739,590,781,927,1211,83,689,661,207,727,1001,455,376,988,996,895,1058,757,147,424,556,1236,1250,637,863,480,814,842,897,1031,1192,772,980,1213,241,150,839,1135] + F[1326,1316,1281,1245,1287,1336,1290,977,1298,1187,1306,937,1318,1178,1320,1101,1220,907,1310,1129,1308,1296,1174,1233,959,544,822,948,987,616,569,850,1201,436,1074,1151,1126,1302,342,663,1049] + F[1324,1312,1314,1248,1262,1117,1301,868,1230,887,1264,951,1252,862,1279,998,1228,902,1258,892,1304,1322,1143,1226,865,461,747,1180,1217,913,653,416,991,1328,1077,1155,1102,1299,246,571,1047] + + + C[1] + + + + + P0818 + 5.7.0 + 17-Dec-2024 14:26:59 + + -f -v quarter_torus.msh quarter_torus.xml:xml:uncompress + + diff --git a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp index 5abbadaf..d4b8c017 100644 --- a/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp +++ b/test/unit/nektar_interface/test_particle_geometry_interface_3d_curved.cpp @@ -6,8 +6,7 @@ TEST(ParticleGeometryInterfaceCurved, XMapNewtonBase) { MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); TestUtilities::TestResourceSession resource_session( - "reference_all_types_cube/mixed_ref_cube_0.5_perturbed_order_2.xml", - "reference_all_types_cube/conditions.xml"); + "torus/quarter_torus_tets_order_2.xml", "torus/conditions.xml"); // Create session reader. auto session = resource_session.session; From f8fc3cbd255e31545dfa39a9adbb3e55e287ca7e Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 17 Dec 2024 15:35:32 +0000 Subject: [PATCH 61/66] use generic 3D mapper for non-regular mesh in integration test --- .../map_particles_3d.cpp | 29 +++++++++++++-- .../test_particle_advection.cpp | 37 +++++++++++-------- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp b/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp index 0aa6dc4e..730506b1 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp @@ -21,9 +21,32 @@ MapParticles3D::MapParticles3D( this->map_particles_3d_deformed_non_linear = nullptr; GeometryContainer3D geometry_container_3d; - assemble_geometry_container_3d(particle_mesh_interface->graph, - particle_mesh_interface->remote_geoms_3d, - geometry_container_3d); + const bool all_generic_newton = static_cast( + config->get("MapParticles3D/all_generic_newton", 0)); + + if (!all_generic_newton) { + // Get the geometry objects in their different categories. + assemble_geometry_container_3d(particle_mesh_interface->graph, + particle_mesh_interface->remote_geoms_3d, + geometry_container_3d); + } else { + // If we are putting all geoms through the generic 3D mapper then only + // populate the deformed_non_linear container. + { + std::map> geoms; + get_all_elements_3d(particle_mesh_interface->graph, geoms); + for (auto gx : geoms) { + std::pair> + tmp = {gx.first, gx.second}; + geometry_container_3d.deformed_non_linear.push_back(tmp); + } + } + { + for (auto gx : particle_mesh_interface->remote_geoms_3d) { + geometry_container_3d.deformed_non_linear.push_back(gx); + } + } + } // Create a mapper for 3D regular geometry objects if (geometry_container_3d.regular.size()) { diff --git a/test/integration/nektar_interface/test_particle_advection.cpp b/test/integration/nektar_interface/test_particle_advection.cpp index f038b32d..f40a9e86 100644 --- a/test/integration/nektar_interface/test_particle_advection.cpp +++ b/test/integration/nektar_interface/test_particle_advection.cpp @@ -151,13 +151,13 @@ TEST(ParticleGeometryInterface, Advection2D) { mesh->free(); } -class ParticleAdvection3D : public testing::TestWithParam< - std::tuple> { -}; +class ParticleAdvection3D + : public testing::TestWithParam< + std::tuple> {}; TEST_P(ParticleAdvection3D, Advection3D) { // Test advecting particles between ranks - std::tuple param = GetParam(); + std::tuple param = GetParam(); const int N_total = 2000; const double tol = std::get<2>(param); @@ -178,10 +178,13 @@ TEST_P(ParticleAdvection3D, Advection3D) { auto sycl_target = std::make_shared(0, mesh->get_comm()); auto config = std::make_shared(); + config->set("MapParticlesNewton/newton_tol", 1.0e-10); // There are some pyramid corners that are hard to bin into with tighter // tolerances. config->set("MapParticlesNewton/contained_tol", 1.0e-2); + // Use the non-linear mapper for all geoms + config->set("MapParticles3D/all_generic_newton", std::get<3>(param)); auto nektar_graph_local_mapper = std::make_shared(sycl_target, mesh, config); @@ -319,20 +322,22 @@ TEST_P(ParticleAdvection3D, Advection3D) { INSTANTIATE_TEST_SUITE_P( MultipleMeshes, ParticleAdvection3D, - testing::Values(std::tuple( + testing::Values(std::tuple( "reference_all_types_cube/conditions.xml", "reference_all_types_cube/linear_non_regular_0.5.xml", - 1.0e-4 // The non-linear exit tolerance in Nektar is - // like (err_x * err_x - // + err_y * err_y) < 1.0e-8 - ), - std::tuple( + 1.0e-4, // The non-linear exit tolerance in Nektar is + // like (err_x * err_x + // + err_y * err_y) < 1.0e-8 + 0), + std::tuple( "reference_all_types_cube/conditions.xml", "reference_all_types_cube/mixed_ref_cube_0.5.xml", - 1.0e-10), - std::tuple( - "reference_all_types_cube/conditions.xml", "foo.xml", - 1.0e-4 // The non-linear exit tolerance in Nektar is - // like (err_x * err_x - // + err_y * err_y) < 1.0e-8 + 1.0e-10, 0), + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/linear_non_regular_0.5.xml", + 1.0e-4, // The non-linear exit tolerance in Nektar is + // like (err_x * err_x + // + err_y * err_y) < 1.0e-8 + 1 // Use the Generic3D mapper for the linear geoms. ))); From 4d652a0300550b9b8350ac4a4e377479ff1ba73d Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 17 Dec 2024 19:33:15 +0000 Subject: [PATCH 62/66] made Generic3D mapper robust to unaligned memory --- .../newton_generic_3d.hpp | 17 +- .../particle_cell_mapping/x_map_newton.hpp | 161 ++++++++---------- include/nektar_interface/utility_sycl.hpp | 14 ++ 3 files changed, 95 insertions(+), 97 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index a3ee2e3c..9caa8542 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -3,6 +3,7 @@ #include "../bary_interpolation/bary_evaluation.hpp" #include "../coordinate_mapping.hpp" +#include "../utility_sycl.hpp" #include "mapping_newton_iteration_base.hpp" #include @@ -136,7 +137,8 @@ struct MappingGeneric3D : MappingNewtonIterationBase { h_data->d_zbw = std::make_unique>(sycl_target, s_zbw); // Number of bytes required for local memory h_data->data_size_local = - (num_phys0 + num_phys1 + num_phys2) * sizeof(REAL); + (num_phys0 + num_phys1 + num_phys2) * sizeof(REAL) + + std::alignment_of::value; // store the pointers into the buffer we just made in the device struct so // that pointer arithmetric does not have to happen in the kernel but the @@ -187,7 +189,8 @@ struct MappingGeneric3D : MappingNewtonIterationBase { const Generic3D::DataDevice *d = static_cast(d_data); - REAL *div_space0 = static_cast(local_memory); + REAL *div_space0 = neso_cast_align_pointer( + local_memory, std::alignment_of::value); REAL *div_space1 = div_space0 + d->num_phys0; REAL *div_space2 = div_space1 + d->num_phys1; // The call to Newton step always follows a call to the residual @@ -234,12 +237,14 @@ struct MappingGeneric3D : MappingNewtonIterationBase { &eta2); // compute X at xi by evaluating the Bary interpolation at eta - REAL *div_space0 = static_cast(local_memory); + REAL *div_space0 = neso_cast_align_pointer( + local_memory, std::alignment_of::value); REAL *div_space1 = div_space0 + d->num_phys0; REAL *div_space2 = div_space1 + d->num_phys1; - Bary::preprocess_weights(d->num_phys0, eta0, d->z0, d->bw0, div_space0); - Bary::preprocess_weights(d->num_phys1, eta1, d->z1, d->bw1, div_space1); - Bary::preprocess_weights(d->num_phys2, eta2, d->z2, d->bw2, div_space2); + + Bary::preprocess_weights(d->num_phys0, eta0, d->z0, d->bw0, div_space0, 1); + Bary::preprocess_weights(d->num_phys1, eta1, d->z1, d->bw1, div_space1, 1); + Bary::preprocess_weights(d->num_phys2, eta2, d->z2, d->bw2, div_space2, 1); REAL X[3]; diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index c9a92890..a97b2d8c 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -1,6 +1,7 @@ #ifndef __X_MAP_NEWTON_H__ #define __X_MAP_NEWTON_H__ +#include "../utility_sycl.hpp" #include "x_map_newton_kernel.hpp" #include #include @@ -112,7 +113,7 @@ template class XMapNewton { inline void x(const REAL xi0, const REAL xi1, const REAL xi2, REAL *phys0, REAL *phys1, REAL *phys2) { - char *k_map_data; + char *k_map_data = nullptr; if (this->dh_data) { k_map_data = this->dh_data->d_buffer.ptr; } @@ -181,7 +182,7 @@ template class XMapNewton { const REAL contained_tol = 1.0e-10) { const int k_max_iterations = 51; - char *k_map_data; + char *k_map_data = nullptr; if (this->dh_data) { k_map_data = this->dh_data->d_buffer.ptr; } @@ -288,15 +289,15 @@ template class XMapNewton { std::array get_bounding_box(std::size_t grid_size = 32, const REAL pad_rel = 0.05, const REAL pad_abs = 0.0) { - char *k_map_data; + char *k_map_data = nullptr; if (this->dh_data) { k_map_data = this->dh_data->d_buffer.ptr; } NESOASSERT(this->dh_fdata != nullptr, "Bad pointer"); auto k_fdata = this->dh_fdata->d_buffer.ptr; NESOASSERT(k_fdata != nullptr, "Bad pointer"); - const std::size_t num_bytes_local = - std::max(this->num_bytes_local, sizeof(REAL)); + const std::size_t num_bytes_local = std::max( + this->num_bytes_local, sizeof(REAL) + std::alignment_of::value); // Get a local size which is a power of 2. const std::size_t local_size = @@ -308,10 +309,9 @@ template class XMapNewton { ->value)))); // make grid_size a multiple of the local size grid_size = get_next_multiple(grid_size, local_size); - sycl::range<3> range_local(1, local_size, local_size); - const std::size_t local_size_l = local_size * local_size; + sycl::range<1> range_local(local_size); // There are 6 faces on the collapsed reference cell - sycl::range<3> range_global(6, grid_size, grid_size); + sycl::range<1> range_global(grid_size * grid_size); const REAL k_width = 2.0 / static_cast(grid_size - 1); constexpr REAL kc[6][3] = { @@ -357,90 +357,69 @@ template class XMapNewton { } this->dh_fdata->host_to_device(); - this->sycl_target->queue - .submit([=](sycl::handler &cgh) { - sycl::local_accessor local_mem( - sycl::range<1>(num_bytes_local * local_size_l), cgh); - - cgh.parallel_for<>( - this->sycl_target->device_limits.validate_nd_range( - sycl::nd_range<3>(range_global, range_local)), - [=](auto idx) { - MappingNewtonIterationBase k_newton_type{}; - - const auto local_id = idx.get_local_linear_id(); - const auto iix = idx.get_global_id(2); - const auto iiy = idx.get_global_id(1); - const auto facex = idx.get_global_id(0); - const REAL gx = -1.0 + iix * k_width; - const REAL gy = -1.0 + iiy * k_width; - - const REAL eta0 = - kc[facex][0] + kcx[facex][0] * gx + kcy[facex][0] * gy; - const REAL eta1 = - kc[facex][1] + kcx[facex][1] * gx + kcy[facex][1] * gy; - const REAL eta2 = - kc[facex][2] + kcx[facex][2] * gx + kcy[facex][2] * gy; - - REAL k_xi0, k_xi1, k_xi2; - k_newton_type.loc_collapsed_to_loc_coord( - k_map_data, eta0, eta1, eta2, &k_xi0, &k_xi1, &k_xi2); - - REAL f[3] = {0.0, 0.0, 0.0}; - constexpr REAL p0 = 0.0; - constexpr REAL p1 = 0.0; - constexpr REAL p2 = 0.0; - - k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f, f + 1, - f + 2, &local_mem[local_id * num_bytes_local]); - - idx.barrier(sycl::access::fence_space::local_space); - - REAL *local_mem_real = - static_cast(static_cast(&local_mem[0])); - - // Do the reductions, we pessimistically do not use the builtin - // SYCL functions as we have used all the local memory already - // and the SYCL reduction functions also use local memory. - for (int dimx = 0; dimx < 3; dimx++) { - - // Tree reduce the maximum - local_mem_real[local_id] = f[dimx]; - for (int ix = local_size_l / 2; ix > 0; ix >>= 1) { - idx.barrier(sycl::access::fence_space::local_space); - if (local_id < ix) { - local_mem_real[local_id] = - sycl::max(local_mem_real[local_id + ix], - local_mem_real[local_id]); - } - } - if (local_id == 0) { - sycl::atomic_ref - ar(k_fdata[dimx + 3]); - auto check = ar.fetch_max(local_mem_real[0]); - } - // Tree reduce the minimum - local_mem_real[local_id] = f[dimx]; - for (int ix = local_size_l / 2; ix > 0; ix >>= 1) { - idx.barrier(sycl::access::fence_space::local_space); - if (local_id < ix) { - local_mem_real[local_id] = - sycl::min(local_mem_real[local_id + ix], - local_mem_real[local_id]); - } - } - if (local_id == 0) { - sycl::atomic_ref - ar(k_fdata[dimx]); - auto check = ar.fetch_min(local_mem_real[0]); - } + EventStack event_stack; + + for (std::size_t facex = 0; facex < 6; facex++) { + + event_stack.push(this->sycl_target->queue.submit([=](sycl::handler &cgh) { + sycl::local_accessor local_mem( + sycl::range<1>(num_bytes_local * local_size), cgh); + + cgh.parallel_for<>( + this->sycl_target->device_limits.validate_nd_range( + sycl::nd_range<1>(range_global, range_local)), + [=](auto idx) { + MappingNewtonIterationBase k_newton_type{}; + + const auto local_id = idx.get_local_linear_id(); + const std::size_t gid = idx.get_global_linear_id(); + + const auto iix = gid % grid_size; + const auto iiy = gid / grid_size; + const REAL gx = -1.0 + iix * k_width; + const REAL gy = -1.0 + iiy * k_width; + + const REAL eta0 = + kc[facex][0] + kcx[facex][0] * gx + kcy[facex][0] * gy; + const REAL eta1 = + kc[facex][1] + kcx[facex][1] * gx + kcy[facex][1] * gy; + const REAL eta2 = + kc[facex][2] + kcx[facex][2] * gx + kcy[facex][2] * gy; + + REAL k_xi0, k_xi1, k_xi2; + k_newton_type.loc_collapsed_to_loc_coord( + k_map_data, eta0, eta1, eta2, &k_xi0, &k_xi1, &k_xi2); + + REAL f[3] = {0.0, 0.0, 0.0}; + constexpr REAL p0 = 0.0; + constexpr REAL p1 = 0.0; + constexpr REAL p2 = 0.0; + + k_newton_type.newton_residual( + k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, f, f + 1, f + 2, + &local_mem[local_id * num_bytes_local]); + + //// Do the reductions, we pessimistically do not use the builtin + //// SYCL functions as we have used all the local memory already + //// and the SYCL reduction functions also use local memory. + for (int dimx = 0; dimx < 3; dimx++) { + { + sycl::atomic_ref + ar(k_fdata[dimx + 3]); + ar.fetch_max(f[dimx]); } - }); - }) - .wait_and_throw(); + { + sycl::atomic_ref + ar(k_fdata[dimx]); + ar.fetch_min(f[dimx]); + } + } + }); + })); + } + event_stack.wait(); this->dh_fdata->device_to_host(); std::array output; diff --git a/include/nektar_interface/utility_sycl.hpp b/include/nektar_interface/utility_sycl.hpp index fcfc6756..087fe0d5 100644 --- a/include/nektar_interface/utility_sycl.hpp +++ b/include/nektar_interface/utility_sycl.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include using namespace NESO::Particles; @@ -110,6 +111,19 @@ template inline T pad_to_vector_length(const T L) { } } +/** + * @param ptr Pointer to align to alignment. + * @param alignment Power of two to align to. + * @returns Aligned pointer. + */ +template +constexpr inline T *neso_cast_align_pointer(void *ptr, + const std::size_t alignment) { + std::size_t ptr_int = reinterpret_cast(ptr); + ptr_int = (ptr_int + (alignment - 1)) & -alignment; + return reinterpret_cast(ptr_int); +} + } // namespace NESO #endif From 134d31b8138d102ee363880b3fedc9a5d5906e61 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 18 Dec 2024 15:42:35 +0000 Subject: [PATCH 63/66] made mallocs for newton interfaces robust by using aligned mallocs --- .../map_particles_newton.hpp | 30 +++++++++++-------- .../newton_triangle_embed_3d.hpp | 1 + .../particle_cell_mapping/x_map_newton.hpp | 26 +++++++++------- neso-particles | 2 +- .../composite_collections.cpp | 26 +++++++++++----- 5 files changed, 54 insertions(+), 31 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp index d1b4cf72..fb6a5c45 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -64,9 +64,9 @@ class MapParticlesNewton : public CoarseMappersBase { const int ndim; /// The data required to perform newton iterations for each geom on the /// device. - std::unique_ptr> dh_data; + std::unique_ptr> dh_data; /// The data required to perform newton iterations for each geom on the host. - std::vector h_data; + std::unique_ptr> h_data; /// The Newton iteration class. MappingNewtonIterationBase newton_type; const std::size_t num_bytes_per_map_device; @@ -82,7 +82,7 @@ class MapParticlesNewton : public CoarseMappersBase { : nullptr; auto h_data_ptr = (this->num_bytes_per_map_host) - ? this->h_data.data() + index * this->num_bytes_per_map_host + ? this->h_data->ptr + index * this->num_bytes_per_map_host : nullptr; this->newton_type.write_data(this->sycl_target, geom, h_data_ptr, @@ -96,7 +96,7 @@ class MapParticlesNewton : public CoarseMappersBase { for (int index = 0; index < num_geoms; index++) { auto h_data_ptr = (this->num_bytes_per_map_host) - ? this->h_data.data() + index * this->num_bytes_per_map_host + ? this->h_data->ptr + index * this->num_bytes_per_map_host : nullptr; this->newton_type.free_data(h_data_ptr); } @@ -125,8 +125,12 @@ class MapParticlesNewton : public CoarseMappersBase { std::vector> &geoms_remote, ParameterStoreSharedPtr config = std::make_shared()) : CoarseMappersBase(sycl_target), newton_type(newton_type), - num_bytes_per_map_device(newton_type.data_size_device()), - num_bytes_per_map_host(newton_type.data_size_host()), + num_bytes_per_map_device( + get_next_multiple(newton_type.data_size_device(), + std::alignment_of::value)), + num_bytes_per_map_host( + get_next_multiple(newton_type.data_size_host(), + std::alignment_of::value)), ndim(newton_type.get_ndim()) { this->newton_tol = @@ -161,12 +165,14 @@ class MapParticlesNewton : public CoarseMappersBase { std::make_unique>(this->sycl_target, num_geoms); if (this->num_bytes_per_map_device) { - this->dh_data = std::make_unique>( - this->sycl_target, num_geoms * this->num_bytes_per_map_device); + this->dh_data = std::make_unique>( + this->sycl_target, num_geoms * this->num_bytes_per_map_device, + std::alignment_of::value); } if (this->num_bytes_per_map_host) { - this->h_data = - std::vector(num_geoms * this->num_bytes_per_map_host); + this->h_data = std::make_unique>( + this->sycl_target, num_geoms * this->num_bytes_per_map_host, + std::alignment_of::value); } const int index_tri = shape_type_to_int(eTriangle); @@ -322,7 +328,7 @@ class MapParticlesNewton : public CoarseMappersBase { const int geom_map_index = k_map[linear_mesh_cell * k_map_stride + candidate_cell]; - const char *map_data = + const std::byte *map_data = (k_num_bytes_per_map_device) ? &k_map_data[geom_map_index * k_num_bytes_per_map_device] : nullptr; @@ -477,7 +483,7 @@ class MapParticlesNewton : public CoarseMappersBase { const int geom_map_index = k_map[linear_mesh_cell * k_map_stride + candidate_cell]; - const char *map_data = + const std::byte *map_data = (k_num_bytes_per_map_device) ? &k_map_data[geom_map_index * k_num_bytes_per_map_device] : nullptr; diff --git a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp index da4aae53..a997e4c5 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp @@ -1,6 +1,7 @@ #ifndef ___NESO_PARTICLE_MAPPING_NEWTON_TRIANGLE_EMBED_3D_H__ #define ___NESO_PARTICLE_MAPPING_NEWTON_TRIANGLE_EMBED_3D_H__ +#include "../coordinate_mapping.hpp" #include "nektar_interface/special_functions.hpp" #include "generated_linear/linear_newton_implementation.hpp" diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index a97b2d8c..907412a6 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -30,11 +30,12 @@ template class XMapNewton { /// The data required to perform newton iterations for each geom on the /// device. - std::unique_ptr> dh_data; + std::unique_ptr> dh_data; + /// The data required to perform newton iterations for each geom on the host. + std::unique_ptr> h_data; std::unique_ptr> dh_fdata; - /// The data required to perform newton iterations for each geom on the host. - std::vector h_data; + std::size_t num_bytes_local; // variables for higher order grids @@ -44,17 +45,20 @@ template class XMapNewton { template inline void write_data(U &geom) { if (this->num_bytes_per_map_host) { - this->h_data = std::vector(this->num_bytes_per_map_host); + this->h_data = std::make_unique>( + this->sycl_target, this->num_bytes_per_map_host, + std::alignment_of::value); } if (this->num_bytes_per_map_device) { - this->dh_data = std::make_unique>( - this->sycl_target, this->num_bytes_per_map_device); + this->dh_data = std::make_unique>( + this->sycl_target, this->num_bytes_per_map_device, + std::alignment_of::value); } auto d_data_ptr = (this->num_bytes_per_map_device) ? this->dh_data->h_buffer.ptr : nullptr; auto h_data_ptr = - (this->num_bytes_per_map_host) ? this->h_data.data() : nullptr; + (this->num_bytes_per_map_host) ? this->h_data->ptr : nullptr; this->newton_type.write_data(this->sycl_target, geom, h_data_ptr, d_data_ptr); @@ -73,7 +77,7 @@ template class XMapNewton { public: ~XMapNewton() { auto h_data_ptr = - (this->num_bytes_per_map_host) ? this->h_data.data() : nullptr; + (this->num_bytes_per_map_host) ? this->h_data->ptr : nullptr; this->newton_type.free_data(h_data_ptr); } @@ -113,7 +117,7 @@ template class XMapNewton { inline void x(const REAL xi0, const REAL xi1, const REAL xi2, REAL *phys0, REAL *phys1, REAL *phys2) { - char *k_map_data = nullptr; + std::byte *k_map_data = nullptr; if (this->dh_data) { k_map_data = this->dh_data->d_buffer.ptr; } @@ -182,7 +186,7 @@ template class XMapNewton { const REAL contained_tol = 1.0e-10) { const int k_max_iterations = 51; - char *k_map_data = nullptr; + std::byte *k_map_data = nullptr; if (this->dh_data) { k_map_data = this->dh_data->d_buffer.ptr; } @@ -289,7 +293,7 @@ template class XMapNewton { std::array get_bounding_box(std::size_t grid_size = 32, const REAL pad_rel = 0.05, const REAL pad_abs = 0.0) { - char *k_map_data = nullptr; + std::byte *k_map_data = nullptr; if (this->dh_data) { k_map_data = this->dh_data->d_buffer.ptr; } diff --git a/neso-particles b/neso-particles index 9097d541..dc5cb6d5 160000 --- a/neso-particles +++ b/neso-particles @@ -1 +1 @@ -Subproject commit 9097d541e64760c67f5f717b04502299f7c3b264 +Subproject commit dc5cb6d5d570ce6cd54bfc94cec29e0a54c200e1 diff --git a/src/nektar_interface/composite_interaction/composite_collections.cpp b/src/nektar_interface/composite_interaction/composite_collections.cpp index c40db14c..71bc7adf 100644 --- a/src/nektar_interface/composite_interaction/composite_collections.cpp +++ b/src/nektar_interface/composite_interaction/composite_collections.cpp @@ -57,8 +57,12 @@ void CompositeCollections::collect_cell(const INT cell) { Newton::MappingQuadLinear2DEmbed3D mapper_quads{}; Newton::MappingTriangleLinear2DEmbed3D mapper_tris{}; - const int stride_quads = mapper_quads.data_size_device(); - const int stride_tris = mapper_tris.data_size_device(); + const int stride_quads = + get_next_multiple(mapper_quads.data_size_device(), + std::alignment_of::value); + const int stride_tris = + get_next_multiple(mapper_tris.data_size_device(), + std::alignment_of::value); NESOASSERT(mapper_quads.data_size_host() == 0, "Expected 0 host bytes required for this mapper."); NESOASSERT(mapper_tris.data_size_host() == 0, @@ -69,12 +73,16 @@ void CompositeCollections::collect_cell(const INT cell) { const int num_bytes = stride_quads * num_quads + stride_tris * num_tris; const int offset_tris = stride_quads * num_quads; - std::vector buf(num_bytes); + auto h_buf = std::make_shared>( + this->sycl_target, num_bytes, + std::alignment_of::value); + std::vector buf_lpi{}; buf_lpi.reserve(num_quads + num_tris); - unsigned char *map_data_quads = buf.data(); - unsigned char *map_data_tris = buf.data() + offset_tris; + unsigned char *map_data_quads = h_buf->ptr; + unsigned char *map_data_tris = h_buf->ptr + offset_tris; + std::vector composite_ids(num_quads + num_tris); std::vector geom_ids(num_quads + num_tris); @@ -122,8 +130,12 @@ void CompositeCollections::collect_cell(const INT cell) { } // create a device buffer from the vector - auto d_buf = - std::make_shared>(this->sycl_target, buf); + auto d_buf = std::make_shared>( + this->sycl_target, num_bytes, + std::alignment_of::value); + + buffer_memcpy(*d_buf, *h_buf).wait_and_throw(); + this->stack_geometry_data.push(d_buf); unsigned char *d_ptr = d_buf->ptr; From a873d721c3198f6e7730c13277d5c4c86f6c5a69 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Wed, 18 Dec 2024 17:00:45 +0000 Subject: [PATCH 64/66] fixed uninitialised memory usage in Generic3D geometry mapper --- .../particle_cell_mapping/newton_generic_3d.hpp | 5 ++++- .../nektar_interface/particle_cell_mapping/x_map_newton.hpp | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp index 9caa8542..0a6fedde 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_generic_3d.hpp @@ -41,7 +41,10 @@ struct MappingGeneric3D : MappingNewtonIterationBase { inline void write_data_v(SYCLTargetSharedPtr sycl_target, GeometrySharedPtr geom, void *data_host, void *data_device) { - Generic3D::DataHost *h_data = static_cast(data_host); + + // We need to actually construct a DataHost at this pointer + Generic3D::DataHost *h_data = new (data_host) Generic3D::DataHost; + Generic3D::DataDevice *d_data = static_cast(data_device); diff --git a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp index 907412a6..4df0988b 100644 --- a/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton.hpp @@ -59,7 +59,6 @@ template class XMapNewton { : nullptr; auto h_data_ptr = (this->num_bytes_per_map_host) ? this->h_data->ptr : nullptr; - this->newton_type.write_data(this->sycl_target, geom, h_data_ptr, d_data_ptr); From 3d40aaa272648c1d23de72072a0c6ea363fb598e Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Mon, 6 Jan 2025 17:20:49 +0000 Subject: [PATCH 65/66] added integration test for particle advection on second order mesh --- .../test_particle_advection.cpp | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) diff --git a/test/integration/nektar_interface/test_particle_advection.cpp b/test/integration/nektar_interface/test_particle_advection.cpp index f40a9e86..1300d2c3 100644 --- a/test/integration/nektar_interface/test_particle_advection.cpp +++ b/test/integration/nektar_interface/test_particle_advection.cpp @@ -341,3 +341,181 @@ INSTANTIATE_TEST_SUITE_P( // + err_y * err_y) < 1.0e-8 1 // Use the Generic3D mapper for the linear geoms. ))); + +TEST(ParticleAdvection3D, Torus) { + // Test advecting particles between ranks + + const int N_per_element = 10; + const double tol = 1.0e-4; + + TestUtilities::TestResourceSession resource_session( + "torus/quarter_torus_tets_order_2.xml", "torus/conditions.xml"); + const REAL torus_radius_major = 5.0; + const REAL torus_radius_minor = 1.9; + + // Create session reader. + auto session = resource_session.session; + auto graph = SpatialDomains::MeshGraphIO::Read(session); + + std::map> geoms_3d; + get_all_elements_3d(graph, geoms_3d); + + auto mesh = std::make_shared(graph); + extend_halos_fixed_offset(1, mesh); + auto sycl_target = std::make_shared(0, mesh->get_comm()); + + auto config = std::make_shared(); + + config->set("MapParticlesNewton/newton_tol", 1.0e-10); + // There are some pyramid corners that are hard to bin into with tighter + // tolerances. + config->set("MapParticlesNewton/contained_tol", 1.0e-2); + // Use the non-linear mapper for all geoms + config->set("MapParticles3D/all_generic_newton", 1); + + auto nektar_graph_local_mapper = + std::make_shared(sycl_target, mesh, config); + + auto domain = std::make_shared(mesh, nektar_graph_local_mapper); + + const int ndim = 3; + ParticleSpec particle_spec{ParticleProp(Sym("P"), ndim, true), + ParticleProp(Sym("V"), 3), + ParticleProp(Sym("CELL_ID"), 1, true), + ParticleProp(Sym("ID"), 2)}; + + auto A = std::make_shared(domain, particle_spec, sycl_target); + CellIDTranslation cell_id_translation(sycl_target, A->cell_id_dat, mesh); + + const int rank = sycl_target->comm_pair.rank_parent; + const int size = sycl_target->comm_pair.size_parent; + + std::mt19937 rng_pos(52234234 + rank); + std::mt19937 rng_vel(52234231 + rank); + + const int Nsteps = 400; + const REAL dt = 0.1; + const int cell_count = domain->mesh->get_cell_count(); + + std::vector> positions; + std::vector cells; + + rng_pos = uniform_within_elements(graph, N_per_element, positions, cells, + 1.0e-4, rng_pos); + + const int N = cells.size(); + + auto velocities = + NESO::Particles::normal_distribution(N, 3, 0.0, 0.5, rng_vel); + std::uniform_int_distribution uniform_dist( + 0, sycl_target->comm_pair.size_parent - 1); + ParticleSet initial_distribution(N, A->get_particle_spec()); + for (int px = 0; px < N; px++) { + for (int dimx = 0; dimx < ndim; dimx++) { + const double pos_orig = positions.at(dimx).at(px); + initial_distribution[Sym("P")][px][dimx] = pos_orig; + } + for (int dimx = 0; dimx < 3; dimx++) { + initial_distribution[Sym("V")][px][dimx] = + velocities.at(dimx).at(px); + } + initial_distribution[Sym("CELL_ID")][px][0] = cells.at(px); + initial_distribution[Sym("ID")][px][0] = rank; + initial_distribution[Sym("ID")][px][1] = px; + initial_distribution[Sym("NESO_MPI_RANK")][px][0] = rank; + } + A->add_particles_local(initial_distribution); + + reset_mpi_ranks((*A)[Sym("NESO_MPI_RANK")]); + + auto lambda_advect = [&] { + auto t0 = profile_timestamp(); + particle_loop( + A, + [=](auto P, auto V) { + for (int dimx = 0; dimx < ndim; dimx++) { + P.at(dimx) += dt * V.at(dimx); + } + }, + Access::write(Sym("P")), Access::read(Sym("V"))) + ->execute(); + sycl_target->profile_map.inc("Advect", "Execute", 1, + profile_elapsed(t0, profile_timestamp())); + }; + + auto lambda_check_owning_cell = [&] { + Array global_coord(3); + Array xi(3); + Array eta(3); + for (int cellx = 0; cellx < cell_count; cellx++) { + + auto positions = A->position_dat->cell_dat.get_cell(cellx); + auto cell_ids = A->cell_id_dat->cell_dat.get_cell(cellx); + auto reference_positions = + A->get_cell(Sym("NESO_REFERENCE_POSITIONS"), cellx); + + const int cell_nektar = cell_id_translation.map_to_nektar[cellx]; + auto geom = geoms_3d[cell_nektar]; + + int shape_type = geom->GetShapeType(); + Newton::XMapNewton mapper(sycl_target, geom); + + for (int rowx = 0; rowx < cell_ids->nrow; rowx++) { + const int cell_neso = (*cell_ids)[0][rowx]; + ASSERT_EQ(cell_neso, cellx); + + xi[0] = reference_positions->at(rowx, 0); + xi[1] = reference_positions->at(rowx, 1); + xi[2] = reference_positions->at(rowx, 2); + global_coord[0] = geom->GetCoord(0, xi); + global_coord[1] = geom->GetCoord(1, xi); + global_coord[2] = geom->GetCoord(2, xi); + + // check the global coordinate matches the one on the particle + for (int dimx = 0; dimx < ndim; dimx++) { + const double err_abs = + ABS(positions->at(rowx, dimx) - global_coord[dimx]); + const double err_rel = + err_abs > 0.0 ? err_abs / std::abs(global_coord[dimx]) : err_abs; + ASSERT_TRUE((err_abs <= tol) || (err_rel <= tol)); + ASSERT_TRUE(std::fabs((double)eta[dimx]) < (1.0 + tol)); + } + } + } + }; + + auto boundary_loop = particle_loop( + "boundary_loop", A, + [=](auto P) { + REAL x = P.at(0); + REAL y = P.at(1); + REAL z = P.at(2); + REAL r, phi, theta; + ExternalCommon::cartesian_to_torus_cylindrical(torus_radius_major, x, y, + z, &r, &phi, &theta); + + const REAL test_pi = 3.14159265358979323846; + phi = Kernel::fmod(phi + 2.0 * test_pi, 0.5 * test_pi); + r = Kernel::fmod(r, torus_radius_minor); + + ExternalCommon::torus_cylindrical_to_cartesian(torus_radius_major, r, + phi, theta, &x, &y, &z); + P.at(0) = x; + P.at(1) = y; + P.at(2) = z; + }, + Access::write(Sym("P"))); + + REAL T = 0.0; + for (int stepx = 0; stepx < Nsteps; stepx++) { + boundary_loop->execute(); + A->hybrid_move(); + cell_id_translation.execute(); + A->cell_move(); + lambda_check_owning_cell(); + lambda_advect(); + T += dt; + } + + mesh->free(); +} From fe4052fad844d79260dde9143767ec7624e00f26 Mon Sep 17 00:00:00 2001 From: Will Saunders Date: Tue, 7 Jan 2025 14:44:33 +0000 Subject: [PATCH 66/66] updated NP submodule --- neso-particles | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neso-particles b/neso-particles index dc5cb6d5..ddedc7fa 160000 --- a/neso-particles +++ b/neso-particles @@ -1 +1 @@ -Subproject commit dc5cb6d5d570ce6cd54bfc94cec29e0a54c200e1 +Subproject commit ddedc7fae3e0c96595fcc831c2fe73984fb69a70