diff --git a/CMakeLists.txt b/CMakeLists.txt index 0587f20b..ea975b54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,11 +110,16 @@ set(LIB_SRC_FILES ${SRC_DIR}/linear_interpolator_1D.cpp ${SRC_DIR}/mesh.cpp ${SRC_DIR}/nektar_interface/basis_reference.cpp + ${SRC_DIR}/nektar_interface/composite_interaction/composite_collections.cpp + ${SRC_DIR}/nektar_interface/composite_interaction/composite_intersection.cpp + ${SRC_DIR}/nektar_interface/composite_interaction/composite_utility.cpp + ${SRC_DIR}/nektar_interface/composite_interaction/composite_transport.cpp ${SRC_DIR}/nektar_interface/expansion_looping/jacobi_coeff_mod_basis.cpp ${SRC_DIR}/nektar_interface/function_evaluation.cpp ${SRC_DIR}/nektar_interface/geometry_transport/geometry_transport_2d.cpp ${SRC_DIR}/nektar_interface/geometry_transport/geometry_transport_3d.cpp ${SRC_DIR}/nektar_interface/geometry_transport/halo_extension.cpp + ${SRC_DIR}/nektar_interface/particle_boundary_conditions.cpp ${SRC_DIR}/nektar_interface/particle_cell_mapping/map_particles_2d.cpp ${SRC_DIR}/nektar_interface/particle_cell_mapping/map_particles_2d_regular.cpp ${SRC_DIR}/nektar_interface/particle_cell_mapping/map_particles_3d.cpp @@ -122,6 +127,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/utilities.cpp ${SRC_DIR}/nektar_interface/solver_base/partsys_base.cpp ${SRC_DIR}/plasma.cpp ${SRC_DIR}/run_info.cpp @@ -148,6 +154,14 @@ set(HEADER_FILES ${INC_DIR}/nektar_interface/bounding_box_intersection.hpp ${INC_DIR}/nektar_interface/cell_id_translation.hpp ${INC_DIR}/nektar_interface/coordinate_mapping.hpp + ${INC_DIR}/nektar_interface/composite_interaction/composite_collection.hpp + ${INC_DIR}/nektar_interface/composite_interaction/composite_collections.hpp + ${INC_DIR}/nektar_interface/composite_interaction/composite_interaction.hpp + ${INC_DIR}/nektar_interface/composite_interaction/composite_intersection.hpp + ${INC_DIR}/nektar_interface/composite_interaction/composite_utility.hpp + ${INC_DIR}/nektar_interface/composite_interaction/composite_transport.hpp + ${INC_DIR}/nektar_interface/composite_interaction/line_plane_intersection.hpp + ${INC_DIR}/nektar_interface/composite_interaction/line_line_intersection.hpp ${INC_DIR}/nektar_interface/solver_base/eqnsys_base.hpp ${INC_DIR}/nektar_interface/expansion_looping/basis_evaluate_base.hpp ${INC_DIR}/nektar_interface/expansion_looping/expansion_looping.hpp @@ -165,6 +179,7 @@ set(HEADER_FILES ${INC_DIR}/nektar_interface/function_basis_projection.hpp ${INC_DIR}/nektar_interface/function_evaluation.hpp ${INC_DIR}/nektar_interface/function_projection.hpp + ${INC_DIR}/nektar_interface/geometry_transport/geometry_packing_utility.hpp ${INC_DIR}/nektar_interface/geometry_transport/geometry_container_3d.hpp ${INC_DIR}/nektar_interface/geometry_transport/geometry_local_remote_3d.hpp ${INC_DIR}/nektar_interface/geometry_transport/geometry_transport.hpp @@ -174,6 +189,7 @@ set(HEADER_FILES ${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 + ${INC_DIR}/nektar_interface/geometry_transport/remote_geom.hpp ${INC_DIR}/nektar_interface/geometry_transport/remote_geom_2d.hpp ${INC_DIR}/nektar_interface/geometry_transport/remote_geom_3d.hpp ${INC_DIR}/nektar_interface/geometry_transport/shape_mapping.hpp @@ -187,6 +203,7 @@ set(HEADER_FILES ${INC_DIR}/nektar_interface/particle_cell_mapping/generated_linear/prism.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/generated_linear/pyramid.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/generated_linear/quadrilateral.hpp + ${INC_DIR}/nektar_interface/particle_cell_mapping/generated_linear/quadrilateralembed3d.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/generated_linear/tetrahedron.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/map_particles_2d.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/map_particles_2d_regular.hpp @@ -202,6 +219,8 @@ set(HEADER_FILES ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_prism.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_pyr.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_quad.hpp + ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp + ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/newton_tet.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/particle_cell_mapping.hpp ${INC_DIR}/nektar_interface/particle_cell_mapping/particle_cell_mapping_2d.hpp @@ -209,10 +228,12 @@ set(HEADER_FILES ${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_newton.hpp + ${INC_DIR}/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp ${INC_DIR}/nektar_interface/particle_interface.hpp ${INC_DIR}/nektar_interface/particle_mesh_interface.hpp ${INC_DIR}/nektar_interface/special_functions.hpp ${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_cartesian.hpp ${INC_DIR}/nektar_interface/utility_mesh_plotting.hpp diff --git a/NESO-Spack b/NESO-Spack index 7b0f35db..90b3c9ba 160000 --- a/NESO-Spack +++ b/NESO-Spack @@ -1 +1 @@ -Subproject commit 7b0f35dba288b7cd57d06ae1a07821fd194595f8 +Subproject commit 90b3c9ba0789b4add1d711b3be56d70d82eaa5a4 diff --git a/include/nektar_interface/cell_id_translation.hpp b/include/nektar_interface/cell_id_translation.hpp index 562c856f..a3001d34 100644 --- a/include/nektar_interface/cell_id_translation.hpp +++ b/include/nektar_interface/cell_id_translation.hpp @@ -128,32 +128,18 @@ class CellIDTranslation { */ inline void execute() { auto t0 = profile_timestamp(); - - auto pl_iter_range = this->cell_id_dat->get_particle_loop_iter_range(); - auto pl_stride = this->cell_id_dat->get_particle_loop_cell_stride(); - auto pl_npart_cell = this->cell_id_dat->get_particle_loop_npart_cell(); - - auto k_cell_id_dat = this->cell_id_dat->cell_dat.device_ptr(); const auto k_lookup_map = this->id_map.d_buffer.ptr; const INT k_shift = this->shift; - - this->sycl_target->queue - .submit([&](sycl::handler &cgh) { - cgh.parallel_for<>( - sycl::range<1>(pl_iter_range), [=](sycl::id<1> idx) { - NESO_PARTICLES_KERNEL_START - const INT cellx = NESO_PARTICLES_KERNEL_CELL; - const INT layerx = NESO_PARTICLES_KERNEL_LAYER; - - const INT nektar_cell = k_cell_id_dat[cellx][0][layerx]; - const INT shifted_nektar_cell = nektar_cell - k_shift; - const INT neso_cell = k_lookup_map[shifted_nektar_cell]; - k_cell_id_dat[cellx][0][layerx] = neso_cell; - - NESO_PARTICLES_KERNEL_END - }); - }) - .wait_and_throw(); + particle_loop( + "CellIDTranslation::execute", this->cell_id_dat, + [=](auto k_cell_id_dat) { + const INT nektar_cell = k_cell_id_dat.at(0); + const INT shifted_nektar_cell = nektar_cell - k_shift; + const INT neso_cell = k_lookup_map[shifted_nektar_cell]; + k_cell_id_dat.at(0) = neso_cell; + }, + Access::write(this->cell_id_dat)) + ->execute(); sycl_target->profile_map.inc("CellIDTranslation", "execute", 1, profile_elapsed(t0, profile_timestamp())); }; diff --git a/include/nektar_interface/composite_interaction/composite_collection.hpp b/include/nektar_interface/composite_interaction/composite_collection.hpp new file mode 100644 index 00000000..434ffae6 --- /dev/null +++ b/include/nektar_interface/composite_interaction/composite_collection.hpp @@ -0,0 +1,39 @@ +#ifndef __NEKTAR_INTERFACE_COMPOSITE_INTERACTION_COMPOSITE_COLLECTION_H_ +#define __NEKTAR_INTERFACE_COMPOSITE_INTERACTION_COMPOSITE_COLLECTION_H_ + +#include "line_line_intersection.hpp" +#include "line_plane_intersection.hpp" + +namespace NESO::CompositeInteraction { + +/** + * Struct pointed to by a BlockedBinaryTree for each MeshHierarchy cell. + */ +struct CompositeCollection { + // Face members + int num_quads; + int num_tris; + LinePlaneIntersection *lpi_quads; + LinePlaneIntersection *lpi_tris; + size_t stride_quads; + size_t stride_tris; + unsigned char *buf_quads; + unsigned char *buf_tris; + int *composite_ids_quads; + int *composite_ids_tris; + int *geom_ids_quads; + int *geom_ids_tris; + // Segment members + int num_segments; + LineLineIntersection *lli_segments; + int *composite_ids_segments; + int *geom_ids_segments; + // group ids + int *group_ids_quads; + int *group_ids_tris; + int *group_ids_segments; +}; + +} // namespace NESO::CompositeInteraction + +#endif diff --git a/include/nektar_interface/composite_interaction/composite_collections.hpp b/include/nektar_interface/composite_interaction/composite_collections.hpp new file mode 100644 index 00000000..64a879a9 --- /dev/null +++ b/include/nektar_interface/composite_interaction/composite_collections.hpp @@ -0,0 +1,161 @@ +#ifndef __NEKTAR_INTERFACE_COMPOSITE_INTERACTION_COMPOSITE_COLLECTIONS_H_ +#define __NEKTAR_INTERFACE_COMPOSITE_INTERACTION_COMPOSITE_COLLECTIONS_H_ + +#include +using namespace Nektar; + +#include "composite_collection.hpp" +#include "composite_transport.hpp" +#include "composite_utility.hpp" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace NESO::CompositeInteraction { + +/** + * Type to point to the normal vector for a boundary element. + */ +struct NormalData { + REAL *d_normal; +}; + +/** + * Device type to help finding the normal vector for a particle-boundary + * interaction. + */ +struct NormalMapper { + // Root of the tree containing normal data. + BlockedBinaryNode *root; + + /** + * Get a pointer to the normal data for an edge element. + * + * @param[in] global_id Global index of boundary element to retrive normal + * for. + * @param[in, out] normal Pointer to populate with address of normal vector. + * @returns True if the boundary element is found otherwise false. + */ + inline bool get(const INT global_id, REAL **normal) const { + NormalData *node; + bool *exists; + const bool e = root->get_location(global_id, &exists, &node); + *normal = node->d_normal; + return e && (*exists); + } +}; + +/** + * Distributed data structure to hold the geometry information that intersects + * each Mesh Hierarchy cell. + */ +class CompositeCollections { +protected: + ParticleMeshInterfaceSharedPtr particle_mesh_interface; + + // Stack for device buffers (Newton X mapping data) + std::stack>> stack_geometry_data; + // Stack for device buffers (LinePlaneIntersections) + std::stack>> + stack_lpi_data; + // Stack for device buffers (LineLineIntersections) + std::stack>> + stack_lli_data; + // Stack for the device buffers (CompositeCollection) + std::stack>> + stack_collection_data; + // Stack for the device buffers (composite ids) + std::stack>> stack_composite_ids; + // stack for device buffers (REAL data) + std::stack>> stack_real; + + // Cells already collected. + std::set collected_cells; + + /** + * This method takes the packed geoms and creates the node the in blocked + * binary tree such that the kernel can access the geometry info. + */ + void collect_cell(const INT cell); + + /// The normal data for each geometry object collected. + std::shared_ptr> map_normals; + + /// Inverse map from composite to boundary group. + std::map map_composite_to_group; + +public: + /// Disable (implicit) copies. + CompositeCollections(const CompositeCollections &st) = delete; + /// Disable (implicit) copies. + CompositeCollections &operator=(CompositeCollections const &a) = delete; + + /// SYCLTarget to use for computation. + SYCLTargetSharedPtr sycl_target; + + /// Map from composites to geometry objects held. + std::map>> + map_composites_to_geoms; + + /// The composite transport instance. + std::shared_ptr composite_transport; + + /// The container that holds the map from MeshHierarchy cells to the geometry + /// objects for the composites in those cells (faces). + std::shared_ptr> + map_cells_collections; + + /// Map from boundary group id to composites in the group. + std::map> boundary_groups; + + /// Maximum number of modes for X maps. + int max_num_modes; + + /** + * Free the data structure. Must be called collectively on the communicator. + */ + void free(); + + /** + * Create new distributed container for geometry objects which are members + * of the passed composite indices. + * + * @param sycl_target Compute device on which intersection computation will + * take place. + * @param particle_mesh_interface ParticleMeshInterface for the domain. + * @param boundary_groups Map from boundary group id to composite ids which + * form the group. + */ + CompositeCollections(SYCLTargetSharedPtr sycl_target, + ParticleMeshInterfaceSharedPtr particle_mesh_interface, + std::map> boundary_groups); + + /** + * Must be called collectively on the communicator. Collect on this MPI rank + * all the geometry objects which intersect certain MeshHierarchy cells. + * + * @param cells MeshHierarchy cells to collect all geometry objects for. + */ + void collect_geometry(std::set &cells); + + /** + * Get a device callable mapper to map from global boundary indices to normal + * vectors. This method should be called after @ref collect_geometry as the + * map is populated with potentially relvant normal data on the fly. + * + * @returns Device copyable and callable mapper. + */ + NormalMapper get_device_normal_mapper(); +}; + +} // namespace NESO::CompositeInteraction + +#endif diff --git a/include/nektar_interface/composite_interaction/composite_interaction.hpp b/include/nektar_interface/composite_interaction/composite_interaction.hpp new file mode 100644 index 00000000..76359d86 --- /dev/null +++ b/include/nektar_interface/composite_interaction/composite_interaction.hpp @@ -0,0 +1,8 @@ +#ifndef __COMPOSITE_INTERACTION_H_ +#define __COMPOSITE_INTERACTION_H_ + +#include "composite_intersection.hpp" +#include "line_line_intersection.hpp" +#include "line_plane_intersection.hpp" + +#endif diff --git a/include/nektar_interface/composite_interaction/composite_intersection.hpp b/include/nektar_interface/composite_interaction/composite_intersection.hpp new file mode 100644 index 00000000..9ff493f1 --- /dev/null +++ b/include/nektar_interface/composite_interaction/composite_intersection.hpp @@ -0,0 +1,179 @@ +#ifndef __COMPOSITE_INTERSECTION_H_ +#define __COMPOSITE_INTERSECTION_H_ + +#include +using namespace Nektar; + +#include +#include +#include +#include +#include + +#include "composite_collections.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace NESO::CompositeInteraction { + +/** + * High-level class to detect and compute the intersection of a particle + * trajectory and a Nektar++ composite. + */ +class CompositeIntersection { +protected: + const int ndim; + const int num_cells; + ParticleMeshInterfaceSharedPtr particle_mesh_interface; + std::unique_ptr> d_cell_min_maxes; + std::unique_ptr mesh_hierarchy_mapper; + std::unique_ptr> dh_max_bounding_box_size; + std::unique_ptr> dh_mh_cells; + std::unique_ptr> dh_mh_cells_index; + /// Tolerance for line-line intersections + REAL line_intersection_tol; + /// Exit tolerance for Newton iteration. + REAL newton_tol; + /// Maximum number of Newton iterations. + INT newton_max_iteration; + /// Tolerance to determine if a reference point is in [-1, 1] + REAL contained_tol; + /// Modifier for grid size in reference space. + int num_modes_factor; + + template inline void check_iteration_set(std::shared_ptr) { + static_assert(std::is_same_v || + std::is_same_v); + } + + inline ParticleGroupSharedPtr + get_particle_group(ParticleGroupSharedPtr iteration_set) { + return iteration_set; + } + inline ParticleGroupSharedPtr + get_particle_group(ParticleSubGroupSharedPtr iteration_set) { + return iteration_set->get_particle_group(); + } + + template + void find_cells(std::shared_ptr iteration_set, std::set &cells); + + template + void find_intersections_2d(std::shared_ptr iteration_set, + ParticleDatSharedPtr dat_composite, + ParticleDatSharedPtr dat_positions); + template + void find_intersections_3d(std::shared_ptr iteration_set, + ParticleDatSharedPtr dat_composite, + ParticleDatSharedPtr dat_positions); + + static constexpr INT mask = std::numeric_limits::lowest(); + +public: + /// The CompositeCollections used to detect intersections. + std::shared_ptr composite_collections; + /// Disable (implicit) copies. + CompositeIntersection(const CompositeIntersection &st) = delete; + /// Disable (implicit) copies. + CompositeIntersection &operator=(CompositeIntersection const &a) = delete; + + /// SYCLTarget to use for computation. + SYCLTargetSharedPtr sycl_target; + + /// The NESO::Particles Sym used to store the previous particle + /// position. + const static inline Sym previous_position_sym = + Sym("NESO_COMP_INT_PREV_POS"); + + const static inline std::string output_sym_position_name = + "NESO_COMP_INT_OUTPUT_POS"; + const static inline std::string output_sym_composite_name = + "NESO_COMP_INT_OUTPUT_COMP"; + + /// Map from boundary group id to composites in the group. + std::map> boundary_groups; + + /** + * Free the intersection object. Must be called collectively on the + * communicator. + */ + void free(); + + /** + * Create a new intersection object for a compute device, mesh and vector of + * composite indices. + * + * @param sycl_target Compute device to find intersections on. + * @param particle_mesh_interface Mesh interface all particle groups will be + * based on. + * @param boundary_groups Map from boundary group id to composite ids which + * form the group. + * @param config Optional configuration for intersection algorithms, e.g. + * Newton iterations. + */ + CompositeIntersection( + SYCLTargetSharedPtr sycl_target, + ParticleMeshInterfaceSharedPtr particle_mesh_interface, + std::map> boundary_groups, + ParameterStoreSharedPtr config = std::make_shared()); + + /** + * Method to store the current particle positions before an integration step. + * + * @param iteration_set Particles to store current positions of. + * @param output_sym_composite_name Optionally specifiy the property to + * store composite intersection information in. Otherwise use the default. + */ + template + void pre_integration(std::shared_ptr iteration_set, + Sym output_sym_composite = Sym( + CompositeIntersection::output_sym_composite_name)); + + /** + * Find intersections between particle trajectories and composites. The + * information of the intersections is stored only on the particles. + * + * @param iteration_set ParticleGroup or ParticleSubGroup which defines the + * set of particles. + * @param output_sym_composite Optionally place the information of which + * composite is hit into a different particle dat. + * @param output_sym_position Optionally place the information of where the + * intersection occurred in a different particle dat. + */ + template + void execute(std::shared_ptr iteration_set, + Sym output_sym_composite = + Sym(CompositeIntersection::output_sym_composite_name), + Sym output_sym_position = + Sym(CompositeIntersection::output_sym_position_name)); + + /** + * Find intersections between particle trajectories and composites. + * + * @param iteration_set ParticleGroup or ParticleSubGroup which defines the + * set of particles. + * @param output_sym_composite Optionally place the information of which + * composite is hit into a different particle dat. + * @param output_sym_position Optionally place the information of where the + * intersection occurred in a different particle dat. + * @returns Map from composite indices to a ParticleSubGroup containing + * particles which have a trajectory that intersected the composite. + */ + template + std::map + get_intersections(std::shared_ptr iteration_set, + Sym output_sym_composite = Sym( + CompositeIntersection::output_sym_composite_name), + Sym output_sym_position = Sym( + CompositeIntersection::output_sym_position_name)); +}; + +} // namespace NESO::CompositeInteraction + +#endif diff --git a/include/nektar_interface/composite_interaction/composite_transport.hpp b/include/nektar_interface/composite_interaction/composite_transport.hpp new file mode 100644 index 00000000..f40a7f4b --- /dev/null +++ b/include/nektar_interface/composite_interaction/composite_transport.hpp @@ -0,0 +1,102 @@ +#ifndef __COMPOSITE_TRANSPORT_H_ +#define __COMPOSITE_TRANSPORT_H_ + +#include +using namespace Nektar; + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace NESO::CompositeInteraction { + +/** + * High level class that collects geometry information for geometry objects + * which are members of certain composites of interest. + */ +class CompositeTransport { +protected: + const int ndim; + MPI_Comm comm; + bool allocated; + int rank; + ParticleMeshInterfaceSharedPtr particle_mesh_interface; + + std::shared_ptr>> + mh_container; + +public: + /// Disable (implicit) copies. + CompositeTransport(const CompositeTransport &st) = delete; + /// Disable (implicit) copies. + CompositeTransport &operator=(CompositeTransport const &a) = delete; + + /// The composite indices for which the class detects intersections with. + const std::vector composite_indices; + + // Are the geoms in the mesh hierarchy cell owned or already requested + std::set held_cells; + + // Cells that this rank contributed geoms to. + std::vector contrib_cells; + + ~CompositeTransport() { this->free(); } + + /** + * Free the data structure. Must be called collectively on the communicator. + */ + void free(); + + /** + * Unpack the geometry for a given cell. + * + * @param[in] cell MeshHierarchy cell to unpack geometry for. + * @param[in, out] remote_quads On return contains the unpacked remote quads + * for the cell. + * @param[in, out] remote_tris On return contains the unpacked remote + * @param[in, out] remote_segments On return contains the unpacked remote + * segments for the cell. + */ + void get_geometry( + const INT cell, + std::vector>> + &remote_quads, + std::vector>> + &remote_tris, + std::vector>> + &remote_segments); + + /** + * Collect on this MPI rank geometry information for requested MeshHierarchy + * cells. Must be called collectively on the communicator. + * + * @param[in, out] cells_in MeshHierarchy cells which are required. On exit + * hold the cells which are new to this MPI rank. + * @returns Number of cells collected. + */ + int collect_geometry(std::set &cells_in); + + /** + * Construct new transport instance for a given mesh and set of composite + * indices. + * + * @param particle_mesh_interface Mesh to collect geometry information on. + * @param composite_indices Composite indices to collect geometry objects + * for. + */ + CompositeTransport(ParticleMeshInterfaceSharedPtr particle_mesh_interface, + std::vector &composite_indices); +}; + +} // namespace NESO::CompositeInteraction + +#endif diff --git a/include/nektar_interface/composite_interaction/composite_utility.hpp b/include/nektar_interface/composite_interaction/composite_utility.hpp new file mode 100644 index 00000000..fe4e9909 --- /dev/null +++ b/include/nektar_interface/composite_interaction/composite_utility.hpp @@ -0,0 +1,40 @@ +#ifndef __NESO_COMPOSITE_INTERACTION_COMPOSITE_UTILITY_HPP_ +#define __NESO_COMPOSITE_INTERACTION_COMPOSITE_UTILITY_HPP_ + +#include +using namespace Nektar; + +#include + +namespace NESO { + +/** + * Get the unit normal vector to a linear Nektar++ geometry object. + * + * @param[in] geom 1D geometry object. + * @param[in, out] normal On return contains the normal vector. + */ +void get_normal_vector(std::shared_ptr geom, + std::vector &normal); + +/** + * Get the unit normal vector to a linear Nektar++ geometry object. + * + * @param[in] geom 1D geometry object. + * @param[in, out] normal On return contains the normal vector. + */ +void get_normal_vector(std::shared_ptr geom, + std::vector &normal); + +/** + * Get the average of the vertices of a geometry object. + * + * @param[in] geom Geometry object. + * @param[in, out] average On return contains the average of the vertices. + */ +void get_vertex_average(std::shared_ptr geom, + std::vector &average); + +} // namespace NESO + +#endif diff --git a/include/nektar_interface/composite_interaction/line_line_intersection.hpp b/include/nektar_interface/composite_interaction/line_line_intersection.hpp new file mode 100644 index 00000000..34c45f6f --- /dev/null +++ b/include/nektar_interface/composite_interaction/line_line_intersection.hpp @@ -0,0 +1,95 @@ +#ifndef __NEKTAR_INTERFACE_COMPOSITE_INTERSECTION_LINE_LINE_INTERSECTION_H_ +#define __NEKTAR_INTERFACE_COMPOSITE_INTERSECTION_LINE_LINE_INTERSECTION_H_ + +#include +using namespace Nektar; + +#include "nektar_interface/special_functions.hpp" +#include "nektar_interface/typedefs.hpp" +#include + +namespace NESO::CompositeInteraction { + +/** + * Class to determine intersections between SegGeoms and particle trajectories. + */ +class LineLineIntersection { +protected: +public: + /// Point a, x component. + REAL ax; + /// Point a, y component. + REAL ay; + /// Point b, x component. + REAL bx; + /// Point b, y component. + REAL by; + /// Normal to SegGeom x component. + REAL normalx; + /// Normal to SegGeom y component. + REAL normaly; + + LineLineIntersection() = default; + + /** + * Create a Line-Line intersection detection object from a SegGeom. + * + * @param geom SegGeom to detect particle trajectories with. + */ + template LineLineIntersection(std::shared_ptr geom) { + auto shape_type = geom->GetShapeType(); + NESOASSERT(shape_type == LibUtilities::eSegment, + "LineLineIntersection not implemented for this shape type."); + NESOASSERT(geom->GetNumVerts() == 2, "Unexpected number of vertices."); + + auto a = geom->GetVertex(0); + NekDouble x, y, z; + a->GetCoords(x, y, z); + int coordim = a->GetCoordim(); + NESOASSERT(coordim == 2, "Expected coordim == 2"); + this->ax = x; + this->ay = y; + auto b = geom->GetVertex(1); + b->GetCoords(x, y, z); + coordim = b->GetCoordim(); + NESOASSERT(coordim == 2, "Expected coordim == 2"); + this->bx = x; + this->by = y; + + const REAL dx = this->bx - this->ax; + const REAL dy = this->by - this->ay; + const REAL n0t = -dy; + const REAL n1t = dx; + const REAL l = 1.0 / std::sqrt(n0t * n0t + n1t * n1t); + this->normalx = n0t * l; + this->normaly = n1t * l; + }; + + /** + * Determine if an intersection occurs. + * + * @param[in] p00 First point, x component. + * @param[in] p01 First point, y component. + * @param[in] p10 Second point, x component. + * @param[in] p11 Second point, y component. + * @param[in, out] i0 Intersection point, x component. + * @param[in, out] i1 Intersection point, y component. + * @param tol Optional tolerance for intersection detection. + * @returns True if the line segment intersects the plane otherwise false. + */ + inline bool line_line_intersection(const REAL p00, const REAL p01, + const REAL p10, const REAL p11, REAL *i0, + REAL *i1, const REAL tol = 0.0) const { + REAL t0, t1, l0; + const bool c = Particles::line_segment_intersection_2d( + this->ax, this->ay, this->bx, this->by, p00, p01, p10, p11, t0, t1, l0, + tol); + *i0 = t0; + *i1 = t1; + return c; + } +}; + +} // namespace NESO::CompositeInteraction + +#endif diff --git a/include/nektar_interface/composite_interaction/line_plane_intersection.hpp b/include/nektar_interface/composite_interaction/line_plane_intersection.hpp new file mode 100644 index 00000000..cbbadca9 --- /dev/null +++ b/include/nektar_interface/composite_interaction/line_plane_intersection.hpp @@ -0,0 +1,151 @@ +#ifndef __LINE_PLANE_INTERSECTION_H_ +#define __LINE_PLANE_INTERSECTION_H_ + +#include +using namespace Nektar; + +#include "composite_utility.hpp" +#include "nektar_interface/special_functions.hpp" +#include "nektar_interface/typedefs.hpp" +#include + +namespace NESO::CompositeInteraction { + +/** + * Class to hold the definition of a plane as defined by a 2D linear sided + * Nektar++ geometry object. + */ +class LinePlaneIntersection { +protected: + inline REAL distance_from_centre_squared(const REAL r0, const REAL r1, + const REAL r2) const { + const REAL d0 = point0 - r0; + const REAL d1 = point1 - r1; + const REAL d2 = point2 - r2; + const REAL dd = d0 * d0 + d1 * d1 + d2 * d2; + return dd; + } + + REAL radius_squared; + +public: + /// A point in the plane, x component. + REAL point0; + /// A point in the plane, y component. + REAL point1; + /// A point in the plane, z component. + REAL point2; + /// Normal vector for the plane, x component. + REAL normal0; + /// Normal vector for the plane, y component. + REAL normal1; + /// Normal vector for the plane, z component. + REAL normal2; + + LinePlaneIntersection() = default; + + /** + * Create intance from Nektar++ geometry object. + * + * @param geom 2D linear sided Nektar++ geometry object. + */ + template LinePlaneIntersection(std::shared_ptr geom) { + std::vector normal; + get_normal_vector( + std::static_pointer_cast(geom), normal); + this->normal0 = normal.at(0); + this->normal1 = normal.at(1); + this->normal2 = normal.at(2); + + // The average of the vertices is a point in the plane. + get_vertex_average(std::static_pointer_cast(geom), + normal); + + this->point0 = normal.at(0); + this->point1 = normal.at(1); + this->point2 = normal.at(2); + + const int num_verts = geom->GetNumVerts(); + REAL radius_squared_tmp = 0.0; + for (int vx = 0; vx < num_verts; vx++) { + auto vertex = geom->GetVertex(vx); + NekDouble t0, t1, t2; + vertex->GetCoords(t0, t1, t2); + radius_squared_tmp = std::max( + radius_squared_tmp, this->distance_from_centre_squared(t0, t1, t2)); + } + this->radius_squared = radius_squared_tmp; + }; + + /** + * Determine if a test point is close to the geometry object which defines + * the plane. This function returns true for all points within the geometry + * object and may return true for points outside the geometry object. + * + * @param r0 Input point to test, x component. + * @param r1 Input point to test, y component. + * @param r2 Input point to test, z component. + * @returns True if point is close to original geometry object. + */ + inline bool point_near_to_geom(const REAL r0, const REAL r1, + const REAL r2) const { + const REAL dd = this->distance_from_centre_squared(r0, r1, r2); + return dd <= this->radius_squared; + } + + /** + * For a line segment defined by two points p0 and p1 determine if the line + * segment intersects the plane and compute the intersection point if it + * exists. Output values are only meaningful if the method returns true. + * + * @param[in] p00 First point, x component. + * @param[in] p01 First point, y component. + * @param[in] p02 First point, z component. + * @param[in] p10 Second point, x component. + * @param[in] p11 Second point, y component. + * @param[in] p12 Second point, z component. + * @param[out] i0 Intersection point, x component. + * @param[out] i1 Intersection point, y component. + * @param[out] i2 Intersection point, z component. + * @returns True if the line segment intersects the plane otherwise false. + */ + inline bool line_segment_intersection(const REAL p00, const REAL p01, + const REAL p02, const REAL p10, + const REAL p11, const REAL p12, + REAL *i0, REAL *i1, REAL *i2) const { + // direction of line + const REAL l0 = p10 - p00; + const REAL l1 = p11 - p01; + const REAL l2 = p12 - p02; + + // if l_dot_n == 0 then the line is parallel to the plane + const REAL l_dot_n = + MAPPING_DOT_PRODUCT_3D(l0, l1, l2, normal0, normal1, normal2); + + const REAL point_plane_m_point_line0 = point0 - p00; + const REAL point_plane_m_point_line1 = point1 - p01; + const REAL point_plane_m_point_line2 = point2 - p02; + + const REAL ppmpl_dot_n = MAPPING_DOT_PRODUCT_3D( + point_plane_m_point_line0, point_plane_m_point_line1, + point_plane_m_point_line2, normal0, normal1, normal2); + + const REAL d = (l_dot_n == 0) ? 0.0 : ppmpl_dot_n / l_dot_n; + + const REAL intersection0 = p00 + d * l0; + const REAL intersection1 = p01 + d * l1; + const REAL intersection2 = p02 + d * l2; + + *i0 = intersection0; + *i1 = intersection1; + *i2 = intersection2; + + return (((l_dot_n == 0) && (ppmpl_dot_n != 0)) || (d < 0.0) || (d > 1.0)) + ? false + : true; + } +}; + +} // namespace NESO::CompositeInteraction + +#endif diff --git a/include/nektar_interface/geometry_transport/geometry_packing_utility.hpp b/include/nektar_interface/geometry_transport/geometry_packing_utility.hpp new file mode 100644 index 00000000..52212bb4 --- /dev/null +++ b/include/nektar_interface/geometry_transport/geometry_packing_utility.hpp @@ -0,0 +1,66 @@ +#ifndef __GEOMETRY_PACKING_UTILITY_H__ +#define __GEOMETRY_PACKING_UTILITY_H__ + +// Nektar++ Includes +#include +using namespace Nektar; + +#include +#include + +namespace NESO::GeometryTransport { + +/* + * Mirrors the existing PointGeom for packing. + */ +struct PointStruct { + int coordim; + int vid; + NekDouble x; + NekDouble y; + NekDouble z; +}; + +/* + * General struct to hold the description of the arguments for SegGeoms and + * Curves. + */ +struct GeomPackSpec { + int a; + int b; + int n_points; +}; + +inline std::ostream &operator<<(std::ostream &os, const PointStruct &ps) { + os << "coordim: " << ps.coordim; + os << " vid: " << ps.vid; + os << " x: " << ps.x; + os << " y: " << ps.y; + os << " z: " << ps.z; + return os; +} +inline std::ostream &operator<<(std::ostream &os, const GeomPackSpec &gps) { + os << "a: " << gps.a; + os << " b: " << gps.b; + os << " n_points: " << gps.n_points; + return os; +} + +/** + * Helper class to access segments and curves in Nektar geometry classes. + * These attributes are protected in the base class - this class provides + * accessors. + */ +template class GeomExtern : public T { +private: +protected: +public: + SpatialDomains::SegGeomSharedPtr GetSegGeom(int index) { + return this->m_edges[index]; + }; + SpatialDomains::CurveSharedPtr GetCurve() { return this->m_curve; }; +}; + +} // namespace NESO::GeometryTransport + +#endif diff --git a/include/nektar_interface/geometry_transport/geometry_transport.hpp b/include/nektar_interface/geometry_transport/geometry_transport.hpp index 271ad3f3..6a9442c8 100644 --- a/include/nektar_interface/geometry_transport/geometry_transport.hpp +++ b/include/nektar_interface/geometry_transport/geometry_transport.hpp @@ -3,6 +3,7 @@ #include "geometry_transport_2d.hpp" #include "geometry_transport_3d.hpp" +#include "remote_geom.hpp" #include "remote_geom_2d.hpp" #include "remote_geom_3d.hpp" #include "shape_mapping.hpp" diff --git a/include/nektar_interface/geometry_transport/halo_extension.hpp b/include/nektar_interface/geometry_transport/halo_extension.hpp index 82848100..2f80f42a 100644 --- a/include/nektar_interface/geometry_transport/halo_extension.hpp +++ b/include/nektar_interface/geometry_transport/halo_extension.hpp @@ -27,10 +27,12 @@ namespace NESO { * by this MPI rank but are within "width" of mesh hierarchy cells which are * owned by this MPI rank or cells which have non-zero overlap with the * bounding box of geometry objects which are owned by this MPI rank. + * @param [in] pbc Assume periodic extension of the halos is required, default + * true. */ void halo_get_mesh_hierarchy_cells( const int width, ParticleMeshInterfaceSharedPtr particle_mesh_interface, - std::set &remote_cells); + std::set &remote_cells, const bool pbc = true); /** * For a set of MeshHierarchy cells find the corresponding remote MPI ranks @@ -361,9 +363,12 @@ inline void halo_unpack_2D_geoms( * coordinate directions. * @param[in,out] particle_mesh_interface ParticleMeshInterface to extend the * halos of. + * @param [in] pbc Assume periodic extension of the halos is required, default + * true. */ void extend_halos_fixed_offset( - const int offset, ParticleMeshInterfaceSharedPtr particle_mesh_interface); + const int offset, ParticleMeshInterfaceSharedPtr particle_mesh_interface, + const bool pbc = true); } // namespace NESO diff --git a/include/nektar_interface/geometry_transport/packed_geom_2d.hpp b/include/nektar_interface/geometry_transport/packed_geom_2d.hpp index 8a299026..3d062c4c 100644 --- a/include/nektar_interface/geometry_transport/packed_geom_2d.hpp +++ b/include/nektar_interface/geometry_transport/packed_geom_2d.hpp @@ -3,56 +3,22 @@ // Nektar++ Includes #include "remote_geom_2d.hpp" +#include "shape_mapping.hpp" #include +#include "geometry_packing_utility.hpp" +#include +using namespace NESO::Particles; + using namespace Nektar; +using namespace Nektar::LibUtilities; namespace NESO::GeometryTransport { -namespace { - -/* - * Mirrors the existing PointGeom for packing. - */ -struct PointStruct { - int coordim; - int vid; - NekDouble x; - NekDouble y; - NekDouble z; -}; - -/* - * General struct to hold the description of the arguments for SegGeoms and - * Curves. - */ -struct GeomPackSpec { - int a; - int b; - int n_points; -}; - -/** - * Helper class to access segments and curves in Nektar geometry classes. - * These attributes are protected in the base class - this class provides - * accessors. - */ -template class GeomExtern : public T { -private: -protected: -public: - SpatialDomains::SegGeomSharedPtr GetSegGeom(int index) { - return this->m_edges[index]; - }; - SpatialDomains::CurveSharedPtr GetCurve() { return this->m_curve; }; -}; - -} // namespace - class PackedGeom2D { private: // Push data onto the buffer. - template void push(T *data) { + template inline void push(T *data) { const std::size_t size = sizeof(T); const int offset_new = offset + size; buf.resize(offset_new); @@ -61,7 +27,7 @@ class PackedGeom2D { } // Pop data from the buffer. - template void pop(T *data) { + template inline void pop(T *data) { const std::size_t size = sizeof(T); const int offset_new = offset + size; ASSERTL0((offset_new <= input_length) || (input_length == -1), @@ -77,13 +43,14 @@ class PackedGeom2D { * buffer. * */ - template void pack_general(T &geom) { + template inline void pack_general(T &geom) { this->offset = 0; this->buf.reserve(512); this->id = geom.GetGlobalID(); this->num_edges = geom.GetNumEdges(); + push(&shape_type_int); push(&rank); push(&local_id); push(&id); @@ -131,11 +98,12 @@ class PackedGeom2D { }; // Unpack the data common to both Quads and Triangles. - void unpack_general() { + inline void unpack_general() { ASSERTL0(offset == 0, "offset != 0 - cannot unpack twice"); ASSERTL0(buf_in != nullptr, "source buffer has null pointer"); // pop the metadata + pop(&shape_type_int); pop(&rank); pop(&local_id); pop(&id); @@ -191,6 +159,7 @@ class PackedGeom2D { this->pack_general(*extern_geom); } + int shape_type_int; int rank; int local_id; int id; @@ -213,6 +182,7 @@ class PackedGeom2D { template PackedGeom2D(int rank, int local_id, std::shared_ptr &geom) { + this->shape_type_int = shape_type_to_int(geom->GetShapeType()); this->rank = rank; this->local_id = local_id; pack(geom); @@ -222,24 +192,44 @@ class PackedGeom2D { * This offset is to help pointer arithmetric into the buffer for the next * Geom. */ - int get_offset() { return this->offset; }; + inline int get_offset() { return this->offset; }; /* * The rank that owns this geometry object. */ - int get_rank() { return this->rank; }; + inline int get_rank() { return this->rank; }; /* * The local id of this geometry object on the remote rank. */ - int get_local_id() { return this->local_id; }; + inline int get_local_id() { return this->local_id; }; /* * Unpack the data as a 2DGeom. */ template std::shared_ptr> unpack() { unpack_general(); - std::shared_ptr geom = std::make_shared(this->id, this->edges.data()); - geom->GetGeomFactors(); - geom->Setup(); + + LibUtilities::ShapeType shape_type = + int_to_shape_type(this->shape_type_int); + NESOASSERT(shape_type == ShapeType::eTriangle || + shape_type == ShapeType::eQuadrilateral, + "unknown underlying 2D shape type"); + + auto geom = std::shared_ptr(); + + if (shape_type == ShapeType::eTriangle) { + auto geom_orig_type = + std::make_shared(this->id, this->edges.data()); + geom_orig_type->GetGeomFactors(); + geom_orig_type->Setup(); + geom = std::dynamic_pointer_cast(geom_orig_type); + } else { + auto geom_orig_type = + std::make_shared(this->id, this->edges.data()); + geom_orig_type->GetGeomFactors(); + geom_orig_type->Setup(); + geom = std::dynamic_pointer_cast(geom_orig_type); + } + auto remote_geom = std::make_shared>(rank, local_id, geom); return remote_geom; } diff --git a/include/nektar_interface/geometry_transport/remote_geom.hpp b/include/nektar_interface/geometry_transport/remote_geom.hpp new file mode 100644 index 00000000..e4998a00 --- /dev/null +++ b/include/nektar_interface/geometry_transport/remote_geom.hpp @@ -0,0 +1,392 @@ +#ifndef __REMOTE_GEOM_H__ +#define __REMOTE_GEOM_H__ + +// Nektar++ Includes +#include +using namespace Nektar; + +#include +#include + +#include "geometry_packing_utility.hpp" +#include "shape_mapping.hpp" + +#include + +namespace NESO::GeometryTransport { + +/** + * Description of a geometry object that is owned by a remote rank. + */ +template +class RemoteGeom : public Particles::MeshHierarchyData::SerialInterface { + +protected: + template + static inline void push_offset(std::size_t *offset, U *const data) { + const std::size_t size = sizeof(U); + *offset += size; + } + + template + static inline void push(std::byte *buf, std::size_t *offset, U *const data) { + const std::size_t size = sizeof(U); + std::memcpy(buf + (*offset), data, size); + *offset += size; + } + + template + static inline void pop(const std::byte *buf, std::size_t *offset, U *data) { + const std::size_t size = sizeof(U); + std::memcpy(data, buf + (*offset), size); + *offset += size; + } + +public: + /// The remote rank that owns the geometry object (i.e. holds it in its + /// MeshGraph). + int rank = -1; + /// The geometry id on the remote rank. + int id = -1; + /// A local copy of the geometry object. + std::shared_ptr geom; + + RemoteGeom() = default; + + /** + * Constructor for remote geometry object. + * + * @param rank Remote rank that owns the object. + * @param id Remote id of this geometry object. + * @param geom Shared pointer to local copy of the geometry object. + */ + RemoteGeom(int rank, int id, std::shared_ptr geom) + : rank(rank), id(id), geom(geom){}; + + /** + * Get the Nektar++ bounding box for the geometry object. + * + * @returns Bounding box. + */ + std::array GetBoundingBox() { + return this->geom->GetBoundingBox(); + } + + /** + * @returns The number of bytes required to serialise this instance. + */ + virtual inline std::size_t get_num_bytes() const override { + + std::size_t offset = 0; + auto shape_type = this->geom->GetShapeType(); + const int shape_type_int = shape_type_to_int(shape_type); + GeomPackSpec gs; + + auto lambda_push_point = [&](auto point) { + PointStruct ps; + this->push_offset(&offset, &ps); + }; + + // Push the members which are not the geom + this->push_offset(&offset, &this->rank); + this->push_offset(&offset, &this->id); + this->push_offset(&offset, &shape_type_int); + + auto lambda_push_edge = [&](auto edge) { + int gid = -1; + this->push_offset(&offset, &gid); + const int coordim = -1; + this->push_offset(&offset, &coordim); + const int num_verts = edge->GetNumVerts(); + this->push_offset(&offset, &num_verts); + for (int vx = 0; vx < num_verts; vx++) { + auto point = edge->GetVertex(vx); + lambda_push_point(point); + } + // curve of the edge + auto curve = edge->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; + this->push_offset(&offset, &gs); + }; + + auto lambda_push_face = [&](auto face) { + int gid = face->GetGlobalID(); + this->push_offset(&offset, &gid); + const int num_edges = face->GetNumEdges(); + this->push_offset(&offset, &num_edges); + for (int ex = 0; ex < num_edges; ex++) { + auto edge = std::dynamic_pointer_cast(face->GetEdge(ex)); + NESOASSERT(edge.get() != nullptr, + "Face edge could not be cast to SegGeom"); + lambda_push_edge(edge); + } + // curve of the face + auto curve = face->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; + this->push_offset(&offset, &gs); + }; + + auto lambda_push_polyhedron = [&](auto poly) { + const int gid = -1; + this->push_offset(&offset, &gid); + const int num_faces = poly->GetNumFaces(); + this->push_offset(&offset, &num_faces); + for (int fx = 0; fx < num_faces; fx++) { + auto face = poly->GetFace(fx); + const int face_shape_type_int = -1; + this->push_offset(&offset, &face_shape_type_int); + lambda_push_face(face); + } + }; + + if (shape_type == LibUtilities::ShapeType::eSegment) { + lambda_push_edge(std::dynamic_pointer_cast(geom)); + } else if ((shape_type == LibUtilities::ShapeType::eTriangle) || + (shape_type == LibUtilities::ShapeType::eQuadrilateral)) { + lambda_push_face(std::dynamic_pointer_cast(geom)); + } else { // Assume a 3D geom + lambda_push_polyhedron(std::dynamic_pointer_cast(geom)); + } + + return offset; + } + + /** + * Serialise this instance into the provided space. + * + * @param buffer[in, out] Pointer to space that the calling function + * guarantees to be at least get_num_bytes in size. + * @param num_bytes Size of allocated buffer passed (get_num_bytes). + */ + virtual inline void serialise(std::byte *buffer, + const std::size_t num_bytes) const override { + std::size_t offset = 0; + auto shape_type = this->geom->GetShapeType(); + const int shape_type_int = shape_type_to_int(shape_type); + GeomPackSpec gs; + + auto lambda_push_point = [&](auto point) { + PointStruct ps; + ps.coordim = point->GetCoordim(); + ps.vid = point->GetVid(); + point->GetCoords(ps.x, ps.y, ps.z); + this->push(buffer, &offset, &ps); + }; + + // Push the members which are not the geom + this->push(buffer, &offset, &this->rank); + this->push(buffer, &offset, &this->id); + this->push(buffer, &offset, &shape_type_int); + + auto lambda_push_edge = [&](auto edge) { + int gid = edge->GetGlobalID(); + this->push(buffer, &offset, &gid); + const int coordim = edge->GetCoordim(); + this->push(buffer, &offset, &coordim); + const int num_verts = edge->GetNumVerts(); + this->push(buffer, &offset, &num_verts); + for (int vx = 0; vx < num_verts; vx++) { + auto point = edge->GetVertex(vx); + lambda_push_point(point); + } + // curve of the edge + auto curve = edge->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; + this->push(buffer, &offset, &gs); + }; + + auto lambda_push_face = [&](auto face) { + const int gid = face->GetGlobalID(); + this->push(buffer, &offset, &gid); + const int num_edges = face->GetNumEdges(); + this->push(buffer, &offset, &num_edges); + for (int ex = 0; ex < num_edges; ex++) { + // The TriGeoms and QuadGeoms are constructed with SegGeoms so this + // should be fine. + auto edge = std::dynamic_pointer_cast(face->GetEdge(ex)); + NESOASSERT(edge.get() != nullptr, + "Face edge could not be cast to SegGeom"); + lambda_push_edge(edge); + } + // curve of the face + auto curve = face->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; + this->push(buffer, &offset, &gs); + }; + + auto lambda_push_polyhedron = [&](auto poly) { + const int gid = poly->GetGlobalID(); + this->push(buffer, &offset, &gid); + const int num_faces = poly->GetNumFaces(); + this->push(buffer, &offset, &num_faces); + for (int fx = 0; fx < num_faces; fx++) { + auto face = poly->GetFace(fx); + const int face_shape_type_int = shape_type_to_int(face->GetShapeType()); + this->push(buffer, &offset, &face_shape_type_int); + lambda_push_face(face); + } + }; + + // Push the description of the geom + if (shape_type == LibUtilities::ShapeType::eSegment) { + lambda_push_edge(std::dynamic_pointer_cast(geom)); + } else if ((shape_type == LibUtilities::ShapeType::eTriangle) || + (shape_type == LibUtilities::ShapeType::eQuadrilateral)) { + lambda_push_face(std::dynamic_pointer_cast(geom)); + } else { // Assume a 3D geom + lambda_push_polyhedron(std::dynamic_pointer_cast(geom)); + } + + NESOASSERT(offset == num_bytes, "Different offset from expected value."); + } + + /** + * Deserialise, i.e. reconstruct, an instance of the class from the byte + * buffer. + * + * @param buffer Pointer to space that the calling function guarantees to be + * at least get_num_bytes in size from which this object should be recreated. + * @param num_bytes Size of allocated buffer passed (get_num_bytes). + */ + virtual inline void deserialise(const std::byte *buffer, + const std::size_t num_bytes) override { + + std::size_t offset = 0; + GeomPackSpec gs; + PointStruct ps; + int shape_type_int; + + this->pop(buffer, &offset, &this->rank); + this->pop(buffer, &offset, &this->id); + this->pop(buffer, &offset, &shape_type_int); + auto shape_type = int_to_shape_type(shape_type_int); + + auto lambda_pop_edge = [&]() { + int gid; + this->pop(buffer, &offset, &gid); + int coordim; + this->pop(buffer, &offset, &coordim); + int num_verts; + this->pop(buffer, &offset, &num_verts); + std::vector vertices; + for (int vx = 0; vx < num_verts; vx++) { + this->pop(buffer, &offset, &ps); + vertices.push_back(std::make_shared( + ps.coordim, ps.vid, ps.x, ps.y, ps.z)); + } + // In future the edge might have a corresponding curve + this->pop(buffer, &offset, &gs); + ASSERTL0(gs.n_points == -1, "unpacking routine did not expect a curve"); + auto g = std::make_shared(gid, coordim, + vertices.data()); + g->GetGeomFactors(); + g->Setup(); + return g; + }; + + auto lambda_pop_face = [&](const auto shape_type) { + std::vector edges; + int gid; + this->pop(buffer, &offset, &gid); + int num_edges; + this->pop(buffer, &offset, &num_edges); + edges.reserve(num_edges); + for (int ex = 0; ex < num_edges; ex++) { + edges.push_back(lambda_pop_edge()); + } + // curve of the face + this->pop(buffer, &offset, &gs); + ASSERTL0(gs.n_points == -1, "unpacking routine did not expect a curve"); + + std::shared_ptr g; + if (shape_type == LibUtilities::ShapeType::eTriangle) { + g = std::dynamic_pointer_cast( + std::make_shared(gid, edges.data())); + } else { + g = std::dynamic_pointer_cast( + std::make_shared(gid, edges.data())); + } + g->GetGeomFactors(); + g->Setup(); + return g; + }; + + auto lambda_pop_polyhedron = [&](const auto shape_type) { + int gid; + this->pop(buffer, &offset, &gid); + int num_faces; + this->pop(buffer, &offset, &num_faces); + std::vector faces; + faces.reserve(num_faces); + for (int fx = 0; fx < num_faces; fx++) { + int face_shape_type_int; + this->pop(buffer, &offset, &face_shape_type_int); + const auto face_shape_type = int_to_shape_type(face_shape_type_int); + faces.push_back(lambda_pop_face(face_shape_type)); + } + // Polyhedra don't seem to have a curve in Nektar++ + std::shared_ptr g; + if (shape_type == LibUtilities::ShapeType::eTetrahedron) { + std::vector tmp_faces; + tmp_faces.reserve(num_faces); + for (auto fx : faces) { + tmp_faces.push_back(std::dynamic_pointer_cast(fx)); + } + g = std::dynamic_pointer_cast( + std::make_shared(gid, tmp_faces.data())); + } else if (shape_type == LibUtilities::ShapeType::ePyramid) { + g = std::dynamic_pointer_cast( + std::make_shared(gid, faces.data())); + } else if (shape_type == LibUtilities::ShapeType::ePrism) { + g = std::dynamic_pointer_cast( + std::make_shared(gid, faces.data())); + } else { + std::vector tmp_faces; + tmp_faces.reserve(num_faces); + for (auto fx : faces) { + tmp_faces.push_back(std::dynamic_pointer_cast(fx)); + } + g = std::dynamic_pointer_cast( + std::make_shared(gid, tmp_faces.data())); + } + g->GetGeomFactors(); + g->Setup(); + return g; + }; + + if (shape_type == LibUtilities::ShapeType::eSegment) { + this->geom = std::dynamic_pointer_cast(lambda_pop_edge()); + } else if ((shape_type == LibUtilities::ShapeType::eTriangle) || + (shape_type == LibUtilities::ShapeType::eQuadrilateral)) { + this->geom = std::dynamic_pointer_cast(lambda_pop_face(shape_type)); + } else { // Assume a 3D geom + this->geom = + std::dynamic_pointer_cast(lambda_pop_polyhedron(shape_type)); + } + + this->geom->GetGeomFactors(); + this->geom->Setup(); + + NESOASSERT(offset == num_bytes, "Not all data was deserialised"); + } +}; + +} // namespace NESO::GeometryTransport + +#endif diff --git a/include/nektar_interface/particle_boundary_conditions.hpp b/include/nektar_interface/particle_boundary_conditions.hpp index 963d01d2..9fd0dd74 100644 --- a/include/nektar_interface/particle_boundary_conditions.hpp +++ b/include/nektar_interface/particle_boundary_conditions.hpp @@ -15,6 +15,9 @@ #include #include "bounding_box_intersection.hpp" +#include "composite_interaction/composite_intersection.hpp" +#include "parameter_store.hpp" +#include "special_functions.hpp" #include #include @@ -35,6 +38,7 @@ class NektarCartesianPeriodic { SYCLTargetSharedPtr sycl_target; ParticleDatSharedPtr position_dat; const int ndim; + ParticleLoopSharedPtr loop; public: double global_origin[3]; @@ -51,99 +55,106 @@ class NektarCartesianPeriodic { */ NektarCartesianPeriodic(SYCLTargetSharedPtr sycl_target, Nektar::SpatialDomains::MeshGraphSharedPtr graph, - ParticleDatSharedPtr position_dat) - : sycl_target(sycl_target), ndim(graph->GetMeshDimension()), - position_dat(position_dat), d_extents(sycl_target, 3), - d_origin(sycl_target, 3) { - - NESOASSERT(this->ndim <= 3, "bad mesh ndim"); - - auto verticies = graph->GetAllPointGeoms(); - - double origin[3]; - double extent[3]; - for (int dimx = 0; dimx < 3; dimx++) { - origin[dimx] = std::numeric_limits::max(); - extent[dimx] = std::numeric_limits::lowest(); - } - - for (auto &vx : verticies) { - Nektar::NekDouble x, y, z; - vx.second->GetCoords(x, y, z); - origin[0] = std::min(origin[0], x); - origin[1] = std::min(origin[1], y); - origin[2] = std::min(origin[2], z); - extent[0] = std::max(extent[0], x); - extent[1] = std::max(extent[1], y); - extent[2] = std::max(extent[2], z); - } - - MPICHK(MPI_Allreduce(origin, this->global_origin, 3, MPI_DOUBLE, MPI_MIN, - sycl_target->comm_pair.comm_parent)); - MPICHK(MPI_Allreduce(extent, this->global_extent, 3, MPI_DOUBLE, MPI_MAX, - sycl_target->comm_pair.comm_parent)); - - for (int dimx = 0; dimx < 3; dimx++) { - this->global_extent[dimx] -= this->global_origin[dimx]; - } - - sycl_target->queue - .memcpy(this->d_extents.ptr, this->global_extent, - this->ndim * sizeof(double)) - .wait_and_throw(); - - sycl_target->queue - .memcpy(this->d_origin.ptr, this->global_origin, - this->ndim * sizeof(double)) - .wait_and_throw(); - }; + ParticleDatSharedPtr position_dat); /** * Apply periodic boundary conditions to the particle positions in the * ParticleDat this instance was created with. */ - inline void execute() { - - auto t0 = profile_timestamp(); - auto pl_iter_range = this->position_dat->get_particle_loop_iter_range(); - auto pl_stride = this->position_dat->get_particle_loop_cell_stride(); - auto pl_npart_cell = this->position_dat->get_particle_loop_npart_cell(); - const int k_ndim = this->ndim; - - NESOASSERT(((k_ndim > 0) && (k_ndim < 4)), "Bad number of dimensions"); - const auto k_origin = this->d_origin.ptr; - const auto k_extents = this->d_extents.ptr; - auto k_positions_dat = this->position_dat->cell_dat.device_ptr(); - - this->sycl_target->queue - .submit([&](sycl::handler &cgh) { - cgh.parallel_for<>( - sycl::range<1>(pl_iter_range), [=](sycl::id<1> idx) { - NESO_PARTICLES_KERNEL_START - const INT cellx = NESO_PARTICLES_KERNEL_CELL; - const INT layerx = NESO_PARTICLES_KERNEL_LAYER; - for (int dimx = 0; dimx < k_ndim; dimx++) { - const double pos = - k_positions_dat[cellx][dimx][layerx] - k_origin[dimx]; - // offset the position in the current dimension to be - // positive by adding a value times the extent - const double n_extent_offset_real = ABS(pos); - 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); - k_positions_dat[cellx][dimx][layerx] = - pos_fmod + k_origin[dimx]; - } - NESO_PARTICLES_KERNEL_END - }); - }) - .wait_and_throw(); - - sycl_target->profile_map.inc("NektarCartesianPeriodic", "execute", 1, - profile_elapsed(t0, profile_timestamp())); + void execute(); +}; + +namespace { +struct NormalType { + REAL x; + REAL y; + REAL z; + + inline NormalType &operator=(const int v) { + this->x = v; + this->y = v; + this->z = v; + return *this; } }; +} // namespace + +/** + * Implementation of a reflection process which truncates the particle + * trajectory at the mesh boundary. + * + * If particle positions are stored in a ParticleDat with Sym "P" then P will + * be set to a value just inside the domain at the intersection point of the + * particle trajectory and the composite which the particle hits. + * + * This implementation assumes that each particle carries an additional + * property of two components that stores the proportion through the time step + * the particle is at. The first component of this property holds the total + * proportion of the time step that the particle has been integrated through. + * The second component holds the amount of that proportion though which the + * particle was integrated in the last modification to the properties of the + * particle (i.e. position). + * + * This time property allows the time of the particle to be re-wound to the + * point of intersection with a composite. + * + */ +class NektarCompositeTruncatedReflection { +protected: + SYCLTargetSharedPtr sycl_target; + std::shared_ptr + composite_intersection; + std::vector composite_indices; + std::unique_ptr ep; + Sym velocity_sym; + Sym time_step_prop_sym; + REAL reset_distance; + int ndim; + + void execute_2d(ParticleSubGroupSharedPtr particle_sub_group); + void execute_3d(ParticleSubGroupSharedPtr particle_sub_group); + +public: + /** + * Implementation of a reflection process which truncates the particle + * trajectory at the mesh boundary. + * + * @param velocity_sym Symbol of ParticleDat which contains particle + * velocities. + * @param time_step_prop_sym Symbol of ParticleDat which contains the time + * step of the particle. This property should have at least two components. + * @param sycl_target Compute device for all ParticleGroups which will use the + * instance. + * @param mesh Mesh for all ParticleGroups which will use the instance. + * @param composite_indices Vector of boundary composites for which particles + * should be reflected when an intersection occurs. + * @param config Configuration to pass to composite intersection routines. + */ + NektarCompositeTruncatedReflection( + Sym velocity_sym, Sym time_step_prop_sym, + SYCLTargetSharedPtr sycl_target, + std::shared_ptr mesh, + std::vector &composite_indices, + ParameterStoreSharedPtr config = std::make_shared()); + + /** + * Apply the reflection process. This method should be called after a time + * step has been performed. + * + * @param particle_sub_group ParticleSubGroup of particles to apply truncated + * reflection to. + */ + void execute(ParticleSubGroupSharedPtr particle_sub_group); + + /** + * Method to call before particle positions are updated by a time stepping + * process. + * + * @param particle_sub_group ParticleSubGroup of particles to apply truncated + * reflection to. + */ + void pre_advection(ParticleSubGroupSharedPtr particle_sub_group); +}; } // namespace NESO #endif diff --git a/include/nektar_interface/particle_cell_mapping/generated_linear/hexahedron.hpp b/include/nektar_interface/particle_cell_mapping/generated_linear/hexahedron.hpp index bc745d5a..074444b3 100644 --- a/include/nektar_interface/particle_cell_mapping/generated_linear/hexahedron.hpp +++ b/include/nektar_interface/particle_cell_mapping/generated_linear/hexahedron.hpp @@ -3,7 +3,7 @@ This is a generated file. Please make non-ephemeral changes by modifying the script which generates this file. This file was generated on git hash -7094376e18db143be4b89da92555451f8e4a3901 +186e94e602a17fd691414e3acb5e74f7cfad7155 by running the command diff --git a/include/nektar_interface/particle_cell_mapping/generated_linear/linear_newton_implementation.hpp b/include/nektar_interface/particle_cell_mapping/generated_linear/linear_newton_implementation.hpp index db5f14a2..508d4b2f 100644 --- a/include/nektar_interface/particle_cell_mapping/generated_linear/linear_newton_implementation.hpp +++ b/include/nektar_interface/particle_cell_mapping/generated_linear/linear_newton_implementation.hpp @@ -5,7 +5,7 @@ This is a generated file. Please make non-ephemeral changes by modifying the script which generates this file. This file was generated on git hash -7094376e18db143be4b89da92555451f8e4a3901 +186e94e602a17fd691414e3acb5e74f7cfad7155 by running the command @@ -18,6 +18,7 @@ python ../../python/deformed_mappings/generate_linear_source.py #include "prism.hpp" #include "pyramid.hpp" #include "quadrilateral.hpp" +#include "quadrilateralembed3d.hpp" #include "tetrahedron.hpp" #endif diff --git a/include/nektar_interface/particle_cell_mapping/generated_linear/prism.hpp b/include/nektar_interface/particle_cell_mapping/generated_linear/prism.hpp index 9600763c..5b3d464b 100644 --- a/include/nektar_interface/particle_cell_mapping/generated_linear/prism.hpp +++ b/include/nektar_interface/particle_cell_mapping/generated_linear/prism.hpp @@ -3,7 +3,7 @@ This is a generated file. Please make non-ephemeral changes by modifying the script which generates this file. This file was generated on git hash -7094376e18db143be4b89da92555451f8e4a3901 +186e94e602a17fd691414e3acb5e74f7cfad7155 by running the command diff --git a/include/nektar_interface/particle_cell_mapping/generated_linear/pyramid.hpp b/include/nektar_interface/particle_cell_mapping/generated_linear/pyramid.hpp index 471b8a92..e4888aa3 100644 --- a/include/nektar_interface/particle_cell_mapping/generated_linear/pyramid.hpp +++ b/include/nektar_interface/particle_cell_mapping/generated_linear/pyramid.hpp @@ -3,7 +3,7 @@ This is a generated file. Please make non-ephemeral changes by modifying the script which generates this file. This file was generated on git hash -7094376e18db143be4b89da92555451f8e4a3901 +186e94e602a17fd691414e3acb5e74f7cfad7155 by running the command diff --git a/include/nektar_interface/particle_cell_mapping/generated_linear/quadrilateral.hpp b/include/nektar_interface/particle_cell_mapping/generated_linear/quadrilateral.hpp index ebd87d0d..c21845ce 100644 --- a/include/nektar_interface/particle_cell_mapping/generated_linear/quadrilateral.hpp +++ b/include/nektar_interface/particle_cell_mapping/generated_linear/quadrilateral.hpp @@ -3,7 +3,7 @@ This is a generated file. Please make non-ephemeral changes by modifying the script which generates this file. This file was generated on git hash -7094376e18db143be4b89da92555451f8e4a3901 +186e94e602a17fd691414e3acb5e74f7cfad7155 by running the command diff --git a/include/nektar_interface/particle_cell_mapping/generated_linear/quadrilateralembed3d.hpp b/include/nektar_interface/particle_cell_mapping/generated_linear/quadrilateralembed3d.hpp new file mode 100644 index 00000000..fda4f95a --- /dev/null +++ b/include/nektar_interface/particle_cell_mapping/generated_linear/quadrilateralembed3d.hpp @@ -0,0 +1,208 @@ +/** +This is a generated file. Please make non-ephemeral changes by +modifying the script which generates this file. This file was generated on git +hash + +186e94e602a17fd691414e3acb5e74f7cfad7155 + +by running the command + +python ../../python/deformed_mappings/generate_linear_source.py +../../include/nektar_interface/particle_cell_mapping/generated_linear + +*/ +#ifndef __GENERATED_QUADRILATERALEMBED3D_LINEAR_NEWTON_H__ +#define __GENERATED_QUADRILATERALEMBED3D_LINEAR_NEWTON_H__ + +#include +using namespace NESO; +using namespace NESO::Particles; + +namespace NESO { +namespace QuadrilateralEmbed3D { + +/** + * Perform a Newton method update step for a Newton iteration that determines + * the local coordinates (xi) for a given set of physical coordinates. If + * v0,v1,v2 and v3 (passed component wise) are the vertices of a linear sided + * quadrilateral then this function performs the Newton update: + * + * xi_{n+1} = xi_n - J^{-1}(xi_n) * F(xi_n) + * + * where + * + * F(xi) = X(xi) - X_phys + * + * where X_phys are the global coordinates. + * + * X is defined as + * + * + * X(xi) = 0.25 * v0 * (1 - xi_0) * (1 - xi_1) + + * 0.25 * v1 * (1 + xi_0) * (1 - xi_1) + + * 0.25 * v3 * (1 - xi_0) * (1 + xi_1) + + * 0.25 * v2 * (1 + xi_0) * (1 + xi_1) + V4 * xi_2 + * + * + * This is a generated function. To modify this function please edit the script + * that generates this function. See top of file. + * + * @param[in] xi0 Current xi_n point, x component. + * @param[in] xi1 Current xi_n point, y component. + * @param[in] xi2 Current xi_n point, z component. + * @param[in] v00 Vertex 0, x component. + * @param[in] v01 Vertex 0, y component. + * @param[in] v02 Vertex 0, z component. + * @param[in] v10 Vertex 1, x component. + * @param[in] v11 Vertex 1, y component. + * @param[in] v12 Vertex 1, z component. + * @param[in] v20 Vertex 2, x component. + * @param[in] v21 Vertex 2, y component. + * @param[in] v22 Vertex 2, z component. + * @param[in] v30 Vertex 3, x component. + * @param[in] v31 Vertex 3, y component. + * @param[in] v32 Vertex 3, z component. + * @param[in] v40 Vertex 4, x component. + * @param[in] v41 Vertex 4, y component. + * @param[in] v42 Vertex 4, z component. + * @param[in] phys0 Target point in global space, x component. + * @param[in] phys1 Target point in global space, y component. + * @param[in] phys2 Target point in global space, z component. + * @param[in] f0 Current f evaluation at xi, x component. + * @param[in] f1 Current f evaluation at xi, y component. + * @param[in] f2 Current f evaluation at xi, z component. + * @param[in, out] xin0 Output local coordinate iteration, x component. + * @param[in, out] xin1 Output local coordinate iteration, y component. + * @param[in, out] xin2 Output local coordinate iteration, z component. + */ +inline void newton_step_linear_2d( + const REAL xi0, const REAL xi1, const REAL xi2, const REAL v00, + const REAL v01, const REAL v02, const REAL v10, const REAL v11, + const REAL v12, const REAL v20, const REAL v21, const REAL v22, + const REAL v30, const REAL v31, const REAL v32, const REAL v40, + const REAL v41, const REAL v42, 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 x0 = xi1 - 1; + const REAL x1 = xi1 + 1; + const REAL x2 = xi0 - 1; + const REAL x3 = xi0 + 1; + const REAL J00 = + 0.25 * v00 * x0 - 0.25 * v10 * x0 + 0.25 * v20 * x1 - 0.25 * v30 * x1; + const REAL J01 = + 0.25 * v00 * x2 - 0.25 * v10 * x3 + 0.25 * v20 * x3 - 0.25 * v30 * x2; + const REAL J02 = v40; + const REAL J10 = + 0.25 * v01 * x0 - 0.25 * v11 * x0 + 0.25 * v21 * x1 - 0.25 * v31 * x1; + const REAL J11 = + 0.25 * v01 * x2 - 0.25 * v11 * x3 + 0.25 * v21 * x3 - 0.25 * v31 * x2; + const REAL J12 = v41; + const REAL J20 = + 0.25 * v02 * x0 - 0.25 * v12 * x0 + 0.25 * v22 * x1 - 0.25 * v32 * x1; + const REAL J21 = + 0.25 * v02 * x2 - 0.25 * v12 * x3 + 0.25 * v22 * x3 - 0.25 * v32 * x2; + const REAL J22 = v42; + const REAL y0 = J11 * J22; + const REAL y1 = J00 * y0; + const REAL y2 = J01 * J12; + const REAL y3 = J20 * y2; + const REAL y4 = J02 * J21; + const REAL y5 = J10 * y4; + const REAL y6 = J12 * J21; + const REAL y7 = J00 * y6; + const REAL y8 = J01 * J22; + const REAL y9 = J10 * y8; + const REAL y10 = J02 * J11; + const REAL y11 = J20 * y10; + const REAL y12 = 1.0 / (y1 - y11 + y3 + y5 - y7 - y9); + const REAL y13 = J00 * f2; + const REAL y14 = J20 * f1; + const REAL y15 = J10 * f0; + const REAL y16 = J00 * f1; + const REAL y17 = J10 * f2; + const REAL y18 = J20 * f0; + const REAL xin0_tmp = + y12 * (-f0 * y0 + f0 * y6 - f1 * y4 + f1 * y8 + f2 * y10 - f2 * y2 + + xi0 * y1 - xi0 * y11 + xi0 * y3 + xi0 * y5 - xi0 * y7 - xi0 * y9); + const REAL xin1_tmp = y12 * (J02 * y14 - J02 * y17 + J12 * y13 - J12 * y18 + + J22 * y15 - J22 * y16 + xi1 * y1 - xi1 * y11 + + xi1 * y3 + xi1 * y5 - xi1 * y7 - xi1 * y9); + const REAL xin2_tmp = y12 * (-J01 * y14 + J01 * y17 - J11 * y13 + J11 * y18 - + J21 * y15 + J21 * y16 + xi2 * y1 - xi2 * y11 + + xi2 * y3 + xi2 * y5 - xi2 * y7 - xi2 * y9); + *xin0 = xin0_tmp; + *xin1 = xin1_tmp; + *xin2 = xin2_tmp; +} + +/** + * Compute and return F evaluation where + * + * F(xi) = X(xi) - X_phys + * + * where X_phys are the global coordinates. X is defined as + * + * + * X(xi) = 0.25 * v0 * (1 - xi_0) * (1 - xi_1) + + * 0.25 * v1 * (1 + xi_0) * (1 - xi_1) + + * 0.25 * v3 * (1 - xi_0) * (1 + xi_1) + + * 0.25 * v2 * (1 + xi_0) * (1 + xi_1) + V4 * xi_2 + * + * + * This is a generated function. To modify this function please edit the script + * that generates this function. See top of file. + * + * @param[in] xi0 Current xi_n point, x component. + * @param[in] xi1 Current xi_n point, y component. + * @param[in] xi2 Current xi_n point, z component. + * @param[in] v00 Vertex 0, x component. + * @param[in] v01 Vertex 0, y component. + * @param[in] v02 Vertex 0, z component. + * @param[in] v10 Vertex 1, x component. + * @param[in] v11 Vertex 1, y component. + * @param[in] v12 Vertex 1, z component. + * @param[in] v20 Vertex 2, x component. + * @param[in] v21 Vertex 2, y component. + * @param[in] v22 Vertex 2, z component. + * @param[in] v30 Vertex 3, x component. + * @param[in] v31 Vertex 3, y component. + * @param[in] v32 Vertex 3, z component. + * @param[in] v40 Vertex 4, x component. + * @param[in] v41 Vertex 4, y component. + * @param[in] v42 Vertex 4, z component. + * @param[in] phys0 Target point in global space, x component. + * @param[in] phys1 Target point in global space, y component. + * @param[in] phys2 Target point in global space, z component. + * @param[in, out] f0 Current f evaluation at xi, x component. + * @param[in, out] f1 Current f evaluation at xi, y component. + * @param[in, out] f2 Current f evaluation at xi, z component. + */ +inline void newton_f_linear_2d(const REAL xi0, const REAL xi1, const REAL xi2, + const REAL v00, const REAL v01, const REAL v02, + const REAL v10, const REAL v11, const REAL v12, + const REAL v20, const REAL v21, const REAL v22, + const REAL v30, const REAL v31, const REAL v32, + const REAL v40, const REAL v41, const REAL v42, + const REAL phys0, const REAL phys1, + const REAL phys2, REAL *f0, REAL *f1, REAL *f2) { + const REAL x0 = xi0 - 1; + const REAL x1 = xi1 - 1; + const REAL x2 = xi0 + 1; + const REAL x3 = 0.25 * x1 * x2; + const REAL x4 = xi1 + 1; + const REAL x5 = 0.25 * x0 * x4; + const REAL f0_tmp = -phys0 + 0.25 * v00 * x0 * x1 - v10 * x3 + + 0.25 * v20 * x2 * x4 - v30 * x5 + v40 * xi2; + const REAL f1_tmp = -phys1 + 0.25 * v01 * x0 * x1 - v11 * x3 + + 0.25 * v21 * x2 * x4 - v31 * x5 + v41 * xi2; + const REAL f2_tmp = -phys2 + 0.25 * v02 * x0 * x1 - v12 * x3 + + 0.25 * v22 * x2 * x4 - v32 * x5 + v42 * xi2; + *f0 = f0_tmp; + *f1 = f1_tmp; + *f2 = f2_tmp; +} + +} // namespace QuadrilateralEmbed3D +} // namespace NESO + +#endif diff --git a/include/nektar_interface/particle_cell_mapping/generated_linear/tetrahedron.hpp b/include/nektar_interface/particle_cell_mapping/generated_linear/tetrahedron.hpp index d5ea4d7b..4fda5b8f 100644 --- a/include/nektar_interface/particle_cell_mapping/generated_linear/tetrahedron.hpp +++ b/include/nektar_interface/particle_cell_mapping/generated_linear/tetrahedron.hpp @@ -3,7 +3,7 @@ This is a generated file. Please make non-ephemeral changes by modifying the script which generates this file. This file was generated on git hash -7094376e18db143be4b89da92555451f8e4a3901 +186e94e602a17fd691414e3acb5e74f7cfad7155 by running the command diff --git a/include/nektar_interface/particle_cell_mapping/map_particles_common.hpp b/include/nektar_interface/particle_cell_mapping/map_particles_common.hpp index 6ccebc5f..a73c55a2 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_common.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_common.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "../particle_mesh_interface.hpp" @@ -42,16 +43,12 @@ class MapParticlesCommon { MapParticlesCommon(SYCLTargetSharedPtr sycl_target); /** - * Returns true if there are particles that were not binned into cells. - * * @param particle_group ParticleGroup to check particles in. * @param map_cell Only check particles within a particular NESO::Particles - * cell. - * @param final_map Is this check the final or intermediate step of the - * hybrid move. + * cell. Otherwise check all cells. + * @returns True if there are particles that were not binned into cells. */ - bool check_map(ParticleGroup &particle_group, const int map_cell = -1, - const bool final_map = true); + bool check_map(ParticleGroup &particle_group, const int map_cell = -1); }; } // 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 abb95334..591710f8 100644 --- a/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp +++ b/include/nektar_interface/particle_cell_mapping/map_particles_newton.hpp @@ -12,6 +12,7 @@ #include "mapping_newton_iteration_base.hpp" #include "nektar_interface/parameter_store.hpp" #include "particle_cell_mapping_common.hpp" +#include "x_map_newton_kernel.hpp" #include #include @@ -53,6 +54,10 @@ class MapParticlesNewton : public CoarseMappersBase { REAL newton_tol; /// Maximum number of Newton iterations. INT newton_max_iteration; + /// Tolerance for determining if a particle is within [-1-tol, 1+tol]. + REAL contained_tol; + /// Grid size for final attempt to invert X maps. + int grid_size; /// Number of geometry objects this instance may map to. int num_geoms; /// Number of coordinate dimensions. @@ -81,6 +86,284 @@ class MapParticlesNewton : public CoarseMappersBase { this->newton_type.write_data(geom, h_data_ptr, d_data_ptr); } + inline void map_inital(ParticleGroup &particle_group, const int map_cell) { + + if (this->num_geoms == 0) { + return; + } + + 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_newton_tol = this->newton_tol; + const double k_contained_tol = this->contained_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; + + auto position_dat = particle_group.position_dat; + auto cell_ids = particle_group.cell_id_dat; + auto mpi_ranks = particle_group.mpi_rank_dat; + auto ref_positions = + particle_group.get_dat(Sym("NESO_REFERENCE_POSITIONS")); + + 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) { + if (k_part_mpi_ranks.at(1) < 0) { + // 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; + const REAL p2 = (k_ndim > 2) ? k_part_positions.at(2) : 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 && (!cell_found); + 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; + + MappingNewtonIterationBase k_newton_type{}; + XMapNewtonKernel k_newton_kernel; + + REAL xi[3]; + + 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); + + REAL eta0; + REAL eta1; + REAL eta2; + + 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)); + + 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]; + k_part_cell_ids.at(0) = geom_id; + k_part_mpi_ranks.at(1) = mpi_rank; + for (int dx = 0; dx < k_ndim; dx++) { + k_part_ref_positions.at(dx) = xi[dx]; + } + } + } + } + }, + Access::read(position_dat), Access::write(cell_ids), + Access::write(mpi_ranks), Access::write(ref_positions)); + + if (map_cell > -1) { + loop->execute(map_cell); + } else { + loop->execute(); + } + } + + inline void map_final(ParticleGroup &particle_group, const int map_cell) { + if (this->num_geoms == 0) { + return; + } + + 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_newton_tol = this->newton_tol; + const double k_contained_tol = this->contained_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; + + const int k_grid_size_x = std::max(this->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); + + auto position_dat = particle_group.position_dat; + auto cell_ids = particle_group.cell_id_dat; + auto mpi_ranks = particle_group.mpi_rank_dat; + auto ref_positions = + particle_group.get_dat(Sym("NESO_REFERENCE_POSITIONS")); + + 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) { + if (k_part_mpi_ranks.at(1) < 0) { + // 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; + const REAL p2 = (k_ndim > 2) ? k_part_positions.at(2) : 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 && (!cell_found); + 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; + + MappingNewtonIterationBase k_newton_type{}; + XMapNewtonKernel k_newton_kernel; + + 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 xi[3] = {-1.0 + g0 * k_grid_width, + -1.0 + g1 * k_grid_width, + -1.0 + g2 * k_grid_width}; + + 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); + + REAL eta0; + REAL eta1; + REAL eta2; + + 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)); + + 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]; + k_part_cell_ids.at(0) = geom_id; + k_part_mpi_ranks.at(1) = mpi_rank; + for (int dx = 0; dx < k_ndim; dx++) { + k_part_ref_positions.at(dx) = xi[dx]; + } + } + } + } + } + } + } + }, + Access::read(position_dat), Access::write(cell_ids), + Access::write(mpi_ranks), Access::write(ref_positions)) + ->execute(map_cell); + } + public: ~MapParticlesNewton() { for (int index = 0; index < num_geoms; index++) { @@ -123,6 +406,10 @@ class MapParticlesNewton : public CoarseMappersBase { 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) { @@ -160,6 +447,7 @@ class MapParticlesNewton : public CoarseMappersBase { const int rank = this->sycl_target->comm_pair.rank_parent; + int num_modes = 0; 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); @@ -176,6 +464,8 @@ class MapParticlesNewton : public CoarseMappersBase { "Unknown shape type."); this->dh_type->h_buffer.ptr[cell_index] = geom_type; this->write_data(geom.second, cell_index); + num_modes = + std::max(num_modes, geom.second->GetXmap()->EvalBasisNumModesMax()); } for (auto &geom : geoms_remote) { @@ -192,8 +482,11 @@ class MapParticlesNewton : public CoarseMappersBase { "Unknown shape type."); this->dh_type->h_buffer.ptr[cell_index] = geom_type; 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(); @@ -206,214 +499,10 @@ class MapParticlesNewton : public CoarseMappersBase { * Geometry objects via Newton iteration. */ inline void map(ParticleGroup &particle_group, const int map_cell = -1) { - - if (this->num_geoms == 0) { - return; + this->map_inital(particle_group, map_cell); + 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; - - REAL residual = k_newton_type.newton_residual( - map_data, xi0, xi1, xi2, p0, p1, p2, &f0, &f1, &f2); - - bool diverged = false; - - for (int stepx = 0; ((stepx < k_max_iterations) && - (residual > k_tol) && (!diverged)); - stepx++) { - k_newton_type.newton_step(map_data, xi0, xi1, xi2, p0, - p1, p2, f0, f1, f2, &xin0, - &xin1, &xin2); - - xi0 = xin0; - xi1 = xin1; - xi2 = xin2; - - residual = k_newton_type.newton_residual( - map_data, xi0, xi1, xi2, p0, p1, p2, &f0, &f1, &f2); - - 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_geom_interfaces.hpp b/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp index ff75ad2c..2366e90f 100644 --- a/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp +++ b/include/nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp @@ -5,7 +5,9 @@ #include "newton_prism.hpp" #include "newton_pyr.hpp" #include "newton_quad.hpp" +#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/newton_quad_embed_3d.hpp b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp new file mode 100644 index 00000000..71480933 --- /dev/null +++ b/include/nektar_interface/particle_cell_mapping/newton_quad_embed_3d.hpp @@ -0,0 +1,161 @@ +#ifndef ___NESO_PARTICLE_MAPPING_NEWTON_QUAD_EMBED_3D_H__ +#define ___NESO_PARTICLE_MAPPING_NEWTON_QUAD_EMBED_3D_H__ + +#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 { + +struct MappingQuadLinear2DEmbed3D + : MappingNewtonIterationBase { + + inline void write_data_v(GeometrySharedPtr geom, void *data_host, + void *data_device) { + + REAL *data_device_real = static_cast(data_device); + auto v0 = geom->GetVertex(0); + auto v1 = geom->GetVertex(1); + auto v2 = geom->GetVertex(2); + auto v3 = geom->GetVertex(3); + + NESOASSERT(v0->GetCoordim() == 3, "expected coordim == 3"); + NESOASSERT(v1->GetCoordim() == 3, "expected coordim == 3"); + NESOASSERT(v2->GetCoordim() == 3, "expected coordim == 3"); + NESOASSERT(v3->GetCoordim() == 3, "expected coordim == 3"); + + const int num_vertices = 4; + int ix = 0; + for (int vx = 0; vx < num_vertices; vx++) { + REAL xx[3]; + auto vertex = geom->GetVertex(vx); + vertex->GetCoords(xx[0], xx[1], xx[2]); + for (int iy = 0; iy < 3; iy++) { + data_device_real[ix + iy] = xx[iy]; + } + ix += 3; + } + NESOASSERT(ix == 12, "unexpected index"); + + PointGeom p0(3, 0, 0.0, 0.0, 0.0); + PointGeom p1(3, 1, 0.0, 0.0, 0.0); + PointGeom cx(3, 2, 0.0, 0.0, 0.0); + + // get a vector normal to the plane containing the quad to use as a penalty + // vector + p0.Sub(*v1, *v0); + p1.Sub(*v3, *v0); + cx.Mult(p0, p1); + NekDouble c0; + NekDouble c1; + NekDouble c2; + cx.GetCoords(c0, c1, c2); + NESOASSERT((ABS(c0) + ABS(c1) + ABS(c2)) > 0, + "Vector normal to plane has length 0."); + data_device_real[12] = c0; + data_device_real[13] = c1; + data_device_real[14] = c2; + + // 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()); + data_device_real[15] = ABS(1.0 / tol_scaling); + } + + inline void free_data_v(void *data_host) { return; } + + inline std::size_t data_size_host_v() { return 0; } + + inline std::size_t data_size_device_v() { return (5 * 3 + 1) * sizeof(REAL); } + + 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) { + + const REAL *data_device_real = static_cast(d_data); + const REAL v00 = data_device_real[0]; + const REAL v01 = data_device_real[1]; + const REAL v02 = data_device_real[2]; + const REAL v10 = data_device_real[3]; + const REAL v11 = data_device_real[4]; + const REAL v12 = data_device_real[5]; + const REAL v20 = data_device_real[6]; + const REAL v21 = data_device_real[7]; + const REAL v22 = data_device_real[8]; + const REAL v30 = data_device_real[9]; + const REAL v31 = data_device_real[10]; + const REAL v32 = data_device_real[11]; + const REAL c0 = data_device_real[12]; + const REAL c1 = data_device_real[13]; + const REAL c2 = data_device_real[14]; + + QuadrilateralEmbed3D::newton_step_linear_2d( + xi0, xi1, xi2, v00, v01, v02, v10, v11, v12, v20, v21, v22, v30, v31, + v32, c0, c1, c2, phys0, phys1, phys2, f0, f1, f2, xin0, xin1, xin2); + } + + 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) { + + const REAL *data_device_real = static_cast(d_data); + const REAL v00 = data_device_real[0]; + const REAL v01 = data_device_real[1]; + const REAL v02 = data_device_real[2]; + const REAL v10 = data_device_real[3]; + const REAL v11 = data_device_real[4]; + const REAL v12 = data_device_real[5]; + const REAL v20 = data_device_real[6]; + const REAL v21 = data_device_real[7]; + const REAL v22 = data_device_real[8]; + const REAL v30 = data_device_real[9]; + const REAL v31 = data_device_real[10]; + const REAL v32 = data_device_real[11]; + const REAL c0 = data_device_real[12]; + const REAL c1 = data_device_real[13]; + const REAL c2 = data_device_real[14]; + + QuadrilateralEmbed3D::newton_f_linear_2d( + xi0, xi1, xi2, v00, v01, v02, v10, v11, v12, v20, v21, v22, v30, v31, + v32, c0, c1, c2, phys0, phys1, phys2, f0, f1, f2); + + const REAL norm2 = MAX(MAX(ABS(*f0), ABS(*f1)), ABS(*f2)); + const REAL tol_scaling = data_device_real[15]; + 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) { + *eta0 = xi0; + *eta1 = xi1; + *eta2 = 0.0; + } +}; + +} // namespace Newton +} // namespace NESO + +#endif 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 new file mode 100644 index 00000000..6ec3741d --- /dev/null +++ b/include/nektar_interface/particle_cell_mapping/newton_triangle_embed_3d.hpp @@ -0,0 +1,187 @@ +#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 + +using namespace NESO; +using namespace NESO::Particles; + +namespace NESO { +namespace Newton { + +/** + * Implementation for linear sided triangle within the Newton iteration + * framework. + */ +struct MappingTriangleLinear2DEmbed3D + : MappingNewtonIterationBase { + + inline void write_data_v(GeometrySharedPtr geom, void *data_host, + void *data_device) { + + REAL *data_device_real = static_cast(data_device); + auto v0 = geom->GetVertex(0); + auto v1 = geom->GetVertex(1); + auto v2 = geom->GetVertex(2); + + NESOASSERT(v0->GetCoordim() == 3, "expected coordim == 3"); + NESOASSERT(v1->GetCoordim() == 3, "expected coordim == 3"); + NESOASSERT(v2->GetCoordim() == 3, "expected coordim == 3"); + + NekDouble v00; + NekDouble v01; + NekDouble v02; + NekDouble v10; + NekDouble v11; + NekDouble v12; + NekDouble v20; + NekDouble v21; + NekDouble v22; + v0->GetCoords(v00, v01, v02); + v1->GetCoords(v10, v11, v12); + v2->GetCoords(v20, v21, v22); + + const REAL e10_0 = v10 - v00; + const REAL e10_1 = v11 - v01; + const REAL e10_2 = v12 - v02; + const REAL e20_0 = v20 - v00; + const REAL e20_1 = v21 - v01; + const REAL e20_2 = v22 - v02; + + data_device_real[0] = v00; + data_device_real[1] = v01; + data_device_real[2] = v02; + data_device_real[3] = e10_0; + data_device_real[4] = e10_1; + data_device_real[5] = e10_2; + data_device_real[6] = e20_0; + data_device_real[7] = e20_1; + data_device_real[8] = e20_2; + + // 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()); + data_device_real[9] = ABS(1.0 / tol_scaling); + } + + inline void free_data_v(void *data_host) { return; } + + inline std::size_t data_size_host_v() { return 0; } + + inline std::size_t data_size_device_v() { return (10) * sizeof(REAL); } + + 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) { + // For linear sided triangles the set initial iteration method actually + // does the entire inverse mapping. + this->set_initial_iteration_v(d_data, phys0, phys1, phys2, xin0, xin1, + xin2); + } + + 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) { + + const REAL *data_device_real = static_cast(d_data); + const REAL v00 = data_device_real[0]; + const REAL v01 = data_device_real[1]; + const REAL v02 = data_device_real[2]; + const REAL e10_0 = data_device_real[3]; + const REAL e10_1 = data_device_real[4]; + const REAL e10_2 = data_device_real[5]; + const REAL e20_0 = data_device_real[6]; + const REAL e20_1 = data_device_real[7]; + const REAL e20_2 = data_device_real[8]; + + const REAL x0 = (xi0 + 1.0) * 0.5; + const REAL x1 = (xi1 + 1.0) * 0.5; + + const REAL tmp0 = v00 + x0 * e10_0 + x1 * e20_0; + const REAL tmp1 = v01 + x0 * e10_1 + x1 * e20_1; + const REAL tmp2 = v02 + x0 * e10_2 + x1 * e20_2; + + *f0 = tmp0 - phys0; + *f1 = tmp1 - phys1; + *f2 = tmp2 - phys2; + + const REAL norm2 = MAX(MAX(ABS(*f0), ABS(*f1)), ABS(*f2)); + const REAL tol_scaling = data_device_real[9]; + 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) { + + const REAL *data_device_real = static_cast(d_data); + const REAL v00 = data_device_real[0]; + const REAL v01 = data_device_real[1]; + const REAL v02 = data_device_real[2]; + const REAL e10_0 = data_device_real[3]; + const REAL e10_1 = data_device_real[4]; + const REAL e10_2 = data_device_real[5]; + const REAL e20_0 = data_device_real[6]; + const REAL e20_1 = data_device_real[7]; + const REAL e20_2 = data_device_real[8]; + + const REAL er_0 = phys0 - v00; + const REAL er_1 = phys1 - v01; + const REAL er_2 = phys2 - v02; + + MAPPING_CROSS_PRODUCT_3D(e10_0, e10_1, e10_2, e20_0, e20_1, e20_2, + const REAL norm_0, const REAL norm_1, + const REAL norm_2) + MAPPING_CROSS_PRODUCT_3D(norm_0, norm_1, norm_2, e10_0, e10_1, e10_2, + const REAL orth1_0, const REAL orth1_1, + const REAL orth1_2) + MAPPING_CROSS_PRODUCT_3D(norm_0, norm_1, norm_2, e20_0, e20_1, e20_2, + const REAL orth2_0, const REAL orth2_1, + const REAL orth2_2) + + const REAL scale0 = + MAPPING_DOT_PRODUCT_3D(er_0, er_1, er_2, orth2_0, orth2_1, orth2_2) / + MAPPING_DOT_PRODUCT_3D(e10_0, e10_1, e10_2, orth2_0, orth2_1, orth2_2); + + *xi0 = 2.0 * scale0 - 1.0; + const REAL scale1 = + MAPPING_DOT_PRODUCT_3D(er_0, er_1, er_2, orth1_0, orth1_1, orth1_2) / + MAPPING_DOT_PRODUCT_3D(e20_0, e20_1, e20_2, orth1_0, orth1_1, orth1_2); + *xi1 = 2.0 * scale1 - 1.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 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; + } +}; + +} // namespace Newton +} // namespace NESO + +#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 9b3a2f8c..7590e4ea 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 "x_map_newton_kernel.hpp" #include #include @@ -83,9 +84,9 @@ template class XMapNewton { * @param[in] xi0 Reference position, x component. * @param[in] xi1 Reference position, y component. * @param[in] xi2 Reference position, z component. - * @param[in, out] xi0 Global position X(xi), x component. - * @param[in, out] xi1 Global position X(xi), y component. - * @param[in, out] xi2 Global position X(xi), z component. + * @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. */ inline void x(const REAL xi0, const REAL xi1, const REAL xi2, REAL *phys0, REAL *phys1, REAL *phys2) { @@ -96,17 +97,12 @@ template class XMapNewton { 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); + XMapNewtonKernel k_newton_kernel; + k_newton_kernel.x(k_map_data, xi0, xi1, xi2, &f0, &f1, &f2); k_fdata[0] = f0; k_fdata[1] = f1; @@ -125,9 +121,9 @@ template class XMapNewton { * For a position X(xi) compute the reference position xi via Newton * iteration. * - * @param[in] xi0 Global position X(xi), x component. - * @param[in] xi1 Global position X(xi), y component. - * @param[in] xi2 Global position X(xi), z component. + * @param[in] phys0 Global position X(xi), x component. + * @param[in] phys1 Global position X(xi), y component. + * @param[in] phys2 Global position X(xi), z component. * @param[in, out] xi0 Reference position, x component. * @param[in, out] xi1 Reference position, y component. * @param[in, out] xi2 Reference position, z component. @@ -148,46 +144,19 @@ template class XMapNewton { 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; - - REAL residual = k_newton_type.newton_residual( - k_map_data, k_xi0, k_xi1, k_xi2, p0, p1, p2, &f0, &f1, &f2); - - 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); - - 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); - diverged = (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || - (ABS(k_xi2) > 15.0); - } + XMapNewtonKernel k_newton_kernel; + const bool converged = k_newton_kernel.x_inverse( + k_map_data, phys0, phys1, phys2, &k_xi0, &k_xi1, &k_xi2, + k_max_iterations, k_tol); 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] = converged ? 1 : -1; }); }) .wait_and_throw(); 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 new file mode 100644 index 00000000..598e376d --- /dev/null +++ b/include/nektar_interface/particle_cell_mapping/x_map_newton_kernel.hpp @@ -0,0 +1,119 @@ +#ifndef __X_MAP_NEWTON_KERNEL_H__ +#define __X_MAP_NEWTON_KERNEL_H__ + +#include +#include + +using namespace NESO::Particles; +using namespace Nektar::SpatialDomains; + +#include "mapping_newton_iteration_base.hpp" + +namespace NESO::Newton { +/** + * Utility struct to provide the kernel functions to evaluate X maps and their + * inverse. + */ +template struct XMapNewtonKernel { + + /** + * For a reference position xi compute the global position X(xi). + * + * @param[in] map_data Device data required by the Newton implementation. + * @param[in] xi0 Reference position, x component. + * @param[in] xi1 Reference position, y component. + * @param[in] xi2 Reference position, z component. + * @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. + */ + inline void x(const void *map_data, const REAL xi0, const REAL xi1, + const REAL xi2, REAL *phys0, REAL *phys1, REAL *phys2) { + + *phys0 = 0.0; + *phys1 = 0.0; + *phys2 = 0.0; + const REAL p0 = 0.0; + const REAL p1 = 0.0; + const REAL p2 = 0.0; + + MappingNewtonIterationBase k_newton_type{}; + k_newton_type.newton_residual(map_data, xi0, xi1, xi2, p0, p1, p2, phys0, + phys1, phys2); + } + + /** + * For a position X(xi) compute the reference position xi via Newton + * iteration. + * + * @param[in] map_data Device data required by the Newton implementation. + * @param[in] phys0 Global position X(xi), x component. + * @param[in] phys1 Global position X(xi), y component. + * @param[in] phys2 Global position X(xi), z component. + * @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] max_iterations Maximum number of Newton iterations. + * @param[in] tol Optional exit tolerance for Newton iterations + * (default 1.0e-10). + * @param[in] initial_override Optional flag to override starting point with + * the input xi values (default false). + * @returns True if inverse is found otherwise false. + */ + 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, + const REAL tol = 1.0e-10, + const bool initial_override = false) { + + 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(map_data, p0, p1, p2, &k_xi0, &k_xi1, + &k_xi2); + + k_xi0 = initial_override ? *xi0 : k_xi0; + k_xi1 = initial_override ? *xi1 : k_xi1; + k_xi2 = initial_override ? *xi2 : k_xi2; + + // Start of Newton iteration + 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); + + bool diverged = false; + + for (int stepx = 0; + ((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); + + 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); + + diverged = + (ABS(k_xi0) > 15.0) || (ABS(k_xi1) > 15.0) || (ABS(k_xi2) > 15.0); + } + *xi0 = k_xi0; + *xi1 = k_xi1; + *xi2 = k_xi2; + return (residual <= tol) ? true : false; + } +}; + +} // namespace NESO::Newton + +#endif diff --git a/include/nektar_interface/particle_interface.hpp b/include/nektar_interface/particle_interface.hpp index 8814c16c..805813a1 100644 --- a/include/nektar_interface/particle_interface.hpp +++ b/include/nektar_interface/particle_interface.hpp @@ -21,6 +21,7 @@ #include "bounding_box_intersection.hpp" #include "cell_id_translation.hpp" #include "geometry_transport/geometry_transport.hpp" +#include "geometry_transport/halo_extension.hpp" #include "particle_boundary_conditions.hpp" #include "particle_cell_mapping/particle_cell_mapping.hpp" #include "particle_mesh_interface.hpp" diff --git a/include/nektar_interface/particle_mesh_interface.hpp b/include/nektar_interface/particle_mesh_interface.hpp index 7c4c3f8b..e774fc44 100644 --- a/include/nektar_interface/particle_mesh_interface.hpp +++ b/include/nektar_interface/particle_mesh_interface.hpp @@ -19,8 +19,8 @@ #include #include "bounding_box_intersection.hpp" +#include "composite_interaction/composite_utility.hpp" #include "geometry_transport/geometry_transport.hpp" -#include "particle_boundary_conditions.hpp" using namespace Nektar::SpatialDomains; using namespace NESO; @@ -138,17 +138,34 @@ inline double overlap_1d(const double lhs, const double rhs, const int cell, * @param[in] mesh_hierarchy MeshHierarchy instance which cell claims will be * made into. * @param[in,out] cells Mesh heirarchy cells covered by bounding box. + * @param[in] pad_max_dim Optional padding for bounding box as a proportion of + * the maximum bounding box side length (default 0). */ template inline void bounding_box_map(T element, std::shared_ptr mesh_hierarchy, - std::deque> &cells) { + std::deque> &cells, + const double pad_max_dim = 0.0) { cells.clear(); - auto element_bounding_box = element->GetBoundingBox(); const int ndim = mesh_hierarchy->ndim; auto origin = mesh_hierarchy->origin; + auto element_bounding_box = element->GetBoundingBox(); + if (pad_max_dim > 0.0) { + double max_length = 0.0; + for (int dimx = 0; dimx < ndim; dimx++) { + double side_length = + element_bounding_box[dimx + 3] - element_bounding_box[dimx]; + max_length = std::max(side_length, max_length); + } + const double pad_offset = pad_max_dim * max_length; + for (int dimx = 0; dimx < ndim; dimx++) { + element_bounding_box[dimx + 3] += pad_offset; + element_bounding_box[dimx] -= pad_offset; + } + } + int cell_starts[3] = {0, 0, 0}; int cell_ends[3] = {1, 1, 1}; double shifted_bounding_box[6]; @@ -1026,43 +1043,33 @@ class ParticleMeshInterface : public HMesh { geom = std::dynamic_pointer_cast(get_element_3d(graph)); } NESOASSERT(geom != nullptr, "Geom pointer is null."); - - // Get the average of the geoms vertices as a point in the domain - const int num_verts = geom->GetNumVerts(); - auto v0 = geom->GetVertex(0); - Array coords(3); - v0->GetCoords(coords); + std::vector tmp_point; + get_vertex_average(std::static_pointer_cast(geom), + tmp_point); + NESOWARN(tmp_point.size() == this->ndim, + "Miss-match in vertex average coordim and ndim."); for (int dimx = 0; dimx < this->ndim; dimx++) { - point[dimx] = coords[dimx]; - } - for (int vx = 1; vx < num_verts; vx++) { - auto v = geom->GetVertex(vx); - v->GetCoords(coords); - for (int dimx = 0; dimx < this->ndim; dimx++) { - point[dimx] += coords[dimx]; - } - } - for (int dimx = 0; dimx < this->ndim; dimx++) { - point[dimx] /= ((double)num_verts); + point[dimx] = tmp_point.at(dimx); } - Array mid(3); - mid[2] = 0; + Array coords(3); for (int dimx = 0; dimx < this->ndim; dimx++) { - mid[dimx] = point[dimx]; + coords[dimx] = point[dimx]; + } + for (int dimx = this->ndim; dimx < 3; dimx++) { + coords[dimx] = 0.0; } // If somehow the average is not in the domain use the first vertex - if (!geom->ContainsPoint(mid)) { + if (!geom->ContainsPoint(coords)) { + auto v0 = geom->GetVertex(0); v0->GetCoords(coords); for (int dimx = 0; dimx < this->ndim; dimx++) { - const auto p = coords[dimx]; - point[dimx] = p; - mid[dimx] = p; + point[dimx] = coords[dimx]; } } - NESOASSERT(geom->ContainsPoint(mid), "Geom should contain this point"); + NESOASSERT(geom->ContainsPoint(coords), "Geom should contain this point"); }; }; diff --git a/include/nektar_interface/special_functions.hpp b/include/nektar_interface/special_functions.hpp index b136f41c..0272da7b 100644 --- a/include/nektar_interface/special_functions.hpp +++ b/include/nektar_interface/special_functions.hpp @@ -1,6 +1,26 @@ #ifndef __NESO_SPECIAL_FUNCTIONS_H_ #define __NESO_SPECIAL_FUNCTIONS_H_ +#ifndef MAPPING_CROSS_PRODUCT_3D +#define MAPPING_CROSS_PRODUCT_3D(a1, a2, a3, b1, b2, b3, c1, c2, c3) \ + c1 = ((a2) * (b3)) - ((a3) * (b2)); \ + c2 = ((a3) * (b1)) - ((a1) * (b3)); \ + c3 = ((a1) * (b2)) - ((a2) * (b1)); +#endif + +#ifndef MAPPING_DOT_PRODUCT_3D +#define MAPPING_DOT_PRODUCT_3D(a1, a2, a3, b1, b2, b3) \ + ((a1) * (b1) + (a2) * (b2) + (a3) * (b3)) +#endif + +#ifndef KERNEL_MIN +#define KERNEL_MIN(x, y) (((x) < (y)) ? (x) : (y)) +#endif + +#ifndef KERNEL_MAX +#define KERNEL_MAX(x, y) (((x) < (y)) ? (y) : (x)) +#endif + #include namespace NESO { diff --git a/include/nektar_interface/typedefs.hpp b/include/nektar_interface/typedefs.hpp new file mode 100644 index 00000000..223bcc62 --- /dev/null +++ b/include/nektar_interface/typedefs.hpp @@ -0,0 +1,13 @@ +#ifndef _NESO_NEKTAR_INTERFACE_TYPEDEFS_HPP_ +#define _NESO_NEKTAR_INTERFACE_TYPEDEFS_HPP_ + +#include + +namespace NESO { + +using REAL = Particles::REAL; +using INT = Particles::INT; + +}; // namespace NESO + +#endif diff --git a/include/nektar_interface/utilities.hpp b/include/nektar_interface/utilities.hpp index f0ac0e7b..8bc2ac7e 100644 --- a/include/nektar_interface/utilities.hpp +++ b/include/nektar_interface/utilities.hpp @@ -14,6 +14,8 @@ #include #include "cell_id_translation.hpp" +#include "geometry_transport/geometry_transport_2d.hpp" +#include "geometry_transport/geometry_transport_3d.hpp" using namespace Nektar; using namespace Nektar::SpatialDomains; @@ -421,6 +423,26 @@ class NESOCellsToNektarExp { inline int get_exp_id(const int neso_cell) { return this->map.at(neso_cell); } }; +/** + * Sample particle positions within each cell of a MeshGraph. + * + * @param[in] graph The MeshGraph in which to sample particle positions. + * @param[in] npart_per_cell The number of particles per cell to sample. + * @param[in, out] positions Output vector containing particle positions. + * @param[in, out] cells Output vector containing NESO-Particles compatible cell + * ids. + * @param[in] tol Tolerance to apply when determining if a point lies within an + * element. + * @param[in] rng Optional RNG to use. + * @returns RNG after sampling of particle positions. + */ +std::mt19937 +uniform_within_elements(Nektar::SpatialDomains::MeshGraphSharedPtr graph, + const int npart_per_cell, + std::vector> &positions, + std::vector &cells, const REAL tol = 1.0e-12, + std::optional rng_in = std::nullopt); + } // namespace NESO #endif diff --git a/include/nektar_interface/utility_mesh_plotting.hpp b/include/nektar_interface/utility_mesh_plotting.hpp index 628bcf7a..26c99465 100644 --- a/include/nektar_interface/utility_mesh_plotting.hpp +++ b/include/nektar_interface/utility_mesh_plotting.hpp @@ -25,9 +25,36 @@ namespace NESO { class VTKGeometryWriter { protected: std::vector> geoms; + std::map, REAL> geom_props; + + inline REAL get_property(const std::shared_ptr ptr) { + if (this->geom_props.count(ptr)) { + return this->geom_props.at(ptr); + } else { + return 0.0; + } + } public: - VTKGeometryWriter(){}; + int rank; + + VTKGeometryWriter() : rank(0){}; + VTKGeometryWriter(const int rank) : rank(rank){}; + + /** + * Push a geometry object onto the collection of objects to write to a vtk + * file along with a REAL property. + * + * @param[in] geom Shared pointer to Nektar++ geometry object. + * @param[in] prop Property to write with geometry object. + */ + template + inline void push_back(std::shared_ptr &geom, const REAL prop) { + auto ptr = std::dynamic_pointer_cast(geom); + this->geoms.push_back(ptr); + this->geom_props[ptr] = prop; + } + /** * Push a geometry object onto the collection of objects to write to a vtk * file. @@ -35,8 +62,9 @@ class VTKGeometryWriter { * @param[in] geom Shared pointer to Nektar++ geometry object. */ template inline void push_back(std::shared_ptr &geom) { - this->geoms.push_back(std::dynamic_pointer_cast(geom)); + this->push_back(geom, 0.0); } + /** * Write vtk file to disk with given filename. Filename should end with .vtk. * @@ -95,24 +123,73 @@ class VTKGeometryWriter { } vtk_file << "\n"; - std::vector edge_ints; + std::map map_shape_to_vtk; + map_shape_to_vtk[ePoint] = 1; + map_shape_to_vtk[eSegment] = 3; + map_shape_to_vtk[eTriangle] = 5; + map_shape_to_vtk[eQuadrilateral] = 9; + map_shape_to_vtk[eTetrahedron] = 10; + map_shape_to_vtk[eHexahedron] = 12; + map_shape_to_vtk[ePrism] = 13; + map_shape_to_vtk[ePyramid] = 14; + + std::vector cell_ints; + std::vector cell_type_ints; + std::vector properties; + properties.reserve(this->geoms.size() + edges.size()); + for (auto &edge : edges) { - edge_ints.push_back(2); - edge_ints.push_back( + cell_ints.push_back(2); + cell_ints.push_back( gid_to_vid.at(edge.second->GetVertex(0)->GetGlobalID())); - edge_ints.push_back( + cell_ints.push_back( gid_to_vid.at(edge.second->GetVertex(1)->GetGlobalID())); + cell_type_ints.push_back(3); + properties.push_back(0.0); + } + + for (auto &geom : this->geoms) { + // Not sure if the vertex ordering of Nektar matches VTK so restrict to + // 2D for now. + if (geom->GetCoordim() == 2) { + const int num_verts = geom->GetNumVerts(); + cell_ints.push_back(num_verts); + for (int vx = 0; vx < num_verts; vx++) { + auto vertex = geom->GetVertex(vx); + const int vertex_gid = vertex->GetVid(); + const int vertex_vtk_id = gid_to_vid[vertex_gid]; + cell_ints.push_back(vertex_vtk_id); + } + cell_type_ints.push_back(map_shape_to_vtk.at(geom->GetShapeType())); + } + properties.push_back(this->get_property(geom)); } - const int num_edges = edges.size(); - vtk_file << "CELLS " << num_edges << " " << edge_ints.size() << "\n"; - for (const int ix : edge_ints) { + + const int num_objs = cell_type_ints.size(); + vtk_file << "CELLS " << num_objs << " " << cell_ints.size() << "\n"; + for (const int ix : cell_ints) { vtk_file << ix << " "; } vtk_file << "\n"; vtk_file << "\n"; - vtk_file << "CELL_TYPES " << num_edges << "\n"; - for (int ix = 0; ix < num_edges; ix++) { - vtk_file << 3 << " "; + vtk_file << "CELL_TYPES " << num_objs << "\n"; + for (int ix = 0; ix < num_objs; ix++) { + vtk_file << cell_type_ints.at(ix) << " "; + } + + vtk_file << "\n"; + vtk_file << "CELL_DATA " << num_objs << "\n"; + vtk_file << "SCALARS rank float 1\n"; + vtk_file << "LOOKUP_TABLE CellColors\n"; + for (int gx = 0; gx < num_objs; gx++) { + vtk_file << this->rank << " "; + } + + vtk_file << "\n"; + vtk_file << "SCALARS generic_property float 1\n"; + vtk_file << "LOOKUP_TABLE CellColors\n"; + for (int gx = 0; gx < num_objs; gx++) { + vtk_file << properties.at(gx) << " "; } vtk_file.close(); @@ -136,7 +213,7 @@ write_vtk_cells_owned(std::string filename, const int rank = particle_mesh_interface->comm_rank; filename += "." + std::to_string(rank) + ".vtk"; - VTKGeometryWriter vtk_writer{}; + VTKGeometryWriter vtk_writer{rank}; if (ndim == 2) { std::map> geoms; @@ -172,18 +249,18 @@ write_vtk_cells_halo(std::string filename, const int rank = particle_mesh_interface->comm_rank; filename += "." + std::to_string(rank) + ".vtk"; - VTKGeometryWriter vtk_writer{}; + VTKGeometryWriter vtk_writer{rank}; if (ndim == 2) { for (auto &geom : particle_mesh_interface->remote_triangles) { - vtk_writer.push_back(geom->geom); + vtk_writer.push_back(geom->geom, geom->rank); } for (auto &geom : particle_mesh_interface->remote_quads) { - vtk_writer.push_back(geom->geom); + vtk_writer.push_back(geom->geom, geom->rank); } } else if (ndim == 3) { for (auto &geom : particle_mesh_interface->remote_geoms_3d) { - vtk_writer.push_back(geom->geom); + vtk_writer.push_back(geom->geom, geom->rank); } } @@ -214,6 +291,38 @@ inline void write_vtk_mesh_hierarchy_cells_owned( mh_writer.write(filename); } +/** + * Write the vertices and edges of all the fine mesh hierarchy cells to a file. + * Only write from rank 0. + * + * @param[in] filename Filename to write to, should end in .vtk. + * @param[in] particle_mesh_interface ParticleMeshInterface containing geometry + * objects. + */ +inline void write_vtk_mesh_hierarchy_cells_fine( + std::string filename, + ParticleMeshInterfaceSharedPtr particle_mesh_interface) { + VTKMeshHierarchyCellsWriter mh_writer( + particle_mesh_interface->mesh_hierarchy); + mh_writer.write_all_fine(filename); +} + +/** + * Write the vertices and edges of all the coarse mesh hierarchy cells to a + * file. Only write from rank 0. + * + * @param[in] filename Filename to write to, should end in .vtk. + * @param[in] particle_mesh_interface ParticleMeshInterface containing geometry + * objects. + */ +inline void write_vtk_mesh_hierarchy_cells_coarse( + std::string filename, + ParticleMeshInterfaceSharedPtr particle_mesh_interface) { + VTKMeshHierarchyCellsWriter mh_writer( + particle_mesh_interface->mesh_hierarchy); + mh_writer.write_all_coarse(filename); +} + } // namespace NESO #endif diff --git a/neso-particles b/neso-particles index ba6750d4..9097d541 160000 --- a/neso-particles +++ b/neso-particles @@ -1 +1 @@ -Subproject commit ba6750d429fe15bbec9b9c507b795cd3117b79b4 +Subproject commit 9097d541e64760c67f5f717b04502299f7c3b264 diff --git a/python/deformed_mappings/generate_linear_source.py b/python/deformed_mappings/generate_linear_source.py index 86ae3bc2..efc96843 100644 --- a/python/deformed_mappings/generate_linear_source.py +++ b/python/deformed_mappings/generate_linear_source.py @@ -11,6 +11,7 @@ import tetrahedron import hexahedron import quadrilateral +import quadrilateral_embed_3d from newton_generation import * from utility import get_generation_header @@ -35,6 +36,7 @@ tetrahedron.get_geom_type(), hexahedron.get_geom_type(), quadrilateral.get_geom_type(), + quadrilateral_embed_3d.get_geom_type(), ) # Create an instance of each type geom_objects = [gx() for gx in geom_types] diff --git a/python/deformed_mappings/quadrilateral_embed_3d.py b/python/deformed_mappings/quadrilateral_embed_3d.py new file mode 100644 index 00000000..b305845f --- /dev/null +++ b/python/deformed_mappings/quadrilateral_embed_3d.py @@ -0,0 +1,101 @@ +""" +Defines the X maps for Quadrilaterals embedded in 3D. +""" + + +from newton_generation import * + + +class LinearQuadEmbed3D(LinearBase): + def __init__(self): + # 5th "vertex" is penalty vector for the mapping and is orthogonal to + # the plane the quad is embedded in + num_vertices = 5 + ndim = 3 + name = "linear_2d" + namespace = "QuadrilateralEmbed3D" + x_description = """ +X(xi) = 0.25 * v0 * (1 - xi_0) * (1 - xi_1) + + 0.25 * v1 * (1 + xi_0) * (1 - xi_1) + + 0.25 * v3 * (1 - xi_0) * (1 + xi_1) + + 0.25 * v2 * (1 + xi_0) * (1 + xi_1) + V4 * xi_2 +""" + LinearBase.__init__(self, num_vertices, ndim, name, namespace, x_description) + + def get_x(self, xi): + + v = self.vertices + x = ( + 0.25 * v[0] * (1 - xi[0]) * (1 - xi[1]) + + 0.25 * v[1] * (1 + xi[0]) * (1 - xi[1]) + + 0.25 * v[3] * (1 - xi[0]) * (1 + xi[1]) + + 0.25 * v[2] * (1 + xi[0]) * (1 + xi[1]) + + xi[2] * v[4] + ) + return x + + +def self_test(): + + quad = LinearQuadEmbed3D() + + vertices_ref = ( + (-1.0, -1.0, 0.0), + (1.0, -1.0, 0.0), + (1.0, 1.0, 0.0), + (-1.0, 1.0, 0.0), + (0.0, 0.0, 1.0), + ) + quad_ref = LinearGeomEvaluate(quad, vertices_ref) + + for vx in vertices_ref[:-1]: + to_test = quad_ref.x(vx) + correct = vx + assert ( + np.linalg.norm( + np.array(correct).ravel() - np.array(to_test).ravel(), np.inf + ) + < 1.0e-15 + ) + to_test = quad_ref.f(vx, vx) + assert np.linalg.norm(np.array(to_test).ravel(), np.inf) < 1.0e-15 + + vertices_test = ( + (-3.0, -2.0, 1.0), + (1.0, -1.0, 1.0), + (2.0, 2.0, 1.0), + (-1.0, 4.0, 1.0), + (0.0, 0.0, 1.0), + ) + quad_test = LinearGeomEvaluate(quad, vertices_test) + quad_newton = Newton(quad) + + quad_newton_evaluate = NewtonEvaluate(quad_newton, quad_test) + + xi_correct0 = -0.9 + xi_correct1 = 0.8 + xi_correct2 = 0.0 + xi_correct = (xi_correct0, xi_correct1, xi_correct2) + phys = quad_test.x(xi_correct) + residual, fv = quad_newton_evaluate.residual(xi_correct, phys) + assert residual < 1.0e-15 + + xi = [0.0, 0.0, 0.0] + for stepx in range(5): + residual, fv = quad_newton_evaluate.residual(xi, phys) + xin = quad_newton_evaluate.step(xi, phys, fv) + xi[0] = xin[0] + xi[1] = xin[1] + + assert abs(xi[0] - xi_correct[0]) < 1.0e-14 + assert abs(xi[1] - xi_correct[1]) < 1.0e-14 + assert abs(xi[2]) < 1.0e-14 + + +def get_geom_type(): + self_test() + return LinearQuadEmbed3D + + +if __name__ == "__main__": + self_test() diff --git a/solvers/MeshPlotting/CMakeLists.txt b/solvers/MeshPlotting/CMakeLists.txt new file mode 100644 index 00000000..37db2706 --- /dev/null +++ b/solvers/MeshPlotting/CMakeLists.txt @@ -0,0 +1,15 @@ +include(CMakeDependentOption) +set(EXEC_TARGET_NAME MeshPlotting) + +set(MeshPlottingSource ${CMAKE_CURRENT_LIST_DIR}/MeshPlotting.cpp + ${CMAKE_CURRENT_LIST_DIR}/MeshPlottingInner.cpp) + +add_executable(${EXEC_TARGET_NAME} ${MeshPlottingSource}) + +# Depending on NESO_LIBRARY_NAME also pulls in all the dependencies like MPI, +# NESO-Particles, Nektar etc. +target_link_libraries(${EXEC_TARGET_NAME} PRIVATE ${NESO_LIBRARY_NAME}) +add_sycl_to_target(TARGET ${EXEC_TARGET_NAME} SOURCES ${MeshPlottingSource}) + +# Install location +install(TARGETS ${EXEC_TARGET_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) diff --git a/solvers/MeshPlotting/MeshPlotting.cpp b/solvers/MeshPlotting/MeshPlotting.cpp new file mode 100644 index 00000000..94d1305c --- /dev/null +++ b/solvers/MeshPlotting/MeshPlotting.cpp @@ -0,0 +1,106 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File CompressibleFlowSolver.cpp +// +// For more information, please see: http://www.nektar.info +// +// The MIT License +// +// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA), +// Department of Aeronautics, Imperial College London (UK), and Scientific +// Computing and Imaging Institute, University of Utah (USA). +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// Description: Compressible Flow Equations framework solver +// +/////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +using namespace Nektar; +using namespace Nektar::SolverUtils; + +#ifndef FIELD_TYPE +#define FIELD_TYPE ContField +#endif + +void mesh_plotting_inner(int argc, char **argv, + LibUtilities::SessionReaderSharedPtr session, + SpatialDomains::MeshGraphSharedPtr graph); + +void mesh_plotting_inner_halos(int argc, char **argv, + LibUtilities::SessionReaderSharedPtr session, + SpatialDomains::MeshGraphSharedPtr graph, + const int halo_stencil_width, + const int halo_stencil_pbc); + +int main(int argc, char *argv[]) { + LibUtilities::SessionReaderSharedPtr session; + SpatialDomains::MeshGraphSharedPtr graph; + std::string vDriverModule; + // DriverSharedPtr drv; + + try { + // Create session reader. + session = LibUtilities::SessionReader::CreateInstance(argc, argv); + + // Create MeshGraph. + graph = SpatialDomains::MeshGraph::Read(session); + + // Create driver + // session->LoadSolverInfo("Driver", vDriverModule, "Standard"); + // drv = GetDriverFactory().CreateInstance(vDriverModule, session, graph); + + // Print out timings if verbose + if (session->DefinesCmdLineArgument("verbose")) { + int iolevel; + + session->LoadParameter("IO_Timer_Level", iolevel, 1); + + LibUtilities::Timer::PrintElapsedRegions(session->GetComm(), std::cout, + iolevel); + } + + int halo_stencil_width = 0; + int halo_stencil_pbc = 1; + session->LoadParameter("halo_stencil_width", halo_stencil_width, 0); + session->LoadParameter("halo_stencil_pbc", halo_stencil_pbc, 1); + mesh_plotting_inner(argc, argv, session, graph); + + for (int sx = 0; sx < (halo_stencil_width + 1); sx++) { + mesh_plotting_inner_halos(argc, argv, session, graph, sx, + halo_stencil_pbc); + } + + // Finalise communications + session->Finalise(); + } catch (const std::runtime_error &) { + return 1; + } catch (const std::string &eStr) { + std::cout << "Error: " << eStr << std::endl; + } + + return 0; +} diff --git a/solvers/MeshPlotting/MeshPlottingInner.cpp b/solvers/MeshPlotting/MeshPlottingInner.cpp new file mode 100644 index 00000000..e2692109 --- /dev/null +++ b/solvers/MeshPlotting/MeshPlottingInner.cpp @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include + +#include "nektar_interface/particle_interface.hpp" +#include "nektar_interface/utilities.hpp" +#include "nektar_interface/utility_mesh_plotting.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::LibUtilities; +using namespace Nektar::SpatialDomains; +using namespace NESO; +using namespace NESO::Particles; +using namespace NESO::CompositeInteraction; + +void mesh_plotting_inner(int argc, char **argv, + LibUtilities::SessionReaderSharedPtr session, + SpatialDomains::MeshGraphSharedPtr graph) { + + auto mesh = std::make_shared(graph); + auto comm = mesh->get_comm(); + auto sycl_target = std::make_shared(0, comm); + write_vtk_cells_owned("mesh_owned", mesh); + write_vtk_cells_halo("mesh_halo_default", mesh); + write_vtk_mesh_hierarchy_cells_owned("mesh_mh", mesh); + write_vtk_mesh_hierarchy_cells_fine("mesh_mh_fine.vtk", mesh); + write_vtk_mesh_hierarchy_cells_coarse("mesh_mh_coarse.vtk", mesh); + + sycl_target->free(); + mesh->free(); +} + +void mesh_plotting_inner_halos(int argc, char **argv, + LibUtilities::SessionReaderSharedPtr session, + SpatialDomains::MeshGraphSharedPtr graph, + const int halo_stencil_width, + const int halo_stencil_pbc) { + + auto mesh = std::make_shared(graph); + extend_halos_fixed_offset(halo_stencil_width, mesh, (bool)halo_stencil_pbc); + auto comm = mesh->get_comm(); + auto sycl_target = std::make_shared(0, comm); + write_vtk_cells_halo("mesh_halo_width_" + std::to_string(halo_stencil_width), + mesh); + + sycl_target->free(); + mesh->free(); +} diff --git a/solvers/SimpleSOL/ParticleSystems/neutral_particles.hpp b/solvers/SimpleSOL/ParticleSystems/neutral_particles.hpp index 4321bbbc..6613a4ce 100644 --- a/solvers/SimpleSOL/ParticleSystems/neutral_particles.hpp +++ b/solvers/SimpleSOL/ParticleSystems/neutral_particles.hpp @@ -33,15 +33,15 @@ namespace SD = Nektar::SpatialDomains; */ inline double expint_barry_approx(const double x) { constexpr double gamma_Euler_Mascheroni = 0.5772156649015329; - const double G = std::exp(-gamma_Euler_Mascheroni); - const double b = std::sqrt(2 * (1 - G) / G / (2 - G)); - const double h_inf = (1 - G) * (std::pow(G, 2) - 6 * G + 12) / - (3 * G * std::pow(2 - G, 2) * b); - const double q = 20.0 / 47.0 * std::pow(x, std::sqrt(31.0 / 26.0)); - const double h = 1 / (1 + x * std::sqrt(x)) + h_inf * q / (1 + q); + const double G = sycl::exp(-gamma_Euler_Mascheroni); + const double b = sycl::sqrt(2 * (1 - G) / G / (2 - G)); + const double h_inf = + (1 - G) * ((G * G) - 6 * G + 12) / (3 * G * ((2 - G) * (2 - G)) * b); + const double q = 20.0 / 47.0 * sycl::pow(x, sycl::sqrt(31.0 / 26.0)); + const double h = 1 / (1 + x * sycl::sqrt(x)) + h_inf * q / (1 + q); const double logfactor = - std::log(1 + G / x - (1 - G) / std::pow(h + b * x, 2)); - return std::exp(-x) / (G + (1 - G) * std::exp(-(x / (1 - G)))) * logfactor; + sycl::log(1 + G / x - (1 - G) / ((h + b * x) * (h + b * x))); + return sycl::exp(-x) / (G + (1 - G) * sycl::exp(-(x / (1 - G)))) * logfactor; } class NeutralParticleSystem : public PartSysBase { diff --git a/src/diagnostics.cpp b/src/diagnostics.cpp index ac1c1269..85568651 100644 --- a/src/diagnostics.cpp +++ b/src/diagnostics.cpp @@ -69,10 +69,10 @@ void Diagnostics::compute_particle_energy(sycl::queue &Q, Plasma &plasma) { for (std::size_t j = 0; j < plasma.n_kinetic_spec; j++) { // double energy_spec = 0.0; const int n = plasma.kinetic_species.at(j).n; - double data[n]; + std::vector data(n); // Create buffer using host allocated "data" array - sycl::buffer buf(data, sycl::range<1>{size_t(n)}); + sycl::buffer buf(data.data(), sycl::range<1>{size_t(n)}); sycl::buffer vx_d( plasma.kinetic_species.at(j).v.x.data(), sycl::range<1>{plasma.kinetic_species.at(j).v.x.size()}); diff --git a/src/main.cpp b/src/main.cpp index bd91a469..89eaf649 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,6 +7,7 @@ #include "simulation.hpp" #include "sycl_typedefs.hpp" #include +#include #include // Value passed at compile time @@ -23,10 +24,10 @@ int main() { } }; // Check the sycl language version -#if defined(SYCL_LANGUAGE_VERSION) && SYCL_LANGUAGE_VERSION > 202003 - auto Q = sycl::queue{sycl::default_selector_v, asyncHandler}; -#else +#ifdef NESO_PARTICLES_LEGACY_DEVICE_SELECTORS auto Q = sycl::queue{sycl::default_selector{}, asyncHandler}; +#else + auto Q = sycl::queue{sycl::default_selector_v, asyncHandler}; #endif RunInfo run_info(Q, NESO::version::revision, NESO::version::git_state); diff --git a/src/nektar_interface/composite_interaction/composite_collections.cpp b/src/nektar_interface/composite_interaction/composite_collections.cpp new file mode 100644 index 00000000..b11fa2ee --- /dev/null +++ b/src/nektar_interface/composite_interaction/composite_collections.cpp @@ -0,0 +1,301 @@ +#include + +namespace NESO::CompositeInteraction { + +void CompositeCollections::collect_cell(const INT cell) { + // Don't reprocess a cell that has already been processed. + if (this->collected_cells.count(cell)) { + return; + } + this->collected_cells.insert(cell); + + std::vector>> + remote_quads; + std::vector>> + remote_tris; + std::vector< + std::shared_ptr>> + remote_segments; + this->composite_transport->get_geometry(cell, remote_quads, remote_tris, + remote_segments); + + const int num_quads = remote_quads.size(); + const int num_tris = remote_tris.size(); + const int num_segments = remote_segments.size(); + // create the CompositeCollection collection object that points to the + // geometry data we just placed on the device + std::vector cc(1); + cc[0].num_quads = 0; + cc[0].num_tris = 0; + cc[0].num_segments = 0; + + // host space for the normals + std::vector h_normal_data; + std::vector h_normal_ids; + std::vector normal_tmp; + int normal_stride = -1; + + auto lambda_push_normal = [&](auto geom_id, auto geom) { + get_normal_vector(geom, normal_tmp); + h_normal_data.insert(h_normal_data.end(), normal_tmp.begin(), + normal_tmp.end()); + h_normal_ids.push_back(geom_id); + }; + + auto lambda_push_num_modes = [&](auto geom) { + const auto num_modes = geom->GetXmap()->EvalBasisNumModesMax(); + this->max_num_modes = std::max(this->max_num_modes, num_modes); + }; + + // host space for group ids + std::vector h_group_ids_quads; + std::vector h_group_ids_tris; + std::vector h_group_ids_segments; + + if ((num_quads > 0) || (num_tris > 0)) { + + 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(); + NESOASSERT(mapper_quads.data_size_host() == 0, + "Expected 0 host bytes required for this mapper."); + NESOASSERT(mapper_tris.data_size_host() == 0, + "Expected 0 host bytes required for this mapper."); + + // we pack all the device data for the MeshHierachy cell into a single + // device buffer + 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); + 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; + std::vector composite_ids(num_quads + num_tris); + std::vector geom_ids(num_quads + num_tris); + + normal_stride = 3; + h_normal_data.reserve(3 * (num_quads + num_tris)); + h_normal_ids.reserve(num_quads + num_tris); + h_group_ids_quads.reserve(num_quads); + h_group_ids_tris.reserve(num_tris); + + 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, + map_data_quads + gx * stride_quads); + LinePlaneIntersection lpi(geom); + buf_lpi.push_back(lpi); + const auto composite_id = remote_geom->rank; + composite_ids[gx] = composite_id; + geom_ids[gx] = remote_geom->id; + this->map_composites_to_geoms[composite_id][remote_geom->id] = + std::dynamic_pointer_cast(geom); + lambda_push_normal(remote_geom->id, + std::dynamic_pointer_cast(geom)); + h_group_ids_quads.push_back( + this->map_composite_to_group.at(composite_id)); + lambda_push_num_modes(remote_geom->geom); + } + + 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); + LinePlaneIntersection lpi(geom); + buf_lpi.push_back(lpi); + const auto composite_id = remote_geom->rank; + composite_ids[num_quads + gx] = composite_id; + geom_ids[num_quads + gx] = remote_geom->id; + this->map_composites_to_geoms[composite_id][remote_geom->id] = + std::dynamic_pointer_cast(geom); + lambda_push_normal(remote_geom->id, + std::dynamic_pointer_cast(geom)); + h_group_ids_tris.push_back(this->map_composite_to_group.at(composite_id)); + lambda_push_num_modes(remote_geom->geom); + } + + // create a device buffer from the vector + auto d_buf = + std::make_shared>(this->sycl_target, buf); + this->stack_geometry_data.push(d_buf); + unsigned char *d_ptr = d_buf->ptr; + + // create the device buffer for the line plane intersection + auto d_lpi_buf = std::make_shared>( + this->sycl_target, buf_lpi); + this->stack_lpi_data.push(d_lpi_buf); + LinePlaneIntersection *d_lpi_quads = d_lpi_buf->ptr; + LinePlaneIntersection *d_lpi_tris = d_lpi_quads + num_quads; + + // device buffer for the composite ids + auto d_ci_buf = + std::make_shared>(this->sycl_target, composite_ids); + this->stack_composite_ids.push(d_ci_buf); + // device buffer for the geom ids + auto d_gi_buf = + std::make_shared>(this->sycl_target, geom_ids); + this->stack_composite_ids.push(d_gi_buf); + + // device buffers for group ids + auto d_gr_quads_buf = std::make_shared>( + this->sycl_target, h_group_ids_quads); + this->stack_composite_ids.push(d_gr_quads_buf); + auto d_gr_tris_buf = std::make_shared>(this->sycl_target, + h_group_ids_tris); + this->stack_composite_ids.push(d_gr_tris_buf); + + cc[0].num_quads = num_quads; + cc[0].num_tris = num_tris; + cc[0].lpi_quads = d_lpi_quads; + cc[0].lpi_tris = d_lpi_tris; + cc[0].stride_quads = stride_quads; + cc[0].stride_tris = stride_tris; + cc[0].buf_quads = d_ptr; + cc[0].buf_tris = d_ptr + offset_tris; + cc[0].composite_ids_quads = d_ci_buf->ptr; + cc[0].composite_ids_tris = d_ci_buf->ptr + num_quads; + cc[0].geom_ids_quads = d_gi_buf->ptr; + cc[0].geom_ids_tris = d_gi_buf->ptr + num_quads; + cc[0].group_ids_quads = d_gr_quads_buf->ptr; + cc[0].group_ids_tris = d_gr_tris_buf->ptr; + } + + if (num_segments > 0) { + std::vector geom_ids_segments; + geom_ids_segments.reserve(num_segments); + std::vector composite_ids_segments; + composite_ids_segments.reserve(num_segments); + std::vector lli_segments; + lli_segments.reserve(num_segments); + + normal_stride = 2; + h_normal_data.reserve(2 * num_segments); + h_normal_ids.reserve(num_segments); + h_group_ids_segments.reserve(num_segments); + + for (auto &rs : remote_segments) { + composite_ids_segments.push_back(rs->rank); + geom_ids_segments.push_back(rs->id); + lli_segments.emplace_back(rs->geom); + this->map_composites_to_geoms[rs->rank][rs->id] = + std::dynamic_pointer_cast(rs->geom); + lambda_push_normal(rs->id, + std::dynamic_pointer_cast(rs->geom)); + h_group_ids_segments.push_back(this->map_composite_to_group.at(rs->rank)); + lambda_push_num_modes(rs->geom); + } + + auto d_gi_buf = std::make_shared>(this->sycl_target, + geom_ids_segments); + this->stack_composite_ids.push(d_gi_buf); + auto d_ci_buf = std::make_shared>(this->sycl_target, + composite_ids_segments); + this->stack_composite_ids.push(d_ci_buf); + auto d_lli_buf = std::make_shared>( + this->sycl_target, lli_segments); + this->stack_lli_data.push(d_lli_buf); + + // device buffers for group ids + auto d_gr_segs_buf = std::make_shared>( + this->sycl_target, h_group_ids_segments); + this->stack_composite_ids.push(d_gr_segs_buf); + + cc[0].num_segments = num_segments; + cc[0].lli_segments = d_lli_buf->ptr; + cc[0].composite_ids_segments = d_ci_buf->ptr; + cc[0].geom_ids_segments = d_gi_buf->ptr; + cc[0].group_ids_segments = d_gr_segs_buf->ptr; + } + + // Having no entry in the tree is faster than having an entry with zero quads, + // triangles and segments defined. Hence only construct the node if it is + // non-empty. + if ((num_quads > 0) || (num_tris > 0) || (num_segments > 0)) { + // create the device buffer that holds this CompositeCollection + auto d_cc_buf = std::make_shared>( + this->sycl_target, cc); + this->stack_collection_data.push(d_cc_buf); + + // add the device pointer to the CompositeCollection we just created into + // the BlockedBinaryTree + this->map_cells_collections->add(cell, d_cc_buf->ptr); + + // write the normals + NESOASSERT(normal_stride == 2 || normal_stride == 3, "Bad normal stride."); + auto d_normal_data = + std::make_shared>(this->sycl_target, h_normal_data); + this->stack_real.push(d_normal_data); + + REAL *base_ptr = d_normal_data->ptr; + for (int ix = 0; ix < h_normal_ids.size(); ix++) { + this->map_normals->add(h_normal_ids.at(ix), + {base_ptr + normal_stride * ix}); + } + } +} + +void CompositeCollections::free() { this->composite_transport->free(); } + +CompositeCollections::CompositeCollections( + SYCLTargetSharedPtr sycl_target, + ParticleMeshInterfaceSharedPtr particle_mesh_interface, + std::map> boundary_groups) + : sycl_target(sycl_target), + particle_mesh_interface(particle_mesh_interface), + boundary_groups(boundary_groups), max_num_modes(0) { + + std::size_t s = 0; + for (auto &ix : boundary_groups) { + s += ix.second.size(); + } + std::vector composite_indices; + composite_indices.reserve(s); + { + std::set composite_indices_set; + for (auto &pairx : boundary_groups) { + for (auto cx : pairx.second) { + NESOASSERT(composite_indices_set.count(cx) == 0, + "Composite is listed more than once or is in multiple " + "boundary groups."); + composite_indices_set.insert(cx); + composite_indices.push_back(cx); + this->map_composite_to_group[cx] = pairx.first; + } + } + } + + this->composite_transport = std::make_shared( + particle_mesh_interface, composite_indices); + + this->map_cells_collections = + std::make_shared>( + this->sycl_target); + + this->map_normals = std::make_shared>( + this->sycl_target); + + for (auto cx : this->composite_transport->held_cells) { + this->collect_cell(cx); + } +} + +void CompositeCollections::collect_geometry(std::set &cells) { + this->composite_transport->collect_geometry(cells); + for (auto cx : cells) { + this->collect_cell(cx); + } +} + +NormalMapper CompositeCollections::get_device_normal_mapper() { + NormalMapper mapper; + mapper.root = this->map_normals->root; + return mapper; +} + +} // namespace NESO::CompositeInteraction diff --git a/src/nektar_interface/composite_interaction/composite_intersection.cpp b/src/nektar_interface/composite_interaction/composite_intersection.cpp new file mode 100644 index 00000000..e101cb22 --- /dev/null +++ b/src/nektar_interface/composite_interaction/composite_intersection.cpp @@ -0,0 +1,947 @@ +#include + +namespace NESO::CompositeInteraction { + +namespace { + +inline int indexing_cell_min(const int cell, const int num_cells, const int dim, + const int ndim) { + return cell + dim * num_cells; +} + +inline int indexing_cell_max(const int cell, const int num_cells, const int dim, + const int ndim) { + return cell + dim * num_cells + ndim * num_cells; +} + +inline REAL radius_squared(const int ndim, const REAL *r0, const REAL *r1) { + REAL dd = 0.0; + for (int dimx = 0; dimx < ndim; dimx++) { + const REAL d = (r0 - r1); + const REAL d2 = d * d; + dd += d2; + } + return dd; +} + +} // namespace + +template +void CompositeIntersection::find_cells(std::shared_ptr iteration_set, + std::set &cells) { + this->check_iteration_set(iteration_set); + + NESOASSERT(this->ndim < 4, + "Method assumes no more than 3 spatial dimensions."); + + auto particle_group = this->get_particle_group(iteration_set); + const auto position_dat = particle_group->position_dat; + const int k_ndim = this->ndim; + + const auto mesh_hierarchy_device_mapper = + this->mesh_hierarchy_mapper->get_device_mapper(); + + const int k_num_cells = this->num_cells; + const int k_INT_MAX = std::numeric_limits::max(); + const int k_INT_MIN = std::numeric_limits::min(); + auto k_cell_min_maxes = this->d_cell_min_maxes->ptr; + + // reset the bounding mesh hierarchy boxes for each element + sycl_target->queue + .submit([&](sycl::handler &cgh) { + cgh.parallel_for<>(sycl::range<1>(k_num_cells), [=](sycl::id<1> idx) { + for (int dimx = 0; dimx < k_ndim; dimx++) { + k_cell_min_maxes[indexing_cell_min(idx, k_num_cells, dimx, + k_ndim)] = k_INT_MAX; + + k_cell_min_maxes[indexing_cell_max(idx, k_num_cells, dimx, + k_ndim)] = k_INT_MIN; + } + }); + }) + .wait_and_throw(); + + // compute the new bounding boxes of mesh hierarchies for each element + particle_loop( + "CompositeIntersection::find_cells", iteration_set, + [=](auto index, auto k_P, auto k_PP) { + const INT cellx = index.cell; + + auto lambda_set_min_max = + [](const auto &cellx, const auto &k_num_cells, const auto &k_ndim, + const auto &position, const auto &cell_cart, + auto &k_cell_min_maxes, + const auto &mesh_hierarchy_device_mapper) -> void { + for (int dimx = 0; dimx < k_ndim; dimx++) { + { + sycl::atomic_ref + ar(k_cell_min_maxes[indexing_cell_min(cellx, k_num_cells, + dimx, k_ndim)]); + + const int trunc = + KERNEL_MAX(0, static_cast(cell_cart[dimx])); + ar.fetch_min(trunc); + } + { + sycl::atomic_ref + ar(k_cell_min_maxes[indexing_cell_max(cellx, k_num_cells, + dimx, k_ndim)]); + + const INT max_possible_cell = + mesh_hierarchy_device_mapper.dims[dimx] * + mesh_hierarchy_device_mapper.ncells_dim_fine; + const int trunc = KERNEL_MIN(max_possible_cell - 1, + static_cast(cell_cart[dimx])); + ar.fetch_max(trunc); + } + } + }; + + REAL position[3]; + INT cell_cart[3]; + + for (int dimx = 0; dimx < k_ndim; dimx++) { + position[dimx] = k_P.at(dimx); + } + mesh_hierarchy_device_mapper.map_to_cart_tuple_no_trunc(position, + cell_cart); + + lambda_set_min_max(cellx, k_num_cells, k_ndim, position, cell_cart, + k_cell_min_maxes, mesh_hierarchy_device_mapper); + + for (int dimx = 0; dimx < k_ndim; dimx++) { + position[dimx] = k_PP.at(dimx); + } + mesh_hierarchy_device_mapper.map_to_cart_tuple_no_trunc(position, + cell_cart); + + lambda_set_min_max(cellx, k_num_cells, k_ndim, position, cell_cart, + k_cell_min_maxes, mesh_hierarchy_device_mapper); + }, + Access::read(ParticleLoopIndex{}), Access::read(position_dat->sym), + Access::read(previous_position_sym)) + ->execute(); + + this->dh_max_bounding_box_size->h_buffer.ptr[0] = 0; + this->dh_max_bounding_box_size->host_to_device(); + auto k_max_ptr = this->dh_max_bounding_box_size->d_buffer.ptr; + + // determine the maximum bounding box size + sycl_target->queue + .submit([&](sycl::handler &cgh) { + cgh.parallel_for<>(sycl::range<1>(k_num_cells), [=](sycl::id<1> idx) { + bool valid = true; + int volume = 1; + for (int dimx = 0; dimx < k_ndim; dimx++) { + const int bound_min = k_cell_min_maxes[indexing_cell_min( + idx, k_num_cells, dimx, k_ndim)]; + + const int bound_max = k_cell_min_maxes[indexing_cell_max( + idx, k_num_cells, dimx, k_ndim)]; + + valid = (bound_max < bound_min) ? false : valid; + + const int width = bound_max - bound_min + 1; + volume *= width; + } + if (valid) { + sycl::atomic_ref + ar(k_max_ptr[0]); + ar.fetch_max(volume); + } + }); + }) + .wait_and_throw(); + + // realloc the array storing the cells covered if needed + this->dh_max_bounding_box_size->device_to_host(); + const INT max_bounding_box_size = + this->dh_max_bounding_box_size->h_buffer.ptr[0]; + + const INT required_cells_array_size = max_bounding_box_size * num_cells; + if (this->dh_mh_cells->size < required_cells_array_size) { + this->dh_mh_cells->realloc_no_copy(required_cells_array_size); + } + + // get the cells covered as linear mesh hierarchy indices + this->dh_mh_cells_index->h_buffer.ptr[0] = 0; + this->dh_mh_cells_index->host_to_device(); + auto k_mh_cells_index = this->dh_mh_cells_index->d_buffer.ptr; + auto k_mh_cells = this->dh_mh_cells->d_buffer.ptr; + sycl_target->queue + .submit([&](sycl::handler &cgh) { + cgh.parallel_for<>(sycl::range<1>(k_num_cells), [=](sycl::id<1> idx) { + bool valid = true; + INT cell_starts[3] = {0, 0, 0}; + INT cell_ends[3] = {1, 1, 1}; + + for (int dimx = 0; dimx < k_ndim; dimx++) { + const INT bound_min = k_cell_min_maxes[indexing_cell_min( + idx, k_num_cells, dimx, k_ndim)]; + + const INT bound_max = k_cell_min_maxes[indexing_cell_max( + idx, k_num_cells, dimx, k_ndim)]; + + valid = (bound_max < bound_min) ? false : valid; + cell_starts[dimx] = bound_min; + cell_ends[dimx] = bound_max + 1; + } + + if (valid) { + // loop over the cells in the bounding box + INT cell_index[3]; + for (cell_index[2] = cell_starts[2]; cell_index[2] < cell_ends[2]; + cell_index[2]++) { + for (cell_index[1] = cell_starts[1]; cell_index[1] < cell_ends[1]; + cell_index[1]++) { + for (cell_index[0] = cell_starts[0]; + cell_index[0] < cell_ends[0]; cell_index[0]++) { + + // convert the cartesian cell index into a mesh heirarchy + // index + INT mh_tuple[6]; + mesh_hierarchy_device_mapper.cart_tuple_to_tuple(cell_index, + mh_tuple); + // convert the mesh hierarchy tuple to linear index + const INT linear_index = + mesh_hierarchy_device_mapper.tuple_to_linear_global( + mh_tuple); + + sycl::atomic_ref + ar(k_mh_cells_index[0]); + const int index = ar.fetch_add(1); + k_mh_cells[index] = linear_index; + } + } + } + } + }); + }) + .wait_and_throw(); + + // collect the mesh hierarchy cells on the host and remove duplicates + this->dh_mh_cells->device_to_host(); + this->dh_mh_cells_index->device_to_host(); + const int num_collect_mh_cells = this->dh_mh_cells_index->h_buffer.ptr[0]; + cells.clear(); + for (int cx = 0; cx < num_collect_mh_cells; cx++) { + const INT cell = this->dh_mh_cells->h_buffer.ptr[cx]; + cells.insert(cell); + } +} + +template +void CompositeIntersection::find_intersections_2d( + std::shared_ptr iteration_set, ParticleDatSharedPtr dat_composite, + ParticleDatSharedPtr dat_positions) { + this->check_iteration_set(iteration_set); + auto particle_group = this->get_particle_group(iteration_set); + NESOASSERT(this->ndim == 2, "Method assumes 2 spatial dimensions."); + NESOASSERT(dat_positions->ncomp == this->ndim, + "Missmatch in number of spatial dimensions."); + NESOASSERT( + dat_composite->ncomp > 2, + "Require at least three components for the dat_composite argument."); + + const auto position_dat = particle_group->position_dat; + const int k_ndim = this->ndim; + const auto mesh_hierarchy_device_mapper = + this->mesh_hierarchy_mapper->get_device_mapper(); + + const REAL k_REAL_MAX = std::numeric_limits::max(); + + // the binary map containing the geometry information + auto k_MAP_ROOT = this->composite_collections->map_cells_collections->root; + if (k_MAP_ROOT != nullptr) { + + const double k_tol = this->line_intersection_tol; + const int k_max_iterations = this->newton_max_iteration; + + particle_loop( + "CompositeIntersection::find_intersections_2d", iteration_set, + [=](auto k_P, auto k_PP, auto k_OUT_P, auto k_OUT_C) { + REAL prev_position[2] = {0}; + REAL position[2] = {0}; + INT prev_cell_cart[2] = {0}; + INT cell_cart[2] = {0}; + + for (int dimx = 0; dimx < k_ndim; dimx++) { + position[dimx] = k_P.at(dimx); + } + mesh_hierarchy_device_mapper.map_to_cart_tuple_no_trunc(position, + cell_cart); + + for (int dimx = 0; dimx < k_ndim; dimx++) { + prev_position[dimx] = k_PP.at(dimx); + } + mesh_hierarchy_device_mapper.map_to_cart_tuple_no_trunc( + prev_position, prev_cell_cart); + + REAL intersection_distance = k_REAL_MAX; + + INT cell_starts[2] = {0, 0}; + INT cell_ends[2] = {1, 1}; + + // sanitise the bounds to actually be in the domain + for (int dimx = 0; dimx < k_ndim; dimx++) { + const INT max_possible_cell = + mesh_hierarchy_device_mapper.dims[dimx] * + mesh_hierarchy_device_mapper.ncells_dim_fine; + + cell_ends[dimx] = max_possible_cell; + + const INT bound_min = + KERNEL_MIN(prev_cell_cart[dimx], cell_cart[dimx]); + const INT bound_max = + KERNEL_MAX(prev_cell_cart[dimx], cell_cart[dimx]); + + if ((bound_min >= 0) && (bound_min < max_possible_cell)) { + cell_starts[dimx] = bound_min; + } + + if ((bound_max >= 0) && (bound_max < max_possible_cell)) { + cell_ends[dimx] = bound_max + 1; + } + } + + REAL i0, i1; + const REAL p00 = prev_position[0]; + const REAL p01 = prev_position[1]; + const REAL p10 = position[0]; + const REAL p11 = position[1]; + + // loop over the cells in the bounding box + INT cell_index[2]; + for (cell_index[1] = cell_starts[1]; cell_index[1] < cell_ends[1]; + cell_index[1]++) { + for (cell_index[0] = cell_starts[0]; cell_index[0] < cell_ends[0]; + cell_index[0]++) { + + // convert the cartesian cell index into a mesh heirarchy + // index + INT mh_tuple[4]; + mesh_hierarchy_device_mapper.cart_tuple_to_tuple(cell_index, + mh_tuple); + // convert the mesh hierarchy tuple to linear index + const INT linear_index = + mesh_hierarchy_device_mapper.tuple_to_linear_global(mh_tuple); + + // now we actually have a MeshHierarchy linear index to + // test for composite geoms + CompositeCollection *cc; + const bool cell_exists = k_MAP_ROOT->get(linear_index, &cc); + + if (cell_exists) { + const int num_segments = cc->num_segments; + for (int sx = 0; sx < num_segments; sx++) { + REAL i0, i1; + const bool contained = + cc->lli_segments[sx].line_line_intersection( + p00, p01, p10, p11, &i0, &i1, k_tol); + + if (contained) { + const REAL r0 = p00 - i0; + const REAL r1 = p01 - i1; + const REAL d2 = r0 * r0 + r1 * r1; + if (d2 < intersection_distance) { + k_OUT_P.at(0) = i0; + k_OUT_P.at(1) = i1; + k_OUT_C.at(0) = cc->group_ids_segments[sx]; + k_OUT_C.at(1) = cc->composite_ids_segments[sx]; + k_OUT_C.at(2) = cc->geom_ids_segments[sx]; + intersection_distance = d2; + } + } + } + } + } + } + }, + Access::read(position_dat->sym), Access::read(previous_position_sym), + Access::write(dat_positions->sym), Access::write(dat_composite->sym)) + ->execute(); + } +} + +template +void CompositeIntersection::find_intersections_3d( + std::shared_ptr iteration_set, ParticleDatSharedPtr dat_composite, + ParticleDatSharedPtr dat_positions) { + this->check_iteration_set(iteration_set); + auto particle_group = this->get_particle_group(iteration_set); + NESOASSERT(this->ndim == 3, "Method assumes 3 spatial dimensions."); + NESOASSERT(dat_positions->ncomp == this->ndim, + "Missmatch in number of spatial dimensions."); + NESOASSERT( + dat_composite->ncomp > 2, + "Require at least three components for the dat_composite argument."); + + const auto position_dat = particle_group->position_dat; + const int k_ndim = this->ndim; + const auto mesh_hierarchy_device_mapper = + this->mesh_hierarchy_mapper->get_device_mapper(); + + const REAL k_REAL_MAX = std::numeric_limits::max(); + + // the binary map containing the geometry information + auto k_MAP_ROOT = this->composite_collections->map_cells_collections->root; + + const double k_newton_tol = this->newton_tol; + const double k_contained_tol = this->contained_tol; + const int k_max_iterations = this->newton_max_iteration; + const auto k_MASK = this->mask; + const int grid_size = std::max( + this->num_modes_factor * this->composite_collections->max_num_modes - 1, + 1); + const int k_grid_size_x = grid_size; + const int k_grid_size_y = grid_size; + const REAL k_grid_width = 2.0 / grid_size; + + particle_loop( + "CompositeIntersection::find_intersections_3d_quads", iteration_set, + [=](auto k_P, auto k_PP, auto k_OUT_P, auto k_OUT_C) { + REAL prev_position[3] = {0}; + REAL position[3] = {0}; + INT prev_cell_cart[3] = {0}; + INT cell_cart[3] = {0}; + + for (int dimx = 0; dimx < k_ndim; dimx++) { + position[dimx] = k_P.at(dimx); + } + mesh_hierarchy_device_mapper.map_to_cart_tuple_no_trunc(position, + cell_cart); + + for (int dimx = 0; dimx < k_ndim; dimx++) { + prev_position[dimx] = k_PP.at(dimx); + } + mesh_hierarchy_device_mapper.map_to_cart_tuple_no_trunc(prev_position, + prev_cell_cart); + + REAL intersection_distance = k_REAL_MAX; + + INT cell_starts[3] = {0, 0, 0}; + INT cell_ends[3] = {1, 1, 1}; + + // sanitise the bounds to actually be in the domain + for (int dimx = 0; dimx < k_ndim; dimx++) { + const INT max_possible_cell = + mesh_hierarchy_device_mapper.dims[dimx] * + mesh_hierarchy_device_mapper.ncells_dim_fine; + + cell_ends[dimx] = max_possible_cell; + + const INT bound_min = + KERNEL_MIN(prev_cell_cart[dimx], cell_cart[dimx]); + const INT bound_max = + KERNEL_MAX(prev_cell_cart[dimx], cell_cart[dimx]); + + if ((bound_min >= 0) && (bound_min < max_possible_cell)) { + cell_starts[dimx] = bound_min; + } + + if ((bound_max >= 0) && (bound_max < max_possible_cell)) { + cell_ends[dimx] = bound_max + 1; + } + } + + REAL i0, i1, i2; + const REAL p00 = prev_position[0]; + const REAL p01 = prev_position[1]; + const REAL p02 = prev_position[2]; + const REAL p10 = position[0]; + const REAL p11 = position[1]; + const REAL p12 = position[2]; + + // loop over the cells in the bounding box + INT cell_index[3]; + for (cell_index[2] = cell_starts[2]; cell_index[2] < cell_ends[2]; + cell_index[2]++) { + for (cell_index[1] = cell_starts[1]; cell_index[1] < cell_ends[1]; + cell_index[1]++) { + for (cell_index[0] = cell_starts[0]; cell_index[0] < cell_ends[0]; + cell_index[0]++) { + + // convert the cartesian cell index into a mesh heirarchy + // index + INT mh_tuple[6]; + mesh_hierarchy_device_mapper.cart_tuple_to_tuple(cell_index, + mh_tuple); + // convert the mesh hierarchy tuple to linear index + const INT linear_index = + mesh_hierarchy_device_mapper.tuple_to_linear_global(mh_tuple); + + // now we actually have a MeshHierarchy linear index to + // test for composite geoms + CompositeCollection *cc; + const bool cell_exists = k_MAP_ROOT->get(linear_index, &cc); + + if (cell_exists) { + const int num_quads = cc->num_quads; + const int num_tris = cc->num_tris; + REAL eta0, eta1, eta2; + for (int gx = 0; gx < num_quads; gx++) { + // get the plane of the geom + const LinePlaneIntersection *lpi = &cc->lpi_quads[gx]; + // does the trajectory intersect the plane + if (lpi->line_segment_intersection(p00, p01, p02, p10, p11, + p12, &i0, &i1, &i2)) { + // is the intersection point near to the geom + if (lpi->point_near_to_geom(i0, i1, i2)) { + + const unsigned char *map_data = + cc->buf_quads + gx * cc->stride_quads; + Newton::MappingNewtonIterationBase< + Newton::MappingQuadLinear2DEmbed3D> + k_newton_type{}; + Newton::XMapNewtonKernel< + Newton::MappingQuadLinear2DEmbed3D> + k_newton_kernel; + + bool cell_found = false; + + // Quads don't have a singularity we need to consider + 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 xi[3] = {-1.0 + g0 * k_grid_width, + -1.0 + g1 * k_grid_width, 0.0}; + + 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); + + k_newton_type.loc_coord_to_loc_collapsed( + map_data, xi[0], xi[1], xi[2], &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)); + + cell_found = contained && converged; + if (cell_found) { + const REAL r0 = p00 - i0; + const REAL r1 = p01 - i1; + const REAL r2 = p02 - i2; + const REAL d2 = r0 * r0 + r1 * r1 + r2 * r2; + if (d2 < intersection_distance) { + k_OUT_P.at(0) = i0; + k_OUT_P.at(1) = i1; + k_OUT_P.at(2) = i2; + k_OUT_C.at(0) = cc->group_ids_quads[gx]; + k_OUT_C.at(1) = cc->composite_ids_quads[gx]; + k_OUT_C.at(2) = cc->geom_ids_quads[gx]; + intersection_distance = d2; + } + } + } + } + } + } + } + } + } + } + } + }, + Access::read(position_dat->sym), Access::read(previous_position_sym), + Access::write(dat_positions->sym), Access::write(dat_composite->sym)) + ->execute(); + + particle_loop( + "CompositeIntersection::find_intersections_3d_triangles", iteration_set, + [=](auto k_P, auto k_PP, auto k_OUT_P, auto k_OUT_C) { + REAL prev_position[3] = {0}; + REAL position[3] = {0}; + INT prev_cell_cart[3] = {0}; + INT cell_cart[3] = {0}; + + for (int dimx = 0; dimx < k_ndim; dimx++) { + position[dimx] = k_P.at(dimx); + } + mesh_hierarchy_device_mapper.map_to_cart_tuple_no_trunc(position, + cell_cart); + + for (int dimx = 0; dimx < k_ndim; dimx++) { + prev_position[dimx] = k_PP.at(dimx); + } + mesh_hierarchy_device_mapper.map_to_cart_tuple_no_trunc(prev_position, + prev_cell_cart); + + const REAL d0 = k_OUT_P.at(0) - k_PP.at(0); + const REAL d1 = k_OUT_P.at(1) - k_PP.at(1); + const REAL d2 = k_OUT_P.at(2) - k_PP.at(2); + const REAL intersection_distance_p = d0 * d0 + d1 * d1 + d2 * d2; + + REAL intersection_distance = + (k_OUT_C.at(0) != k_MASK) ? intersection_distance_p : k_REAL_MAX; + + INT cell_starts[3] = {0, 0, 0}; + INT cell_ends[3] = {1, 1, 1}; + + // sanitise the bounds to actually be in the domain + for (int dimx = 0; dimx < k_ndim; dimx++) { + const INT max_possible_cell = + mesh_hierarchy_device_mapper.dims[dimx] * + mesh_hierarchy_device_mapper.ncells_dim_fine; + + cell_ends[dimx] = max_possible_cell; + + const INT bound_min = + KERNEL_MIN(prev_cell_cart[dimx], cell_cart[dimx]); + const INT bound_max = + KERNEL_MAX(prev_cell_cart[dimx], cell_cart[dimx]); + + if ((bound_min >= 0) && (bound_min < max_possible_cell)) { + cell_starts[dimx] = bound_min; + } + + if ((bound_max >= 0) && (bound_max < max_possible_cell)) { + cell_ends[dimx] = bound_max + 1; + } + } + + REAL i0, i1, i2; + const REAL p00 = prev_position[0]; + const REAL p01 = prev_position[1]; + const REAL p02 = prev_position[2]; + const REAL p10 = position[0]; + const REAL p11 = position[1]; + const REAL p12 = position[2]; + + // loop over the cells in the bounding box + INT cell_index[3]; + for (cell_index[2] = cell_starts[2]; cell_index[2] < cell_ends[2]; + cell_index[2]++) { + for (cell_index[1] = cell_starts[1]; cell_index[1] < cell_ends[1]; + cell_index[1]++) { + for (cell_index[0] = cell_starts[0]; cell_index[0] < cell_ends[0]; + cell_index[0]++) { + + // convert the cartesian cell index into a mesh heirarchy + // index + INT mh_tuple[6]; + mesh_hierarchy_device_mapper.cart_tuple_to_tuple(cell_index, + mh_tuple); + // convert the mesh hierarchy tuple to linear index + const INT linear_index = + mesh_hierarchy_device_mapper.tuple_to_linear_global(mh_tuple); + + // now we actually have a MeshHierarchy linear index to + // test for composite geoms + CompositeCollection *cc; + const bool cell_exists = k_MAP_ROOT->get(linear_index, &cc); + + if (cell_exists) { + const int num_quads = cc->num_quads; + const int num_tris = cc->num_tris; + + REAL xi0, xi1, xi2, eta0, eta1, eta2; + for (int gx = 0; gx < num_tris; gx++) { + // get the plane of the geom + const LinePlaneIntersection *lpi = &cc->lpi_tris[gx]; + // does the trajectory intersect the plane + if (lpi->line_segment_intersection(p00, p01, p02, p10, p11, + p12, &i0, &i1, &i2)) { + // is the intersection point near to the geom + if (lpi->point_near_to_geom(i0, i1, i2)) { + + const unsigned char *map_data = + cc->buf_tris + gx * cc->stride_tris; + Newton::MappingNewtonIterationBase< + Newton::MappingTriangleLinear2DEmbed3D> + k_newton_type{}; + Newton::XMapNewtonKernel< + Newton::MappingTriangleLinear2DEmbed3D> + 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); + + 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)); + + if (contained && converged) { + const REAL r0 = p00 - i0; + const REAL r1 = p01 - i1; + const REAL r2 = p02 - i2; + const REAL d2 = r0 * r0 + r1 * r1 + r2 * r2; + if (d2 < intersection_distance) { + k_OUT_P.at(0) = i0; + k_OUT_P.at(1) = i1; + k_OUT_P.at(2) = i2; + k_OUT_C.at(0) = cc->group_ids_tris[gx]; + k_OUT_C.at(1) = cc->composite_ids_tris[gx]; + k_OUT_C.at(2) = cc->geom_ids_tris[gx]; + intersection_distance = d2; + } + } + } + } + } + } + } + } + } + }, + Access::read(position_dat->sym), Access::read(previous_position_sym), + Access::write(dat_positions->sym), Access::write(dat_composite->sym)) + ->execute(); +} + +void CompositeIntersection::free() { this->composite_collections->free(); } + +CompositeIntersection::CompositeIntersection( + SYCLTargetSharedPtr sycl_target, + ParticleMeshInterfaceSharedPtr particle_mesh_interface, + std::map> boundary_groups, + ParameterStoreSharedPtr config) + : sycl_target(sycl_target), + particle_mesh_interface(particle_mesh_interface), + ndim(particle_mesh_interface->graph->GetMeshDimension()), + boundary_groups(boundary_groups), + num_cells(particle_mesh_interface->get_cell_count()) { + + for (auto pair : boundary_groups) { + NESOASSERT(pair.first != this->mask, + "Cannot have a boundary group with label " + + std::to_string(this->mask) + "."); + } + + this->composite_collections = std::make_shared( + sycl_target, particle_mesh_interface, boundary_groups); + this->mesh_hierarchy_mapper = std::make_unique( + sycl_target, this->particle_mesh_interface->get_mesh_hierarchy()); + + this->d_cell_min_maxes = std::make_unique>( + this->sycl_target, 2 * this->ndim * this->num_cells); + + this->dh_max_bounding_box_size = + std::make_unique>(this->sycl_target, 1); + this->dh_mh_cells = + std::make_unique>(this->sycl_target, 128); + this->dh_mh_cells_index = + std::make_unique>(this->sycl_target, 1); + + this->line_intersection_tol = + config->get("CompositeIntersection/line_intersection_tol", 1.0e-8); + this->newton_tol = + config->get("CompositeIntersection/newton_tol", 1.0e-8); + this->newton_max_iteration = + config->get("CompositeIntersection/newton_max_iteration", 51); + this->contained_tol = config->get("CompositeIntersection/contained_tol", + this->newton_tol); + this->num_modes_factor = + config->get("CompositeIntersection/num_modes_factor", 1); +} + +template +void CompositeIntersection::pre_integration(std::shared_ptr iteration_set, + Sym output_sym_composite) { + this->check_iteration_set(iteration_set); + auto particle_group = this->get_particle_group(iteration_set); + const auto position_dat = particle_group->position_dat; + const int ndim = position_dat->ncomp; + NESOASSERT(ndim == this->ndim, + "missmatch between particle ndim and class ndim"); + NESOASSERT(this->sycl_target == particle_group->sycl_target, + "missmatch of sycl target"); + + if (!particle_group->contains_dat(output_sym_composite)) { + particle_group->add_particle_dat( + ParticleDat(this->sycl_target, ParticleProp(output_sym_composite, 3), + particle_group->domain->mesh->get_cell_count())); + } + NESOASSERT(particle_group->get_dat(output_sym_composite)->ncomp > 2, + "Insufficent components for output_sym_composite."); + + // If the previous position dat does not already exist create it here + if (!particle_group->contains_dat(previous_position_sym)) { + particle_group->add_particle_dat(ParticleDat( + this->sycl_target, ParticleProp(previous_position_sym, ndim), + particle_group->domain->mesh->get_cell_count())); + } + + // copy the current position onto the previous position + particle_loop( + "CompositeIntersection::pre_integration", iteration_set, + [=](auto P, auto PP) { + for (int dimx = 0; dimx < ndim; dimx++) { + PP.at(dimx) = P.at(dimx); + } + }, + Access::read(position_dat->sym), Access::write(previous_position_sym)) + ->execute(); +} + +template +void CompositeIntersection::execute(std::shared_ptr iteration_set, + Sym output_sym_composite, + Sym output_sym_position) { + + this->check_iteration_set(iteration_set); + auto particle_group = this->get_particle_group(iteration_set); + + NESOASSERT( + particle_group->contains_dat(previous_position_sym), + "Previous position ParticleDat not found. Was pre_integration called?"); + + if (!particle_group->contains_dat(output_sym_composite)) { + particle_group->add_particle_dat( + ParticleDat(this->sycl_target, ParticleProp(output_sym_composite, 3), + particle_group->domain->mesh->get_cell_count())); + } + if (!particle_group->contains_dat(output_sym_position)) { + const int ncomp = particle_group->position_dat->ncomp; + particle_group->add_particle_dat( + ParticleDat(this->sycl_target, ParticleProp(output_sym_position, ncomp), + particle_group->domain->mesh->get_cell_count())); + } + + ParticleDatSharedPtr dat_positions = + particle_group->get_dat(output_sym_position); + NESOASSERT(dat_positions->ncomp >= this->ndim, + "Insuffient number of components."); + ParticleDatSharedPtr dat_composite = + particle_group->get_dat(output_sym_composite); + NESOASSERT(dat_composite->ncomp >= 3, "Insuffient number of components."); + + // find the MeshHierarchy cells that the particles potentially pass though + std::set mh_cells; + this->find_cells(iteration_set, mh_cells); + + // Collect the geometry objects for the composites of interest for these + // cells. On exit from this function mh_cells contains only the new mesh + // hierarchy cells which were collected. + this->composite_collections->collect_geometry(mh_cells); + + const auto k_ndim = particle_group->position_dat->ncomp; + const auto k_mask = this->mask; + particle_loop( + "CompositeIntersection::execute_init", iteration_set, + [=](auto C, auto P) { + for (int dimx = 0; dimx < k_ndim; dimx++) { + P.at(dimx) = 0; + } + C.at(0) = k_mask; + C.at(1) = 0; + C.at(2) = 0; + }, + Access::write(dat_composite->sym), Access::write(dat_positions->sym)) + ->execute(); + + // find the intersection points for the composites + if (this->ndim == 3) { + this->find_intersections_3d(iteration_set, dat_composite, dat_positions); + } else { + this->find_intersections_2d(iteration_set, dat_composite, dat_positions); + } +} + +template +std::map +CompositeIntersection::get_intersections(std::shared_ptr iteration_set, + Sym output_sym_composite, + Sym output_sym_position) { + + // Get the intersections with composites + this->execute(iteration_set, output_sym_composite, output_sym_position); + + // Collect the intersections into ParticleSubGroups + const auto k_mask = this->mask; + auto particle_hitting_composites = static_particle_sub_group( + iteration_set, + [=](auto C) { + // If the first component is set then the particle hit a composite. + return C.at(0) != k_mask; + }, + Access::read(output_sym_composite)); + + // split into ParticleSubGroups per composite hit + std::map map_composites_to_particles; + for (const auto &pair : this->boundary_groups) { + const auto k_boundary_label = pair.first; + map_composites_to_particles[k_boundary_label] = static_particle_sub_group( + particle_hitting_composites, + [=](auto C) { return C.at(0) == k_boundary_label; }, + Access::read(output_sym_composite)); + } + + return map_composites_to_particles; +} + +template void CompositeIntersection::find_cells( + std::shared_ptr iteration_set, std::set &cells); + +template void CompositeIntersection::find_intersections_3d( + std::shared_ptr iteration_set, + ParticleDatSharedPtr dat_composite, + ParticleDatSharedPtr dat_positions); + +template void CompositeIntersection::pre_integration( + std::shared_ptr iteration_set, + Sym output_sym_composite = + Sym(CompositeIntersection::output_sym_composite_name)); + +template void CompositeIntersection::execute( + std::shared_ptr iteration_set, + Sym output_sym_composite = + Sym(CompositeIntersection::output_sym_composite_name), + Sym output_sym_position = + Sym(CompositeIntersection::output_sym_position_name)); + +template std::map +CompositeIntersection::get_intersections( + std::shared_ptr iteration_set, + Sym output_sym_composite = + Sym(CompositeIntersection::output_sym_composite_name), + Sym output_sym_position = + Sym(CompositeIntersection::output_sym_position_name)); + +template void CompositeIntersection::find_cells( + std::shared_ptr iteration_set, std::set &cells); + +template void CompositeIntersection::find_intersections_3d( + std::shared_ptr iteration_set, + ParticleDatSharedPtr dat_composite, + ParticleDatSharedPtr dat_positions); + +template void CompositeIntersection::pre_integration( + std::shared_ptr iteration_set, + Sym output_sym_composite = + Sym(CompositeIntersection::output_sym_composite_name)); + +template void CompositeIntersection::execute( + std::shared_ptr iteration_set, + Sym output_sym_composite = + Sym(CompositeIntersection::output_sym_composite_name), + Sym output_sym_position = + Sym(CompositeIntersection::output_sym_position_name)); + +template std::map +CompositeIntersection::get_intersections( + std::shared_ptr iteration_set, + Sym output_sym_composite = + Sym(CompositeIntersection::output_sym_composite_name), + Sym output_sym_position = + Sym(CompositeIntersection::output_sym_position_name)); + +} // namespace NESO::CompositeInteraction diff --git a/src/nektar_interface/composite_interaction/composite_transport.cpp b/src/nektar_interface/composite_interaction/composite_transport.cpp new file mode 100644 index 00000000..d129923b --- /dev/null +++ b/src/nektar_interface/composite_interaction/composite_transport.cpp @@ -0,0 +1,182 @@ +#include + +namespace NESO::CompositeInteraction { + +void CompositeTransport::free() { + if (this->allocated) { + this->mh_container->free(); + this->mh_container = nullptr; + MPICHK(MPI_Comm_free(&this->comm)); + this->allocated = false; + } +} + +void CompositeTransport::get_geometry( + const INT cell, + std::vector>> + &remote_quads, + std::vector>> + &remote_tris, + std::vector< + std::shared_ptr>> + &remote_segments) { + + remote_quads.clear(); + remote_tris.clear(); + + std::vector> geoms; + this->mh_container->get(cell, geoms); + + if (geoms.size() > 0) { + if (this->ndim == 3) { + for (auto gx : geoms) { + auto shape_type = gx.geom->GetShapeType(); + if (shape_type == LibUtilities::eTriangle) { + auto ptr = std::dynamic_pointer_cast(gx.geom); + NESOASSERT(ptr.get() != nullptr, "bad cast of ptr to TriGeom"); + remote_tris.push_back( + std::make_shared>(gx.rank, gx.id, ptr)); + } else { + auto ptr = std::dynamic_pointer_cast(gx.geom); + NESOASSERT(ptr.get() != nullptr, "bad cast of ptr to QuadGeom"); + remote_quads.push_back( + std::make_shared>(gx.rank, gx.id, ptr)); + } + } + } else if (this->ndim == 2) { + for (auto gx : geoms) { + auto shape_type = gx.geom->GetShapeType(); + NESOASSERT(shape_type == LibUtilities::eSegment, + "Expect only 1D edge composites"); + auto ptr = std::dynamic_pointer_cast(gx.geom); + NESOASSERT(ptr.get() != nullptr, "bad cast of ptr to SegGeom"); + remote_segments.push_back( + std::make_shared< + GeometryTransport::RemoteGeom>( + gx.rank, gx.id, ptr)); + } + } else { + NESOASSERT(false, "not implemented in 1D"); + } + } +} + +int CompositeTransport::collect_geometry(std::set &cells_in) { + + // remove cells we already hold the geoms for + std::set cells; + for (auto cx : cells_in) { + if (!this->held_cells.count(cx)) { + cells.insert(cx); + } + } + + const int num_cells_to_collect_local = cells.size(); + int num_cells_to_collect_global_max = -1; + MPICHK(MPI_Allreduce(&num_cells_to_collect_local, + &num_cells_to_collect_global_max, 1, MPI_INT, MPI_MAX, + this->comm)); + NESOASSERT(num_cells_to_collect_global_max > -1, + "global max computation failed"); + + // if no ranks require geoms we skip all this communication + if (num_cells_to_collect_global_max) { + std::vector cells_vector; + cells_vector.reserve(cells.size()); + for (auto cx : cells) { + cells_vector.push_back(cx); + } + + this->mh_container->gather(cells_vector); + } + for (auto cx : cells) { + this->held_cells.insert(cx); + } + return cells.size(); +} + +CompositeTransport::CompositeTransport( + ParticleMeshInterfaceSharedPtr particle_mesh_interface, + std::vector &composite_indices) + : ndim(particle_mesh_interface->graph->GetMeshDimension()), + composite_indices(composite_indices), + particle_mesh_interface(particle_mesh_interface) { + + MPICHK(MPI_Comm_dup(particle_mesh_interface->get_comm(), &this->comm)); + this->allocated = true; + MPICHK(MPI_Comm_rank(this->comm, &this->rank)); + + auto graph = particle_mesh_interface->graph; + // map from composite indices to CompositeSharedPtr + auto graph_composites = graph->GetComposites(); + + // Vector of geometry objects and the composite they correspond to + std::vector> + geometry_composites; + + for (auto ix : composite_indices) { + // check the composite of interest exists in the MeshGraph on this rank + if (graph_composites.count(ix)) { + // each composite has a vector of GeometrySharedPtrs in the m_geomVec + // attribute + auto geoms = graph_composites.at(ix)->m_geomVec; + geometry_composites.reserve(geoms.size() + geometry_composites.size()); + for (auto &geom : geoms) { + auto shape_type = geom->GetShapeType(); + NESOASSERT( + ((ndim == 3) && (shape_type == LibUtilities::eTriangle || + shape_type == LibUtilities::eQuadrilateral)) || + ((ndim == 2) && (shape_type == LibUtilities::eSegment)), + "unknown composite shape type"); + geometry_composites.push_back({geom, ix}); + } + } + } + + // pack each geometry object and reuse the local_id which originally stored + // local neso cell index to store composite index + std::map>> + cell_geom_map; + std::set contrib_cells_set; + + const double bounding_box_padding = 0.02; + const int mask = std::numeric_limits::min(); + + for (auto geom_pair : geometry_composites) { + SpatialDomains::GeometrySharedPtr geom = geom_pair.first; + const int composite = geom_pair.second; + + // find all mesh hierarchy cells the geom intersects with + std::deque> cells; + bounding_box_map(geom, particle_mesh_interface->mesh_hierarchy, cells, + bounding_box_padding); + + GeometryTransport::RemoteGeom rgeom( + composite, geom->GetGlobalID(), geom); + + for (auto cell_overlap : cells) { + const INT cell = cell_overlap.first; + const int owning_rank = + particle_mesh_interface->mesh_hierarchy->get_owner(cell); + // Some MH cells do not have owners as there was zero overlap between + // elements and the MH cell + if (owning_rank != mask) { + cell_geom_map[cell].push_back(rgeom); + contrib_cells_set.insert(cell); + } + } + } + + this->contrib_cells.reserve(contrib_cells_set.size()); + for (auto cx : contrib_cells_set) { + this->contrib_cells.push_back(cx); + } + + this->mh_container = + std::make_shared>>( + particle_mesh_interface->get_mesh_hierarchy(), cell_geom_map); +} + +} // namespace NESO::CompositeInteraction diff --git a/src/nektar_interface/composite_interaction/composite_utility.cpp b/src/nektar_interface/composite_interaction/composite_utility.cpp new file mode 100644 index 00000000..7e8f003b --- /dev/null +++ b/src/nektar_interface/composite_interaction/composite_utility.cpp @@ -0,0 +1,108 @@ +#include + +namespace NESO { + +void get_normal_vector(std::shared_ptr geom, + std::vector &normal) { + SpatialDomains::SegGeomSharedPtr curve; + if ((curve = std::dynamic_pointer_cast(geom)) != + nullptr) { + NESOASSERT(curve->GetCurve() == nullptr, + "Cannot compute a normal vector to a curved line."); + } + + NESOASSERT(geom->GetNumVerts() == 2, "Expected 2 vertices."); + auto a = geom->GetVertex(0); + auto b = geom->GetVertex(1); + + NekDouble x0, y0, z0; + a->GetCoords(x0, y0, z0); + NekDouble x1, y1, z1; + b->GetCoords(x1, y1, z1); + + // compute the normal to the facet + const REAL dx = x1 - x0; + const REAL dy = y1 - y0; + const REAL n0t = -dy; + const REAL n1t = dx; + const REAL l = 1.0 / std::sqrt(n0t * n0t + n1t * n1t); + const REAL n0 = n0t * l; + const REAL n1 = n1t * l; + + normal.clear(); + normal.reserve(2); + normal.push_back(n0); + normal.push_back(n1); +} + +void get_normal_vector(std::shared_ptr geom, + std::vector &normal) { + + NESOASSERT(geom->GetCurve() == nullptr, + "Cannot compute a constant normal to a curved surface."); + + const int num_verts = geom->GetNumVerts(); + auto v0 = geom->GetVertex(0); + auto v1 = geom->GetVertex(1); + auto v2 = geom->GetVertex(num_verts - 1); + + Array c0(3); + NekDouble v00, v01, v02; + NekDouble v10, v11, v12; + NekDouble v20, v21, v22; + v0->GetCoords(v00, v01, v02); + v1->GetCoords(v10, v11, v12); + v2->GetCoords(v20, v21, v22); + const REAL d00 = v10 - v00; + const REAL d01 = v11 - v01; + const REAL d02 = v12 - v02; + const REAL d10 = v20 - v00; + const REAL d11 = v21 - v01; + const REAL d12 = v22 - v02; + + REAL ntx, nty, ntz; + + KERNEL_CROSS_PRODUCT_3D(d00, d01, d02, d10, d11, d12, ntx, nty, ntz); + const REAL n_inorm = + 1.0 / std::sqrt(KERNEL_DOT_PRODUCT_3D(ntx, nty, ntz, ntx, nty, ntz)); + + ntx = ntx * n_inorm; + nty = nty * n_inorm; + ntz = ntz * n_inorm; + + NESOASSERT(std::isfinite(ntx), "ntx is not finite."); + NESOASSERT(std::isfinite(nty), "nty is not finite."); + NESOASSERT(std::isfinite(ntz), "ntz is not finite."); + NESOASSERT(std::isfinite(n_inorm), "n_inorm is not finite."); + + normal.clear(); + normal.reserve(3); + normal.push_back(ntx); + normal.push_back(nty); + normal.push_back(ntz); +} + +void get_vertex_average(std::shared_ptr geom, + std::vector &average) { + + const int num_vertices = geom->GetNumVerts(); + const int coordim = geom->GetCoordim(); + NESOASSERT(coordim < 4, "Unexpected number of dimensions."); + average.resize(coordim); + std::fill(average.begin(), average.end(), 0.0); + + NekDouble coords[3]; + for (int vx = 0; vx < num_vertices; vx++) { + auto v = geom->GetVertex(vx); + v->GetCoords(coords[0], coords[1], coords[2]); + for (int dx = 0; dx < coordim; dx++) { + average.at(dx) += coords[dx]; + } + } + + for (int dx = 0; dx < coordim; dx++) { + average.at(dx) /= static_cast(num_vertices); + } +} + +} // namespace NESO diff --git a/src/nektar_interface/geometry_transport/halo_extension.cpp b/src/nektar_interface/geometry_transport/halo_extension.cpp index 983dec48..e9464ba7 100644 --- a/src/nektar_interface/geometry_transport/halo_extension.cpp +++ b/src/nektar_interface/geometry_transport/halo_extension.cpp @@ -22,7 +22,7 @@ namespace NESO { */ void halo_get_mesh_hierarchy_cells( const int width, ParticleMeshInterfaceSharedPtr particle_mesh_interface, - std::set &remote_cells) { + std::set &remote_cells, const bool pbc) { const int ndim = particle_mesh_interface->ndim; auto &owned_mh_cells = particle_mesh_interface->owned_mh_cells; @@ -70,10 +70,20 @@ void halo_get_mesh_hierarchy_cells( for (ox[1] = offset_starts[1]; ox[1] < offset_ends[1]; ox[1]++) { for (ox[0] = offset_starts[0]; ox[0] < offset_ends[0]; ox[0]++) { // compute the cell from the offset + + bool valid = true; for (int dimx = 0; dimx < ndim; dimx++) { + const INT offset_dim_linear_unmapped = + global_tuple[dimx] + ox[dimx]; + if (!pbc) { + valid = + valid && ((offset_dim_linear_unmapped >= 0) && + (offset_dim_linear_unmapped < cell_counts[dimx])); + } const INT offset_dim_linear = - (global_tuple[dimx] + ox[dimx] + cell_counts[dimx]) % + (offset_dim_linear_unmapped + cell_counts[dimx]) % cell_counts[dimx]; + // convert back to a mesh hierarchy tuple index auto pq = std::div((long long)offset_dim_linear, (long long)ncells_dim_fine); @@ -88,7 +98,7 @@ void halo_get_mesh_hierarchy_cells( NESOASSERT(-1 < offset_linear, "bad offset index - too low"); // if this rank owns this cell then there is nothing to do - if (!owned_cells.count(offset_linear)) { + if ((!owned_cells.count(offset_linear)) && valid) { remote_cells.insert(offset_linear); } } @@ -408,7 +418,8 @@ void halo_get_rank_to_geoms_3d( * halos of. */ void extend_halos_fixed_offset( - const int offset, ParticleMeshInterfaceSharedPtr particle_mesh_interface) { + const int offset, ParticleMeshInterfaceSharedPtr particle_mesh_interface, + const bool pbc) { if (offset < 0) { return; @@ -429,7 +440,8 @@ void extend_halos_fixed_offset( NESOASSERT(offset <= max_offset, "Offset is larger than a domain extent."); const int width = offset; - halo_get_mesh_hierarchy_cells(width, particle_mesh_interface, remote_cells); + halo_get_mesh_hierarchy_cells(width, particle_mesh_interface, remote_cells, + pbc); /* N.B. From here onwards "send" ranks are remote MPI ranks this rank will * send geometry objects to and "recv" ranks are those this rank will recv diff --git a/src/nektar_interface/particle_boundary_conditions.cpp b/src/nektar_interface/particle_boundary_conditions.cpp new file mode 100644 index 00000000..5129cc94 --- /dev/null +++ b/src/nektar_interface/particle_boundary_conditions.cpp @@ -0,0 +1,328 @@ +#include + +namespace NESO { + +NektarCartesianPeriodic::NektarCartesianPeriodic( + SYCLTargetSharedPtr sycl_target, + Nektar::SpatialDomains::MeshGraphSharedPtr graph, + ParticleDatSharedPtr position_dat) + : sycl_target(sycl_target), ndim(graph->GetMeshDimension()), + position_dat(position_dat), d_extents(sycl_target, 3), + d_origin(sycl_target, 3) { + + NESOASSERT(this->ndim <= 3, "bad mesh ndim"); + + auto verticies = graph->GetAllPointGeoms(); + + double origin[3]; + double extent[3]; + for (int dimx = 0; dimx < 3; dimx++) { + origin[dimx] = std::numeric_limits::max(); + extent[dimx] = std::numeric_limits::min(); + } + + for (auto &vx : verticies) { + Nektar::NekDouble x, y, z; + vx.second->GetCoords(x, y, z); + origin[0] = std::min(origin[0], x); + origin[1] = std::min(origin[1], y); + origin[2] = std::min(origin[2], z); + extent[0] = std::max(extent[0], x); + extent[1] = std::max(extent[1], y); + extent[2] = std::max(extent[2], z); + } + + MPICHK(MPI_Allreduce(origin, this->global_origin, 3, MPI_DOUBLE, MPI_MIN, + sycl_target->comm_pair.comm_parent)); + MPICHK(MPI_Allreduce(extent, this->global_extent, 3, MPI_DOUBLE, MPI_MAX, + sycl_target->comm_pair.comm_parent)); + + for (int dimx = 0; dimx < 3; dimx++) { + this->global_extent[dimx] -= this->global_origin[dimx]; + } + + sycl_target->queue + .memcpy(this->d_extents.ptr, this->global_extent, + this->ndim * sizeof(double)) + .wait_and_throw(); + + sycl_target->queue + .memcpy(this->d_origin.ptr, this->global_origin, + this->ndim * sizeof(double)) + .wait_and_throw(); + + const int k_ndim = this->ndim; + NESOASSERT(((k_ndim > 0) && (k_ndim < 4)), "Bad number of dimensions"); + const auto k_origin = this->d_origin.ptr; + const auto k_extents = this->d_extents.ptr; + this->loop = particle_loop( + "NektarCartesianPeriodic", this->position_dat, + [=](auto k_positions_dat) { + for (int dimx = 0; dimx < k_ndim; dimx++) { + const double pos = k_positions_dat.at(dimx) - k_origin[dimx]; + // offset the position in the current dimension to be + // positive by adding a value times the extent + const double n_extent_offset_real = ABS(pos); + 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); + k_positions_dat.at(dimx) = pos_fmod + k_origin[dimx]; + } + }, + Access::write(this->position_dat)); +}; + +void NektarCartesianPeriodic::execute() { this->loop->execute(); } + +NektarCompositeTruncatedReflection::NektarCompositeTruncatedReflection( + Sym velocity_sym, Sym time_step_prop_sym, + SYCLTargetSharedPtr sycl_target, + std::shared_ptr mesh, + std::vector &composite_indices, ParameterStoreSharedPtr config) + : velocity_sym(velocity_sym), time_step_prop_sym(time_step_prop_sym), + sycl_target(sycl_target), composite_indices(composite_indices), + ndim(mesh->get_ndim()) { + + std::map> boundary_groups = { + {1, this->composite_indices}}; + this->composite_intersection = + std::make_shared( + this->sycl_target, mesh, boundary_groups); + this->ep = std::make_unique(this->sycl_target); + + this->reset_distance = config->get( + "NektarCompositeTruncatedReflection/reset_distance", 1.0e-7); +} + +void NektarCompositeTruncatedReflection::pre_advection( + ParticleSubGroupSharedPtr particle_sub_group) { + this->composite_intersection->pre_integration(particle_sub_group); +} + +void NektarCompositeTruncatedReflection::execute_2d( + ParticleSubGroupSharedPtr particle_sub_group) { + auto particle_groups = + this->composite_intersection->get_intersections(particle_sub_group); + + auto k_ep = this->ep->device_ptr(); + const REAL k_reset_distance = this->reset_distance; + + const auto k_normal_device_mapper = + this->composite_intersection->composite_collections + ->get_device_normal_mapper(); + + if (particle_groups.count(1)) { + auto pg = particle_groups.at(1); + particle_loop( + "NektarCompositeTruncatedReflection2D", pg, + [=](auto V, auto P, auto PP, auto IC, auto IP, auto TSP) { + REAL *normal; + const bool normal_exists = + k_normal_device_mapper.get(IC.at(2), &normal); + NESO_KERNEL_ASSERT(normal_exists, k_ep); + if (normal_exists) { + // Normal vector + const REAL n0 = normal[0]; + const REAL n1 = normal[1]; + const REAL p0 = P.at(0); + const REAL p1 = P.at(1); + const REAL v0 = V.at(0); + const REAL v1 = V.at(1); + // We don't know if the normal is inwards pointing or outwards + // pointing. + const REAL in_dot_product = KERNEL_DOT_PRODUCT_2D(n0, n1, v0, v1); + + // compute new velocity from reflection + V.at(0) = v0 - 2.0 * in_dot_product * n0; + V.at(1) = v1 - 2.0 * in_dot_product * n1; + + // Try and compute a sane new position + // vector from intersection point back towards previous position + const REAL oo0 = PP.at(0) - IP.at(0); + const REAL oo1 = PP.at(1) - IP.at(1); + REAL o0 = oo0; + REAL o1 = oo1; + + const REAL o_norm2 = KERNEL_DOT_PRODUCT_2D(oo0, oo1, oo0, oo1); + const REAL o_norm = Kernel::sqrt(o_norm2); + const bool small_move = o_norm < (k_reset_distance * 0.1); + + const REAL o_inorm = + small_move ? k_reset_distance : k_reset_distance / o_norm; + o0 *= o_inorm; + o1 *= o_inorm; + // If the move is tiny place the particle back on the previous + // position + REAL np0 = small_move ? PP.at(0) : IP.at(0) + o0; + REAL np1 = small_move ? PP.at(1) : IP.at(1) + o1; + // Detect if we moved the particle back past the previous position + // Both PP - np and PP - IP should have the same sign + const bool moved_past_pp = + ((PP.at(0) - np0) * o0 < 0.0) || ((PP.at(1) - np1) * o1 < 0.0); + + np0 = moved_past_pp ? PP.at(0) : np0; + np1 = moved_past_pp ? PP.at(1) : np1; + P.at(0) = np0; + P.at(1) = np1; + + // Timestepping adjustment + const REAL dist_trunc_step = o_norm2; + + const REAL f0 = p0 - PP.at(0); + const REAL f1 = p1 - PP.at(1); + const REAL dist_full_step = KERNEL_DOT_PRODUCT_2D(f0, f1, f0, f1); + + REAL tmp_prop_achieved = dist_full_step > 1.0e-16 + ? dist_trunc_step / dist_full_step + : 1.0; + tmp_prop_achieved = + tmp_prop_achieved < 0.0 ? 0.0 : tmp_prop_achieved; + tmp_prop_achieved = + tmp_prop_achieved > 1.0 ? 1.0 : tmp_prop_achieved; + + // proportion along the full step that we truncated at + const REAL proportion_achieved = Kernel::sqrt(tmp_prop_achieved); + const REAL last_dt = TSP.at(1); + const REAL correct_last_dt = TSP.at(1) * proportion_achieved; + TSP.at(0) = TSP.at(0) - last_dt + correct_last_dt; + TSP.at(1) = correct_last_dt; + } + }, + Access::write(this->velocity_sym), + Access::write(pg->get_particle_group()->position_dat), + Access::read(Sym("NESO_COMP_INT_PREV_POS")), + Access::read(Sym("NESO_COMP_INT_OUTPUT_COMP")), + Access::read(Sym("NESO_COMP_INT_OUTPUT_POS")), + Access::write(this->time_step_prop_sym)) + ->execute(); + } + + this->ep->check_and_throw( + "Failed to reflect particle off geometry composite."); +} + +void NektarCompositeTruncatedReflection::execute_3d( + ParticleSubGroupSharedPtr particle_sub_group) { + auto particle_groups = + this->composite_intersection->get_intersections(particle_sub_group); + + auto k_ep = this->ep->device_ptr(); + const REAL k_reset_distance = this->reset_distance; + + const auto k_normal_device_mapper = + this->composite_intersection->composite_collections + ->get_device_normal_mapper(); + + if (particle_groups.count(1)) { + auto pg = particle_groups.at(1); + particle_loop( + "NektarCompositeTruncatedReflection3D", pg, + [=](auto V, auto P, auto PP, auto IC, auto IP, auto TSP) { + const INT geom_id = static_cast(IC.at(2)); + REAL *normal; + const bool exists = k_normal_device_mapper.get(geom_id, &normal); + NESO_KERNEL_ASSERT(exists, k_ep); + + // Normal vector + const REAL n0 = normal[0]; + const REAL n1 = normal[1]; + const REAL n2 = normal[2]; + const REAL p0 = P.at(0); + const REAL p1 = P.at(1); + const REAL p2 = P.at(2); + const REAL v0 = V.at(0); + const REAL v1 = V.at(1); + const REAL v2 = V.at(2); + const REAL in_dot_product = + MAPPING_DOT_PRODUCT_3D(n0, n1, n2, v0, v1, v2); + + // compute new velocity from reflection + V.at(0) = v0 - 2.0 * in_dot_product * n0; + V.at(1) = v1 - 2.0 * in_dot_product * n1; + V.at(2) = v2 - 2.0 * in_dot_product * n2; + + // Compute a sane new position + + // vector from intersection point back towards previous position + const REAL oo0 = PP.at(0) - IP.at(0); + const REAL oo1 = PP.at(1) - IP.at(1); + const REAL oo2 = PP.at(2) - IP.at(2); + REAL o0 = oo0; + REAL o1 = oo1; + REAL o2 = oo2; + + const REAL o_norm2 = + MAPPING_DOT_PRODUCT_3D(oo0, oo1, oo2, oo0, oo1, oo2); + const REAL o_norm = sqrt(o_norm2); + const bool small_move = o_norm < (k_reset_distance * 0.1); + const REAL o_inorm = + small_move ? k_reset_distance : k_reset_distance / o_norm; + o0 *= o_inorm; + o1 *= o_inorm; + o2 *= o_inorm; + // If the move is tiny place the particle back on the previous + // position + REAL np0 = small_move ? PP.at(0) : IP.at(0) + o0; + REAL np1 = small_move ? PP.at(1) : IP.at(1) + o1; + REAL np2 = small_move ? PP.at(2) : IP.at(2) + o2; + // Detect if we moved the particle back past the previous position + // Both PP - np and PP - IP should have the same sign + const bool moved_past_pp = ((PP.at(0) - np0) * o0 < 0.0) || + ((PP.at(1) - np1) * o1 < 0.0) || + ((PP.at(2) - np2) * o2 < 0.0); + + np0 = moved_past_pp ? PP.at(0) : np0; + np1 = moved_past_pp ? PP.at(1) : np1; + np2 = moved_past_pp ? PP.at(2) : np2; + + P.at(0) = np0; + P.at(1) = np1; + P.at(2) = np2; + + // Timestepping adjustment + const REAL dist_trunc_step = o_norm2; + + const REAL f0 = p0 - PP.at(0); + const REAL f1 = p1 - PP.at(1); + const REAL f2 = p2 - PP.at(2); + const REAL dist_full_step = + MAPPING_DOT_PRODUCT_3D(f0, f1, f2, f0, f1, f2); + + REAL tmp_prop_achieved = + dist_full_step > 1.0e-16 ? dist_trunc_step / dist_full_step : 1.0; + tmp_prop_achieved = tmp_prop_achieved < 0.0 ? 0.0 : tmp_prop_achieved; + tmp_prop_achieved = tmp_prop_achieved > 1.0 ? 1.0 : tmp_prop_achieved; + + // proportion along the full step that we truncated at + const REAL proportion_achieved = sqrt(tmp_prop_achieved); + const REAL last_dt = TSP.at(1); + const REAL correct_last_dt = TSP.at(1) * proportion_achieved; + TSP.at(0) = TSP.at(0) - last_dt + correct_last_dt; + TSP.at(1) = correct_last_dt; + }, + Access::write(this->velocity_sym), + Access::write(pg->get_particle_group()->position_dat), + Access::read(Sym("NESO_COMP_INT_PREV_POS")), + Access::read(Sym("NESO_COMP_INT_OUTPUT_COMP")), + Access::read(Sym("NESO_COMP_INT_OUTPUT_POS")), + Access::write(this->time_step_prop_sym)) + ->execute(); + } + + this->ep->check_and_throw( + "Failed to reflect particle off geometry composite."); +} + +void NektarCompositeTruncatedReflection::execute( + ParticleSubGroupSharedPtr particle_sub_group) { + NESOASSERT(this->ndim == 3 || this->ndim == 2, + "Unexpected number of dimensions."); + if (this->ndim == 3) { + this->execute_3d(particle_sub_group); + } else { + this->execute_2d(particle_sub_group); + } +} + +} // namespace NESO 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 68afbdd3..59f22952 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_2d.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_2d.cpp @@ -68,7 +68,7 @@ void MapParticles2D::map(ParticleGroup &particle_group, const int map_cell) { // are there particles which are not yet mapped into cells particles_not_mapped = - this->map_particles_common->check_map(particle_group, map_cell, false); + this->map_particles_common->check_map(particle_group, map_cell); // attempt to bin the remaining particles into deformed cells if there are // deformed cells. @@ -77,13 +77,30 @@ void MapParticles2D::map(ParticleGroup &particle_group, const int map_cell) { } } - // 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, true); + 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); + + if (particles_not_mapped) { + const int cell_count = particle_group.domain->mesh->get_cell_count(); + for (int cellx = 0; cellx < cell_count; cellx++) { + auto MPI_RANKS = + particle_group.get_cell(particle_group.mpi_rank_dat->sym, cellx); + const int nrow = MPI_RANKS->nrow; + for (int rowx = 0; rowx < nrow; rowx++) { + if (MPI_RANKS->at(rowx, 1) < 0) { + std::cout << std::setprecision(18); + particle_group.print_particle(cellx, rowx); + } + } + } + } - NESOASSERT(!particles_not_mapped, - "Failed to find cell containing one or more particles."); + NESOASSERT(!particles_not_mapped, + "Failed to find cell containing one or more particles."); + } } } // namespace NESO 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 e1d74d99..22ce47f7 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 @@ -149,162 +149,129 @@ void MapParticles2DRegular::map(ParticleGroup &particle_group, // 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; - 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 double p0 = k_part_positions[cellx][0][layerx]; - const double p1 = k_part_positions[cellx][1][layerx]; - const double shifted_p0 = p0 - k_mesh_origin0; - const double shifted_p1 = p1 - k_mesh_origin1; - - // determine the cartesian mesh cell for the position - int c0 = (k_mesh_inverse_cell_widths0 * shifted_p0); - int c1 = (k_mesh_inverse_cell_widths1 * shifted_p1); - c0 = (c0 < 0) ? 0 : c0; - c1 = (c1 < 0) ? 0 : c1; - c0 = (c0 >= k_mesh_cell_counts0) ? k_mesh_cell_counts0 - 1 - : c0; - c1 = (c1 >= k_mesh_cell_counts1) ? k_mesh_cell_counts1 - 1 - : c1; - const int linear_mesh_cell = c0 + k_mesh_cell_counts0 * c1; - - const bool valid_cell = - (linear_mesh_cell >= 0) && - (linear_mesh_cell < k_mesh_cell_count); - - const double r0 = p0; - const double r1 = p1; - - 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 double v00 = k_map_vertices[geom_map_index * 6 + 0]; - const double v01 = k_map_vertices[geom_map_index * 6 + 1]; - const double v10 = k_map_vertices[geom_map_index * 6 + 2]; - const double v11 = k_map_vertices[geom_map_index * 6 + 3]; - const double v20 = k_map_vertices[geom_map_index * 6 + 4]; - const double v21 = k_map_vertices[geom_map_index * 6 + 5]; - - const double er_0 = r0 - v00; - const double er_1 = r1 - v01; - const double er_2 = 0.0; - - const double e10_0 = v10 - v00; - const double e10_1 = v11 - v01; - const double e10_2 = 0.0; - - const double e20_0 = v20 - v00; - const double e20_1 = v21 - v01; - const double e20_2 = 0.0; - - MAPPING_CROSS_PRODUCT_3D(e10_0, e10_1, e10_2, e20_0, e20_1, - e20_2, const double norm_0, - const double norm_1, - const double norm_2) - MAPPING_CROSS_PRODUCT_3D(norm_0, norm_1, norm_2, e10_0, - e10_1, e10_2, const double orth1_0, - const double orth1_1, - const double orth1_2) - MAPPING_CROSS_PRODUCT_3D(norm_0, norm_1, norm_2, e20_0, - e20_1, e20_2, const double orth2_0, - const double orth2_1, - const double orth2_2) - - const double scale0 = - MAPPING_DOT_PRODUCT_3D(er_0, er_1, er_2, orth2_0, - orth2_1, orth2_2) / - MAPPING_DOT_PRODUCT_3D(e10_0, e10_1, e10_2, orth2_0, - orth2_1, orth2_2); - const double xi0 = 2.0 * scale0 - 1.0; - const double scale1 = - MAPPING_DOT_PRODUCT_3D(er_0, er_1, er_2, orth1_0, - orth1_1, orth1_2) / - MAPPING_DOT_PRODUCT_3D(e20_0, e20_1, e20_2, orth1_0, - orth1_1, orth1_2); - const double xi1 = 2.0 * scale1 - 1.0; - - const int geom_type = k_map_type[geom_map_index]; - - double tmp_eta0; - if (geom_type == k_geom_is_triangle) { - NekDouble d1 = 1. - xi1; - if (fabs(d1) < NekConstants::kNekZeroTol) { - if (d1 >= 0.) { - d1 = NekConstants::kNekZeroTol; - } else { - d1 = -NekConstants::kNekZeroTol; - } - } - tmp_eta0 = 2. * (1. + xi0) / d1 - 1.0; - } else { - tmp_eta0 = xi0; - } - const double eta0 = tmp_eta0; - const double eta1 = xi1; - - double dist = 0.0; - bool contained = ((eta0 <= 1.0) && (eta0 >= -1.0) && - (eta1 <= 1.0) && (eta1 >= -1.0)); - if (!contained) { - 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); - } - - cell_found = dist <= k_tol; - 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; - k_part_ref_positions[cellx][1][layerx] = xi1; - break; - } - } + auto cell_ids = particle_group.cell_id_dat; + auto mpi_ranks = particle_group.mpi_rank_dat; + auto ref_positions = + particle_group.get_dat(Sym("NESO_REFERENCE_POSITIONS")); + + auto loop = particle_loop( + "MapParticles2DRegular::map", position_dat, + [=](auto k_part_positions, auto k_part_cell_ids, auto k_part_mpi_ranks, + auto k_part_ref_positions) { + if (k_part_mpi_ranks.at(1) < 0) { + + // read the position of the particle + const double p0 = k_part_positions.at(0); + const double p1 = k_part_positions.at(1); + const double shifted_p0 = p0 - k_mesh_origin0; + const double shifted_p1 = p1 - k_mesh_origin1; + + // determine the cartesian mesh cell for the position + int c0 = (k_mesh_inverse_cell_widths0 * shifted_p0); + int c1 = (k_mesh_inverse_cell_widths1 * shifted_p1); + c0 = (c0 < 0) ? 0 : c0; + c1 = (c1 < 0) ? 0 : c1; + c0 = (c0 >= k_mesh_cell_counts0) ? k_mesh_cell_counts0 - 1 : c0; + c1 = (c1 >= k_mesh_cell_counts1) ? k_mesh_cell_counts1 - 1 : c1; + const int linear_mesh_cell = c0 + k_mesh_cell_counts0 * c1; + + const bool valid_cell = + (linear_mesh_cell >= 0) && (linear_mesh_cell < k_mesh_cell_count); + + const double r0 = p0; + const double r1 = p1; + + bool cell_found = false; + for (int candidate_cell = 0; + (candidate_cell < k_map_sizes[linear_mesh_cell]) && + (valid_cell) && (!cell_found); + candidate_cell++) { + const int geom_map_index = + k_map[linear_mesh_cell * k_map_stride + candidate_cell]; + + const double v00 = k_map_vertices[geom_map_index * 6 + 0]; + const double v01 = k_map_vertices[geom_map_index * 6 + 1]; + const double v10 = k_map_vertices[geom_map_index * 6 + 2]; + const double v11 = k_map_vertices[geom_map_index * 6 + 3]; + const double v20 = k_map_vertices[geom_map_index * 6 + 4]; + const double v21 = k_map_vertices[geom_map_index * 6 + 5]; + + const double er_0 = r0 - v00; + const double er_1 = r1 - v01; + const double er_2 = 0.0; + + const double e10_0 = v10 - v00; + const double e10_1 = v11 - v01; + const double e10_2 = 0.0; + + const double e20_0 = v20 - v00; + const double e20_1 = v21 - v01; + const double e20_2 = 0.0; + + MAPPING_CROSS_PRODUCT_3D(e10_0, e10_1, e10_2, e20_0, e20_1, e20_2, + const double norm_0, const double norm_1, + const double norm_2) + MAPPING_CROSS_PRODUCT_3D(norm_0, norm_1, norm_2, e10_0, e10_1, + e10_2, const double orth1_0, + const double orth1_1, const double orth1_2) + MAPPING_CROSS_PRODUCT_3D(norm_0, norm_1, norm_2, e20_0, e20_1, + e20_2, const double orth2_0, + const double orth2_1, const double orth2_2) + + const double scale0 = + MAPPING_DOT_PRODUCT_3D(er_0, er_1, er_2, orth2_0, orth2_1, + orth2_2) / + MAPPING_DOT_PRODUCT_3D(e10_0, e10_1, e10_2, orth2_0, orth2_1, + orth2_2); + const double xi0 = 2.0 * scale0 - 1.0; + const double scale1 = + MAPPING_DOT_PRODUCT_3D(er_0, er_1, er_2, orth1_0, orth1_1, + orth1_2) / + MAPPING_DOT_PRODUCT_3D(e20_0, e20_1, e20_2, orth1_0, orth1_1, + orth1_2); + const double xi1 = 2.0 * scale1 - 1.0; + + const int geom_type = k_map_type[geom_map_index]; + + double tmp_eta0; + if (geom_type == k_geom_is_triangle) { + NekDouble d1 = 1. - xi1; + if (fabs(d1) < NekConstants::kNekZeroTol) { + if (d1 >= 0.) { + d1 = NekConstants::kNekZeroTol; + } else { + d1 = -NekConstants::kNekZeroTol; } } - }); - }) - .wait_and_throw(); + tmp_eta0 = 2. * (1. + xi0) / d1 - 1.0; + } else { + tmp_eta0 = xi0; + } + const double eta0 = tmp_eta0; + const double eta1 = xi1; + + cell_found = ((-1.0 - k_tol) <= eta0) && (eta0 <= (1.0 + k_tol)) && + ((-1.0 - k_tol) <= eta1) && (eta1 <= (1.0 + k_tol)); + + 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.at(0) = geom_id; + k_part_mpi_ranks.at(1) = mpi_rank; + k_part_ref_positions.at(0) = xi0; + k_part_ref_positions.at(1) = xi1; + } + } + } + }, + Access::read(position_dat), Access::write(cell_ids), + Access::write(mpi_ranks), Access::write(ref_positions)); + + if (map_cell > -1) { + loop->execute(map_cell); + } else { + loop->execute(); + } } } // namespace NESO 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 f96461e7..7ea446d5 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_3d.cpp @@ -86,10 +86,9 @@ void MapParticles3D::map(ParticleGroup &particle_group, const int 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 = - this->map_particles_common->check_map(particle_group, map_cell, false); + this->map_particles_common->check_map(particle_group, map_cell); // attempt to bin the remaining particles into deformed cells if there are // deformed cells. @@ -98,13 +97,44 @@ void MapParticles3D::map(ParticleGroup &particle_group, const int map_cell) { } } - // 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, true); + 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); + + if (particles_not_mapped) { + nprint( + "===================================================================" + "============="); + auto mpi_rank_dat = particle_group.mpi_rank_dat; + auto cell_id_dat = particle_group.cell_id_dat; + auto positions_dat = particle_group.position_dat; + const auto cell_count = cell_id_dat->cell_dat.ncells; + auto sym_mpi_ranks = mpi_rank_dat->sym; + auto sym_cell = cell_id_dat->sym; + auto sym_positions = positions_dat->sym; + const auto ndim = particle_group.domain->mesh->get_ndim(); + 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); + auto M = particle_group.get_cell(sym_mpi_ranks, cx); + const auto nrow = P->nrow; + for (int rx = 0; rx < nrow; rx++) { + if (M->at(rx, 1) < 0) { + std::cout << std::setprecision(18); + particle_group.print_particle(cx, rx); + } + } + } + nprint( + "===================================================================" + "============="); + } - NESOASSERT(!particles_not_mapped, - "Failed to find cell containing one or more particles."); + NESOASSERT(!particles_not_mapped, + "Failed to find cell containing one or more particles."); + } } } // namespace NESO 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 3e201f1c..9539e19d 100644 --- a/src/nektar_interface/particle_cell_mapping/map_particles_common.cpp +++ b/src/nektar_interface/particle_cell_mapping/map_particles_common.cpp @@ -8,74 +8,27 @@ MapParticlesCommon::MapParticlesCommon(SYCLTargetSharedPtr sycl_target) ep(std::make_unique(sycl_target)) {} bool MapParticlesCommon::check_map(ParticleGroup &particle_group, - const int map_cell, const bool final_map) { - - // Get kernel pointers to the ParticleDats - auto cell_id_dat = particle_group.cell_id_dat; - auto k_part_cell_ids = cell_id_dat->cell_dat.device_ptr(); - auto k_part_mpi_ranks = particle_group.mpi_rank_dat->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) - ? cell_id_dat->h_npart_cell[map_cell] - : cell_id_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(cell_id_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 = cell_id_dat->d_npart_cell; - + const int map_cell) { this->ep->reset(); auto k_ep = this->ep->device_ptr(); + auto mpi_ranks = particle_group.mpi_rank_dat; - 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) { - - if (final_map) { - // if a geom is not found and there is a non-null global - // MPI rank then this function was called after the global - // move and the lack of a local cell / mpi rank is a fatal - // error. - if (((k_part_mpi_ranks)[cellx][0][layerx] > -1) && - (k_part_mpi_ranks[cellx][1][layerx] < 0)) { - NESO_KERNEL_ASSERT(false, k_ep); - } - } else { - // This loop was called at an intermediate state to - // determine if there exist particles which are not - // mapped into cells. Hence only the local component of - // the mapping dat is checked. - if (k_part_mpi_ranks[cellx][1][layerx] < 0) { - NESO_KERNEL_ASSERT(false, k_ep); - } - } - } - } - }); - }) - .wait_and_throw(); + auto loop = particle_loop( + mpi_ranks, + [=](auto k_part_mpi_ranks) { + NESO_KERNEL_ASSERT(k_part_mpi_ranks.at(1) > -1, k_ep); + }, + Access::read(mpi_ranks)); - if (this->ep->get_flag()) { - // If the return flag is true there are particles which were not binned - // into cells. - return true; + if (map_cell < 0) { + loop->execute(); } else { - // If the return flag is false all particles were binned into cells. - return false; + loop->execute(map_cell); } + + // 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(); } } // namespace NESO diff --git a/src/nektar_interface/utilities.cpp b/src/nektar_interface/utilities.cpp new file mode 100644 index 00000000..6ba4e2eb --- /dev/null +++ b/src/nektar_interface/utilities.cpp @@ -0,0 +1,104 @@ +#include + +namespace NESO { + +std::mt19937 uniform_within_elements( + Nektar::SpatialDomains::MeshGraphSharedPtr graph, const int npart_per_cell, + std::vector> &positions, std::vector &cells, + const REAL tol, std::optional rng_in) { + + std::mt19937 rng; + if (!rng_in) { + rng = std::mt19937(std::random_device{}()); + } else { + rng = rng_in.value(); + } + + const int ndim = graph->GetMeshDimension(); + std::map> geoms_2d; + std::map> geoms_3d; + int npart_total; + int nelements; + + if (ndim == 2) { + get_all_elements_2d(graph, geoms_2d); + nelements = geoms_2d.size(); + } else if (ndim == 3) { + get_all_elements_3d(graph, geoms_3d); + nelements = geoms_3d.size(); + } + npart_total = nelements * npart_per_cell; + + positions.resize(ndim); + cells.resize(npart_total); + for (int dimx = 0; dimx < ndim; dimx++) { + positions[dimx] = std::vector(npart_total); + } + + auto lambda_sample = [&](auto geom, Array &coord) { + Array local_coord(3); + auto bb = geom->GetBoundingBox(); + coord[0] = 0.0; + coord[1] = 0.0; + coord[2] = 0.0; + + auto lambda_sample_new = [&]() { + for (int dx = 0; dx < ndim; dx++) { + const REAL bound_lower = bb[dx]; + const REAL bound_upper = bb[dx + 3]; + std::uniform_real_distribution dist(bound_lower, bound_upper); + coord[dx] = dist(rng); + } + }; + + lambda_sample_new(); + auto lambda_contains_point = [&]() -> bool { + geom->GetLocCoords(coord, local_coord); + bool contained = true; + for (int dx = 0; dx < ndim; dx++) { + // Restrict inwards using the tolerance as we really do not want to + // sample points outside the geom as then the position might be outside + // the domain. + bool dim_contained = + ((-1.0 + tol) < local_coord[dx]) && (local_coord[dx] < (1.0 - tol)); + contained = contained && dim_contained; + } + return contained && geom->ContainsPoint(coord); + }; + + int trial_count = 0; + while (!lambda_contains_point()) { + // while (!geom->ContainsPoint(coord, tol)) { + lambda_sample_new(); + trial_count++; + NESOASSERT(trial_count < 1000000, "Unable to sample point in geom."); + } + }; + + auto lambda_dispatch = [&](auto container) { + Array coord(3); + int ex = 0; + int index = 0; + for (auto id_element : container) { + for (int px = 0; px < npart_per_cell; px++) { + lambda_sample(id_element.second, coord); + for (int dx = 0; dx < ndim; dx++) { + positions.at(dx).at(index) = coord[dx]; + } + cells.at(index) = ex; + index++; + } + ex++; + } + }; + + if (ndim == 2) { + lambda_dispatch(geoms_2d); + } else if (ndim == 3) { + lambda_dispatch(geoms_3d); + } + + return rng; +} + +} // namespace NESO diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cb4b2b70..12713c16 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -39,6 +39,7 @@ set(UNIT_SRC_FILES ${UNIT_SRC}/test_1D_linear_interpolator.cpp ${UNIT_SRC}/particle_utility/test_position_distribution.cpp ${UNIT_SRC}/particle_utility/test_particle_initialisation_line.cpp + ${UNIT_SRC}/nektar_interface/test_composite_interaction.cpp ${UNIT_SRC}/nektar_interface/test_particle_function_evaluation.cpp ${UNIT_SRC}/nektar_interface/test_particle_function_evaluation_3d.cpp ${UNIT_SRC}/nektar_interface/test_parameter_store.cpp @@ -47,6 +48,7 @@ set(UNIT_SRC_FILES ${UNIT_SRC}/nektar_interface/test_particle_geometry_interface.cpp ${UNIT_SRC}/nektar_interface/test_particle_geometry_interface_3d.cpp ${UNIT_SRC}/nektar_interface/test_basis_evaluation.cpp + ${UNIT_SRC}/nektar_interface/test_particle_embed_mapping.cpp ${UNIT_SRC}/nektar_interface/test_kernel_basis_evaluation.cpp ${UNIT_SRC}/nektar_interface/test_particle_mapping.cpp ${UNIT_SRC}/nektar_interface/test_utility_cartesian_mesh.cpp @@ -60,6 +62,7 @@ set(INTEGRATION_SRC_FILES ${INTEGRATION_SRC}/test_mms.cpp ${INTEGRATION_SRC}/solvers/solver_test_utils.cpp ${INTEGRATION_SRC}/solvers/SimpleSOL/test_SimpleSOL.cpp + ${INTEGRATION_SRC}/nektar_interface/test_composite_interaction.cpp ${INTEGRATION_SRC}/nektar_interface/test_particle_advection.cpp ${INTEGRATION_SRC}/nektar_interface/test_function_projection_order.cpp ${INTEGRATION_SRC}/nektar_interface/test_function_projection_order_3d.cpp diff --git a/test/integration/nektar_interface/test_composite_interaction.cpp b/test/integration/nektar_interface/test_composite_interaction.cpp new file mode 100644 index 00000000..c16d6ec5 --- /dev/null +++ b/test/integration/nektar_interface/test_composite_interaction.cpp @@ -0,0 +1,227 @@ +#include "../../unit/nektar_interface/test_helper_utilities.hpp" + +namespace { + +inline void find_internal_edges(std::shared_ptr graph, + std::vector &points) { + + std::map edges; + std::map counts; + + auto quads = graph->GetAllQuadGeoms(); + for (auto qx : quads) { + auto quad = qx.second; + const int num_edges = quad->GetNumEdges(); + for (int ex = 0; ex < num_edges; ex++) { + auto edge = quad->GetEdge(ex); + const int id = edge->GetGlobalID(); + counts[id]++; + edges[id] = edge; + } + } + + for (auto cx : counts) { + auto id = cx.first; + auto count = cx.second; + // edges with count 1 are an external boundary + if (count > 1) { + auto edge = edges.at(id); + auto p0 = edge->GetVertex(0); + auto p1 = edge->GetVertex(1); + NekDouble x0, y0, z0, x1, y1, z1; + p0->GetCoords(x0, y0, z0); + p1->GetCoords(x1, y1, z1); + points.push_back(0.5 * (x0 + x1)); + points.push_back(0.5 * (y0 + y1)); + } + } +} + +} // namespace + +TEST(CompositeInteraction, MASTUReflection) { + + const int npart_per_cell = 10; + const REAL dt = 0.05; + const int N_steps = 500; + const int ndim = 2; + + TestUtilities::TestResourceSession resources_session( + "MASTU-2D/mastu_cd.xml", "MASTU-2D/conditions_nummodes_2.xml"); + auto session = resources_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-6); + config->set("CompositeIntersection/newton_tol", 1.0e-10); + config->set("CompositeIntersection/line_intersection_tol", 1.0e-10); + config->set("NektarCompositeTruncatedReflection/reset_distance", + 1.0e-6); + + auto nektar_graph_local_mapper = + std::make_shared(sycl_target, mesh, config); + auto domain = std::make_shared(mesh, nektar_graph_local_mapper); + + ParticleSpec particle_spec{ParticleProp(Sym("P"), ndim, true), + ParticleProp(Sym("V"), ndim), + ParticleProp(Sym("TSP"), 2), + ParticleProp(Sym("CELL_ID"), 1, true), + ParticleProp(Sym("ID"), 1)}; + + auto A = std::make_shared(domain, particle_spec, sycl_target); + 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(534234 + rank); + + std::vector> positions; + std::vector cells; + rng = uniform_within_elements(graph, npart_per_cell, positions, cells, + 1.0e-10, rng); + + const int N = cells.size(); + auto velocities = Particles::normal_distribution(N, 2, 0.0, 500.0, rng); + + int id_offset = 0; + MPICHK(MPI_Exscan(&N, &id_offset, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD)); + + if (N > 0) { + ParticleSet initial_distribution(N, A->get_particle_spec()); + for (int px = 0; px < N; px++) { + for (int dimx = 0; dimx < ndim; dimx++) { + initial_distribution[Sym("P")][px][dimx] = + positions.at(dimx).at(px); + 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] = id_offset + px; + } + A->add_particles_local(initial_distribution); + } + + // std::vector mid_points; + // find_internal_edges(graph, mid_points); + // const int M = mid_points.size() / 2; + // nprint_variable(M); + // int index = 0; + // ParticleSet initial_distribution(M, A->get_particle_spec()); + // for (int px = 0; px < M; px++) { + // for (int dimx = 0; dimx < ndim; 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] = id_offset + px; + // + // initial_distribution[Sym("P")][px][0] = mid_points.at(index++); + // initial_distribution[Sym("P")][px][1] = mid_points.at(index++); + // } + // A->add_particles_local(initial_distribution); + + A->hybrid_move(); + cell_id_translation->execute(); + A->cell_move(); + + // Uncomment for trajectory writing. + // H5Part h5part("MASTU_reflection.h5part", A, Sym("P"), Sym("V"), + // Sym("ID")); + + std::vector reflection_composites = {100, 101, 102, 103, 104, + 105, 106, 107, 108}; + auto reflection = std::make_shared( + Sym("V"), Sym("TSP"), sycl_target, mesh, + reflection_composites, config); + + auto lambda_apply_timestep_reset = [&](auto aa) { + particle_loop( + aa, + [=](auto TSP) { + TSP.at(0) = 0.0; + TSP.at(1) = 0.0; + }, + Access::write(Sym("TSP"))) + ->execute(); + }; + + auto lambda_apply_advection_step = + [&](ParticleSubGroupSharedPtr iteration_set) -> void { + particle_loop( + "euler_advection", iteration_set, + [=](auto V, auto P, auto TSP) { + const REAL dt_left = dt - TSP.at(0); + if (dt_left > 0.0) { + for (int dx = 0; dx < ndim; dx++) { + P.at(dx) += dt_left * V.at(dx); + } + TSP.at(0) = dt; + TSP.at(1) = dt_left; + } + }, + Access::read(Sym("V")), Access::write(Sym("P")), + Access::write(Sym("TSP"))) + ->execute(); + }; + + auto lambda_pre_advection = [&](auto aa) { reflection->pre_advection(aa); }; + + auto lambda_apply_boundary_conditions = [&](auto aa) { + reflection->execute(aa); + }; + + auto lambda_find_partial_moves = [&](auto aa) { + return static_particle_sub_group( + A, [=](auto TSP) { return TSP.at(0) < dt; }, + Access::read(Sym("TSP"))); + }; + + auto lambda_partial_moves_remaining = [&](auto aa) -> bool { + const int size = aa->get_npart_local(); + int size_global; + MPICHK(MPI_Allreduce(&size, &size_global, 1, MPI_INT, MPI_SUM, + sycl_target->comm_pair.comm_parent)); + return size_global > 0; + }; + + auto lambda_apply_timestep = [&](auto aa) { + lambda_apply_timestep_reset(aa); + lambda_pre_advection(aa); + lambda_apply_advection_step(aa); + lambda_apply_boundary_conditions(aa); + aa = lambda_find_partial_moves(aa); + while (lambda_partial_moves_remaining(aa)) { + lambda_pre_advection(aa); + lambda_apply_advection_step(aa); + lambda_apply_boundary_conditions(aa); + aa = lambda_find_partial_moves(aa); + } + }; + + lambda_pre_advection(particle_sub_group(A)); + lambda_apply_boundary_conditions(particle_sub_group(A)); + // Uncomment for trajectory writing. + // h5part.write(); + // h5part.close(); + for (int stepx = 0; stepx < N_steps; stepx++) { + lambda_apply_timestep(static_particle_sub_group(A)); + A->hybrid_move(); + cell_id_translation->execute(); + A->cell_move(); + + // Uncomment for trajectory writing. + // h5part.write(); + // h5part.close(); + // if (!rank) { + // nprint(stepx); + //} + } + + A->free(); + sycl_target->free(); + mesh->free(); +} diff --git a/test/integration/nektar_interface/test_particle_advection.cpp b/test/integration/nektar_interface/test_particle_advection.cpp index dd357dfe..9bc98459 100644 --- a/test/integration/nektar_interface/test_particle_advection.cpp +++ b/test/integration/nektar_interface/test_particle_advection.cpp @@ -120,32 +120,15 @@ TEST(ParticleGeometryInterface, Advection2D) { auto lambda_advect = [&] { auto t0 = profile_timestamp(); - - auto k_P = (*A)[Sym("P")]->cell_dat.device_ptr(); - const auto k_V = (*A)[Sym("V")]->cell_dat.device_ptr(); - const auto k_ndim = ndim; - const auto k_dt = dt; - - const auto pl_iter_range = A->mpi_rank_dat->get_particle_loop_iter_range(); - const auto pl_stride = A->mpi_rank_dat->get_particle_loop_cell_stride(); - const auto pl_npart_cell = A->mpi_rank_dat->get_particle_loop_npart_cell(); - - sycl_target->profile_map.inc("Advect", "Prepare", 1, - profile_elapsed(t0, profile_timestamp())); - sycl_target->queue - .submit([&](sycl::handler &cgh) { - cgh.parallel_for<>( - sycl::range<1>(pl_iter_range), [=](sycl::id<1> idx) { - NESO_PARTICLES_KERNEL_START - const INT cellx = NESO_PARTICLES_KERNEL_CELL; - const INT layerx = NESO_PARTICLES_KERNEL_LAYER; - for (int dimx = 0; dimx < k_ndim; dimx++) { - k_P[cellx][dimx][layerx] += k_V[cellx][dimx][layerx] * k_dt; - } - NESO_PARTICLES_KERNEL_END - }); - }) - .wait_and_throw(); + 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())); }; @@ -319,36 +302,18 @@ TEST_P(ParticleAdvection3D, Advection3D) { auto lambda_advect = [&] { auto t0 = profile_timestamp(); - - auto k_P = (*A)[Sym("P")]->cell_dat.device_ptr(); - const auto k_V = (*A)[Sym("V")]->cell_dat.device_ptr(); - const auto k_ndim = ndim; - const auto k_dt = dt; - - const auto pl_iter_range = A->mpi_rank_dat->get_particle_loop_iter_range(); - const auto pl_stride = A->mpi_rank_dat->get_particle_loop_cell_stride(); - const auto pl_npart_cell = A->mpi_rank_dat->get_particle_loop_npart_cell(); - - sycl_target->profile_map.inc("Advect", "Prepare", 1, - profile_elapsed(t0, profile_timestamp())); - sycl_target->queue - .submit([&](sycl::handler &cgh) { - cgh.parallel_for<>( - sycl::range<1>(pl_iter_range), [=](sycl::id<1> idx) { - NESO_PARTICLES_KERNEL_START - const INT cellx = NESO_PARTICLES_KERNEL_CELL; - const INT layerx = NESO_PARTICLES_KERNEL_LAYER; - for (int dimx = 0; dimx < k_ndim; dimx++) { - k_P[cellx][dimx][layerx] += k_V[cellx][dimx][layerx] * k_dt; - } - NESO_PARTICLES_KERNEL_END - }); - }) - .wait_and_throw(); + 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())); }; - std::map> geoms_3d; get_all_elements_3d(graph, geoms_3d); @@ -404,7 +369,6 @@ TEST_P(ParticleAdvection3D, Advection3D) { lambda_check_owning_cell(); lambda_advect(); - T += dt; // h5part.write(); } diff --git a/test/test_resources/MASTU-2D/conditions_nummodes_2.xml b/test/test_resources/MASTU-2D/conditions_nummodes_2.xml new file mode 100644 index 00000000..e29cb361 --- /dev/null +++ b/test/test_resources/MASTU-2D/conditions_nummodes_2.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + +

NumSteps = 200

+

TimeStep = 5e4

+

IO_InfoSteps = 10

+

IO_CheckSteps = 10

+
+ + + u + + + + C[100] + C[101] + C[102] + C[103] + C[104] + C[105] + C[106] + C[107] + C[108] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/test/test_resources/MASTU-2D/mastu_cd.geo b/test/test_resources/MASTU-2D/mastu_cd.geo new file mode 100644 index 00000000..e3205db5 --- /dev/null +++ b/test/test_resources/MASTU-2D/mastu_cd.geo @@ -0,0 +1,6175 @@ +Point(1 )={ 7646.64040320 ,-6326.02927920 ,0.0}; +Point(2 )={ 7669.31702810 ,-6334.12357542 ,0,0}; +Point(3 )={ 7696.16337667 ,-6342.89788930 ,0,0}; +Point(4 )={ 7755.12638200 ,-6361.51507425 ,0,0}; +Point(5 )={ 7908.71281993 ,-6402.46667156 ,0,0}; +Point(6 )={ 8150.87412788 ,-6447.11277352 ,0,0}; +Point(7 )={ 8498.65805355 ,-6467.60243109 ,0,0}; +Point(8 )={ 8966.82704261 ,-6418.22274811 ,0,0}; +Point(9 )={ 9547.10668183 ,-6236.56773198 ,0,0}; +Point(10 )={ 10190.43716978 , -5867.67622690 ,0.0}; +Point(11 )={ 10832.05561559 , -5285.69022623 ,0.0}; +Point(12 )={ 11421.62758876 , -4480.74119787 ,0.0}; +Point(13 )={ 11923.94114262 , -3471.68991079 ,0.0}; +Point(14 )={ 12324.45665161 , -2333.13928658 ,0.0}; +Point(15 )={ 12599.29259710 , -1158.52647326 ,0.0}; +Point(16 )={ 12699.20044168 , 0.00058766 ,0.0}; +Point(17 )={ 12599.29240122 , 1158.52774652 ,0.0}; +Point(18 )={ 12324.45635778 , 2333.14026601 ,0.0}; +Point(19 )={ 11923.94075085 , 3471.69089022 ,0.0}; +Point(20 )={ 11421.62709905 , 4480.74198142 ,0.0}; +Point(21 )={ 10832.05512588 , 5285.69081389 ,0.0}; +Point(22 )={ 10190.43648418 , 5867.67671661 ,0.0}; +Point(23 )={ 9547.10609418 , 6236.56802581 ,0.0}; +Point(24 )={ 8966.82635701 , 6418.22294399 ,0.0}; +Point(25 )={ 8498.65756383 , 6467.60243109 ,0.0}; +Point(26 )={ 8150.87354023 , 6447.11267557 ,0.0}; +Point(27 )={ 7908.71370142 , 6402.46686744 ,0.0}; +Point(28 )={ 7755.12197457 , 6361.51380099 ,0.0}; +Point(29 )={ 7696.14016420 , 6342.89034770 ,0.0}; +Point(30 )={ 7669.29156294 , 6334.11446673 ,0.0}; +Point(31 )={ 7646.61268535 , 6326.01938696 ,0.0}; +Point(32 )={ 7624.03302394 , 6317.95976252 ,0.0}; +Point(33 )={ 7599.47266298 , 6309.04401908 ,0.0}; +Point(34 )={ 7568.06785532 , 6296.79175233 ,0.0}; +Point(35 )={ 7472.51847040 , 6257.32604697 ,0.0}; +Point(36 )={ 7296.59654274 , 6172.73138108 ,0.0}; +Point(37 )={ 7035.89601240 , 6017.72271410 ,0.0}; +Point(38 )={ 6698.77738445 , 5759.80914937 ,0.0}; +Point(39 )={ 6314.06320164 , 5374.33483160 ,0.0}; +Point(40 )={ 5921.24257768 , 4857.63610816 ,0.0}; +Point(41 )={ 5553.83813986 , 4223.48453627 ,0.0}; +Point(42 )={ 5234.27910927 , 3492.38975386 ,0.0}; +Point(43 )={ 4975.24928916 , 2685.24288652 ,0.0}; +Point(44 )={ 4785.83033825 , 1821.50284058 ,0.0}; +Point(45 )={ 4670.38708251 , 919.99081610 ,0.0}; +Point(46 )={ 4631.23479448 , 0.00048971 ,0.0}; +Point(47 )={ 4670.38708251 , -919.99003255 ,0.0}; +Point(48 )={ 4785.83024031 , -1821.50205704 ,0.0}; +Point(49 )={ 4975.24899533 , -2685.24190709 ,0.0}; +Point(50 )={ 5234.27871750 , -3492.38877443 ,0.0}; +Point(51 )={ 5553.83755220 , -4223.48345890 ,0.0}; +Point(52 )={ 5921.24199002 , -4857.63512873 ,0.0}; +Point(53 )={ 6314.06261398 , -5374.33414600 ,0.0}; +Point(54 )={ 6698.77660091 , -5759.80846377 ,0.0}; +Point(55 )={ 7035.89816714 , -6017.72418324 ,0.0}; +Point(56 )={ 7296.56990227 , -6172.71757113 ,0.0}; +Point(57 )={ 7472.53316184 , -6257.33231531 ,0.0}; +Point(58 )={ 7568.10154768 , -6296.80487668 ,0.0}; +Point(59 )={ 7599.50224174 , -6309.05557634 ,0.0}; +Point(60 )={ 7624.06221093 , -6317.97014447 ,0.0}; +Point(61 )={ 7535.25433472 , -6634.39490387 ,0.0}; +Point(62 )={ 7558.91401265 , -6642.66686854 ,0.0}; +Point(63 )={ 7586.45840036 , -6652.23030848 ,0.0}; +Point(64 )={ 7661.36053755 , -6676.41114065 ,0.0}; +Point(65 )={ 7837.76258138 , -6722.90297682 ,0.0}; +Point(66 )={ 8114.91967599 , -6770.13790588 ,0.0}; +Point(67 )={ 8511.12266053 , -6783.06588079 ,0.0}; +Point(68 )={ 9033.15711804 , -6706.97638166 ,0.0}; +Point(69 )={ 9659.47991694 , -6478.22149975 ,0.0}; +Point(70 )={ 10330.07359850 , -6051.23495944 ,0.0}; +Point(71 )={ 10978.92414907 , -5413.16077385 ,0.0}; +Point(72 )={ 11559.96333558 , -4562.32823276 ,0.0}; +Point(73 )={ 12047.23344553 , -3522.51258673 ,0.0}; +Point(74 )={ 12437.74153936 , -2365.74125048 ,0.0}; +Point(75 )={ 12712.66896353 , -1176.51711739 ,0.0}; +Point(76 )={ 12814.60579351 , 0.00058766 ,0.0}; +Point(77 )={ 12712.66876765 , 1176.51829271 ,0.0}; +Point(78 )={ 12437.74124553 , 2365.74222991 ,0.0}; +Point(79 )={ 12047.23305376 , 3522.51366410 ,0.0}; +Point(80 )={ 11559.96284587 , 4562.32911425 ,0.0}; +Point(81 )={ 10978.92356141 , 5413.16145945 ,0.0}; +Point(82 )={ 10330.07281495 , 6051.23544915 ,0.0}; +Point(83 )={ 9659.47923134 , 6478.22179358 ,0.0}; +Point(84 )={ 9033.15643244 , 6706.97657754 ,0.0}; +Point(85 )={ 8511.12207288 , 6783.06588079 ,0.0}; +Point(86 )={ 8114.91908833 , 6770.13790588 ,0.0}; +Point(87 )={ 7837.76326698 , 6722.90307476 ,0.0}; +Point(88 )={ 7661.35642395 , 6676.40976945 ,0.0}; +Point(89 )={ 7586.43264137 , 6652.22129773 ,0.0}; +Point(90 )={ 7558.88414006 , 6642.65658454 ,0.0}; +Point(91 )={ 7535.22318887 , 6634.38305278 ,0.0}; +Point(92 )={ 7512.49073652 , 6625.74752401 ,0.0}; +Point(93 )={ 7486.91598080 , 6616.03217461 ,0.0}; +Point(94 )={ 7450.46525215 , 6601.52780850 ,0.0}; +Point(95 )={ 7337.96998018 , 6553.09082606 ,0.0}; +Point(96 )={ 7141.55222453 , 6453.86897366 ,0.0}; +Point(97 )={ 6857.00974451 , 6273.47066306 ,0.0}; +Point(98 )={ 6499.18255657 , 5979.66180395 ,0.0}; +Point(99 )={ 6102.35156206 , 5552.77585101 ,0.0}; +Point(100 )={ 5706.72360036 , 4996.05696737 ,0.0}; +Point(101 )={ 5342.27899739 , 4327.54966577 ,0.0}; +Point(102 )={ 5028.16970642 , 3568.23743194 ,0.0}; +Point(103 )={ 4775.29236632 , 2737.81403935 ,0.0}; +Point(104 )={ 4590.41620365 , 1854.59833883 ,0.0}; +Point(105 )={ 4478.27244879 , 935.97000660 ,0.0}; +Point(106 )={ 4440.28577937 , 0.00058766 ,0.0}; +Point(107 )={ 4478.27235084 , -935.96922306 ,0.0}; +Point(108 )={ 4590.41600776 , -1854.59755528 ,0.0}; +Point(109 )={ 4775.29207249 , -2737.81286403 ,0.0}; +Point(110 )={ 5028.16931465 , -3568.23645251 ,0.0}; +Point(111 )={ 5342.27840973 , -4327.54858840 ,0.0}; +Point(112 )={ 5706.72301270 , -4996.05608589 ,0.0}; +Point(113 )={ 6102.35087646 , -5552.77496953 ,0.0}; +Point(114 )={ 6499.18187097 , -5979.66111835 ,0.0}; +Point(115 )={ 6857.01121365 , -6273.47174043 ,0.0}; +Point(116 )={ 7141.52480052 , -6453.85408633 ,0.0}; +Point(117 )={ 7337.98555310 , -6553.09768207 ,0.0}; +Point(118 )={ 7450.50374372 , -6601.54377320 ,0.0}; +Point(119 )={ 7486.94947727 , -6616.04490719 ,0.0}; +Point(120 )={ 7512.52335151 , -6625.75996276 ,0.0}; +Point(121 )={ 7424.46395504 , -6932.95066424 ,0.0}; +Point(122 )={ 7448.56212339 , -6941.87865055 ,0.0}; +Point(123 )={ 7476.42129964 , -6951.99135435 ,0.0}; +Point(124 )={ 7570.55158967 , -6982.71467522 ,0.0}; +Point(125 )={ 7771.73240715 , -7035.12040247 ,0.0}; +Point(126 )={ 8087.13238984 , -7083.00371361 ,0.0}; +Point(127 )={ 8533.47029519 , -7083.72555289 ,0.0}; +Point(128 )={ 9107.34926704 , -6975.39902515 ,0.0}; +Point(129 )={ 9773.12572433 , -6695.99384684 ,0.0}; +Point(130 )={ 10464.38810310 , -6213.40168634 ,0.0}; +Point(131 )={ 11116.07135863 , -5524.05223061 ,0.0}; +Point(132 )={ 11686.79872340 , -4632.58885526 ,0.0}; +Point(133 )={ 12158.68053245 , -3566.20903419 ,0.0}; +Point(134 )={ 12539.56495144 , -2394.25488127 ,0.0}; +Point(135 )={ 12814.77905453 , -1192.63156706 ,0.0}; +Point(136 )={ 12919.21058847 , 0.00068560 ,0.0}; +Point(137 )={ 12814.77885864 , 1192.63284032 ,0.0}; +Point(138 )={ 12539.56465762 , 2394.25586070 ,0.0}; +Point(139 )={ 12158.68014068 , 3566.21011157 ,0.0}; +Point(140 )={ 11686.79823369 , 4632.58973675 ,0.0}; +Point(141 )={ 11116.07067303 , 5524.05301416 ,0.0}; +Point(142 )={ 10464.38731956 , 6213.40237194 ,0.0}; +Point(143 )={ 9773.12503872 , 6695.99423861 ,0.0}; +Point(144 )={ 9107.34848350 , 6975.39931898 ,0.0}; +Point(145 )={ 8533.46960958 , 7083.72555289 ,0.0}; +Point(146 )={ 8087.13180219 , 7083.00371361 ,0.0}; +Point(147 )={ 7771.73299481 , 7035.12050041 ,0.0}; +Point(148 )={ 7570.54708429 , 6982.71330402 ,0.0}; +Point(149 )={ 7476.39397356 , 6951.98214771 ,0.0}; +Point(150 )={ 7448.52647217 , 6941.86542826 ,0.0}; +Point(151 )={ 7424.42634497 , 6932.93675634 ,0.0}; +Point(152 )={ 7400.77665722 , 6924.09828986 ,0.0}; +Point(153 )={ 7374.66233399 , 6913.56413770 ,0.0}; +Point(154 )={ 7331.86128064 , 6896.27701752 ,0.0}; +Point(155 )={ 7201.74098543 , 6838.60940517 ,0.0}; +Point(156 )={ 6984.66628572 , 6721.79984578 ,0.0}; +Point(157 )={ 6676.99546807 , 6514.19299372 ,0.0}; +Point(158 )={ 6301.28831150 , 6182.86347758 ,0.0}; +Point(159 )={ 5896.06311956 , 5715.20898264 ,0.0}; +Point(160 )={ 5500.56581370 , 5120.94916778 ,0.0}; +Point(161 )={ 5141.05635828 , 4421.02648068 ,0.0}; +Point(162 )={ 4833.38299412 , 3636.25653291 ,0.0}; +Point(163 )={ 4586.46361942 , 2785.09696043 ,0.0}; +Point(164 )={ 4406.56334853 , 1884.33145684 ,0.0}; +Point(165 )={ 4297.36708772 , 950.34322715 ,0.0}; +Point(166 )={ 4260.56023865 , 0.00058766 ,0.0}; +Point(167 )={ 4297.36698978 , -950.34244361 ,0.0}; +Point(168 )={ 4406.56325059 , -1884.33077124 ,0.0}; +Point(169 )={ 4586.46332559 , -2785.09578512 ,0.0}; +Point(170 )={ 4833.38270029 , -3636.25565143 ,0.0}; +Point(171 )={ 5141.05586857 , -4421.02530536 ,0.0}; +Point(172 )={ 5500.56522605 , -5120.94818836 ,0.0}; +Point(173 )={ 5896.06253190 , -5715.20810115 ,0.0}; +Point(174 )={ 6301.28762590 , -6182.86279198 ,0.0}; +Point(175 )={ 6676.99634956 , -6514.19358138 ,0.0}; +Point(176 )={ 6984.63846993 , -6721.78329343 ,0.0}; +Point(177 )={ 7201.75704807 , -6838.61733855 ,0.0}; +Point(178 )={ 7331.90594261 , -6896.29601845 ,0.0}; +Point(179 )={ 7374.69808315 , -6913.57853531 ,0.0}; +Point(180 )={ 7400.81338581 , -6924.11307924 ,0.0}; +Point(181 )={ 7314.88885104 , -7223.28578202 ,0.0}; +Point(182 )={ 7339.05832183 , -7232.42179908 ,0.0}; +Point(183 )={ 7368.04207861 , -7242.71589315 ,0.0}; +Point(184 )={ 7482.40277133 , -7280.98444227 ,0.0}; +Point(185 )={ 7711.29036588 , -7339.09514837 ,0.0}; +Point(186 )={ 8068.30413792 , -7385.66318413 ,0.0}; +Point(187 )={ 8565.74023261 , -7368.76225286 ,0.0}; +Point(188 )={ 9187.47450394 , -7221.70576693 ,0.0}; +Point(189 )={ 9886.00150452 , -6891.16106736 ,0.0}; +Point(190 )={ 10591.88793565 , -6356.03017313 ,0.0}; +Point(191 )={ 11243.12359206 , -5620.32472806 ,0.0}; +Point(192 )={ 11802.08321368 , -4692.80611755 ,0.0}; +Point(193 )={ 12258.68690760 , -3603.63458866 ,0.0}; +Point(194 )={ 12630.99162528 , -2419.25334089 ,0.0}; +Point(195 )={ 12906.71679449 , -1207.10322024 ,0.0}; +Point(196 )={ 13013.65439376 , 0.00068560 ,0.0}; +Point(197 )={ 12906.71659860 , 1207.10439555 ,0.0}; +Point(198 )={ 12630.99133145 , 2419.25432032 ,0.0}; +Point(199 )={ 12258.68651582 , 3603.63566603 ,0.0}; +Point(200 )={ 11802.08282191 , 4692.80709697 ,0.0}; +Point(201 )={ 11243.12300440 , 5620.32560954 ,0.0}; +Point(202 )={ 10591.88715211 , 6356.03095668 ,0.0}; +Point(203 )={ 9886.00072098 , 6891.16155708 ,0.0}; +Point(204 )={ 9187.47362245 , 7221.70615870 ,0.0}; +Point(205 )={ 8565.73944906 , 7368.76235080 ,0.0}; +Point(206 )={ 8068.30355026 , 7385.66308618 ,0.0}; +Point(207 )={ 7711.29085559 , 7339.09524631 ,0.0}; +Point(208 )={ 7482.39787418 , 7280.98297313 ,0.0}; +Point(209 )={ 7368.01720111 , 7242.70698035 ,0.0}; +Point(210 )={ 7339.01405164 , 7232.40622615 ,0.0}; +Point(211 )={ 7314.84271993 , 7223.26815229 ,0.0}; +Point(212 )={ 7291.08176903 , 7214.20255619 ,0.0}; +Point(213 )={ 7264.18556752 , 7203.77114615 ,0.0}; +Point(214 )={ 7211.80853755 , 7182.01861264 ,0.0}; +Point(215 )={ 7064.08574598 , 7113.07081696 ,0.0}; +Point(216 )={ 6825.16860116 , 6977.79304380 ,0.0}; +Point(217 )={ 6496.49216267 , 6739.53152884 ,0.0}; +Point(218 )={ 6106.06232524 , 6369.73610861 ,0.0}; +Point(219 )={ 5696.26417864 , 5862.34685913 ,0.0}; +Point(220 )={ 5303.33767839 , 5233.32622266 ,0.0}; +Point(221 )={ 4950.13643222 , 4504.94005154 ,0.0}; +Point(222 )={ 4649.17108029 , 3697.42756330 ,0.0}; +Point(223 )={ 4408.72220624 , 2827.54620283 ,0.0}; +Point(224 )={ 4233.81996225 , 1911.04146887 ,0.0}; +Point(225 )={ 4127.66287006 , 963.26062423 ,0.0}; +Point(226 )={ 4091.77541111 , 0.00058766 ,0.0}; +Point(227 )={ 4127.66277212 , -963.25974274 ,0.0}; +Point(228 )={ 4233.81986431 , -1911.04078327 ,0.0}; +Point(229 )={ 4408.72191241 , -2827.54502752 ,0.0}; +Point(230 )={ 4649.17078646 , -3697.42668181 ,0.0}; +Point(231 )={ 4950.13604045 , -4504.93897417 ,0.0}; +Point(232 )={ 5303.33718868 , -5233.32524324 ,0.0}; +Point(233 )={ 5696.26349304 , -5862.34597764 ,0.0}; +Point(234 )={ 6106.06163963 , -6369.73542301 ,0.0}; +Point(235 )={ 6496.49245650 , -6739.53172473 ,0.0}; +Point(236 )={ 6825.14009977 , -6977.77521819 ,0.0}; +Point(237 )={ 7064.10288599 , -7113.07982771 ,0.0}; +Point(238 )={ 7211.85858637 , -7182.04006214 ,0.0}; +Point(239 )={ 7264.22464674 , -7203.78740467 ,0.0}; +Point(240 )={ 7291.12545157 , -7214.21920648 ,0.0}; +Point(241 )={ 7206.12216785 , -7506.21935380 ,0.0}; +Point(242 )={ 7231.09134254 , -7515.51070832 ,0.0}; +Point(243 )={ 7261.82622067 , -7526.94760031 ,0.0}; +Point(244 )={ 7398.01515676 , -7571.37675872 ,0.0}; +Point(245 )={ 7657.25075494 , -7634.66649021 ,0.0}; +Point(246 )={ 8059.06763143 , -7676.82807427 ,0.0}; +Point(247 )={ 8607.40044690 , -7636.27246017 ,0.0}; +Point(248 )={ 9271.95673136 , -7446.54018988 ,0.0}; +Point(249 )={ 9995.95006485 , -7064.57379552 ,0.0}; +Point(250 )={ 10711.50062124 , -6480.96076717 ,0.0}; +Point(251 )={ 11359.87164330 , -5703.68658648 ,0.0}; +Point(252 )={ 11906.67978143 , -4744.53143537 ,0.0}; +Point(253 )={ 12348.85834505 , -3635.95290988 ,0.0}; +Point(254 )={ 12712.59403720 , -2441.10146668 ,0.0}; +Point(255 )={ 12989.08110434 , -1220.06106774 ,0.0}; +Point(256 )={ 13098.55258474 , 0.00068560 ,0.0}; +Point(257 )={ 12989.08090845 , 1220.06224306 ,0.0}; +Point(258 )={ 12712.59393926 , 2441.10264199 ,0.0}; +Point(259 )={ 12348.85795328 , 3635.95398725 ,0.0}; +Point(260 )={ 11906.67929171 , 4744.53241480 ,0.0}; +Point(261 )={ 11359.87105564 , 5703.68746797 ,0.0}; +Point(262 )={ 10711.49973975 , 6480.96155071 ,0.0}; +Point(263 )={ 9995.94937925 , 7064.57428523 ,0.0}; +Point(264 )={ 9271.95575193 , 7446.54058165 ,0.0}; +Point(265 )={ 8607.39946747 , 7636.27265605 ,0.0}; +Point(266 )={ 8059.06694583 , 7676.82807427 ,0.0}; +Point(267 )={ 7657.25104877 , 7634.66658815 ,0.0}; +Point(268 )={ 7398.00928019 , 7571.37489780 ,0.0}; +Point(269 )={ 7261.81054980 , 7526.94182168 ,0.0}; +Point(270 )={ 7231.03698422 , 7515.49043414 ,0.0}; +Point(271 )={ 7206.06350005 , 7506.19741459 ,0.0}; +Point(272 )={ 7182.41116784 , 7496.71301458 ,0.0}; +Point(273 )={ 7155.51604370 , 7485.77896151 ,0.0}; +Point(274 )={ 7090.01182293 , 7457.52811156 ,0.0}; +Point(275 )={ 6924.71278370 , 7376.88759699 ,0.0}; +Point(276 )={ 6664.20529884 , 7220.47766074 ,0.0}; +Point(277 )={ 6315.60296219 , 6949.85884328 ,0.0}; +Point(278 )={ 5914.59666126 , 6540.40986318 ,0.0}; +Point(279 )={ 5503.99734163 , 5994.82699090 ,0.0}; +Point(280 )={ 5116.31490087 , 5333.72064764 ,0.0}; +Point(281 )={ 4770.26828661 , 4579.88831984 ,0.0}; +Point(282 )={ 4476.85217859 , 3751.95071840 ,0.0}; +Point(283 )={ 4242.25803811 , 2865.54256860 ,0.0}; +Point(284 )={ 4072.28957046 , 1934.95765929 ,0.0}; +Point(285 )={ 3968.97625077 , 974.84834831 ,0.0}; +Point(286 )={ 3934.26058085 , 0.00058766 ,0.0}; +Point(287 )={ 3968.97615283 , -974.84746682 ,0.0}; +Point(288 )={ 4072.28937458 , -1934.95697369 ,0.0}; +Point(289 )={ 4242.25784222 , -2865.54149123 ,0.0}; +Point(290 )={ 4476.85188477 , -3751.94983691 ,0.0}; +Point(291 )={ 4770.26779690 , -4579.88714452 ,0.0}; +Point(292 )={ 5116.31441116 , -5333.71966821 ,0.0}; +Point(293 )={ 5503.99675398 , -5994.82610942 ,0.0}; +Point(294 )={ 5914.59597566 , -6540.40907964 ,0.0}; +Point(295 )={ 6315.60266836 , -6949.85864740 ,0.0}; +Point(296 )={ 6664.17640568 , -7220.45797421 ,0.0}; +Point(297 )={ 6924.73158874 , -7376.89768511 ,0.0}; +Point(298 )={ 7090.06696479 , -7457.55249934 ,0.0}; +Point(299 )={ 7155.55708178 , -7485.79570975 ,0.0}; +Point(300 )={ 7182.46307759 , -7496.73417025 ,0.0}; +Point(301 )={ 7097.83560083 , -7779.65275677 ,0.0}; +Point(302 )={ 7123.40555734 , -7789.84038689 ,0.0}; +Point(303 )={ 7158.55129460 , -7803.01968332 ,0.0}; +Point(304 )={ 7318.19971330 , -7855.42560646 ,0.0}; +Point(305 )={ 7611.09897657 , -7921.05059085 ,0.0}; +Point(306 )={ 8059.97497458 , -7954.29310140 ,0.0}; +Point(307 )={ 8657.06005073 , -7883.48967927 ,0.0}; +Point(308 )={ 9358.16069726 , -7648.72129835 ,0.0}; +Point(309 )={ 10101.39374086 , -7217.73653241 ,0.0}; +Point(310 )={ 10822.31911053 , -6589.77465884 ,0.0}; +Point(311 )={ 11466.09974411 , -5775.53711630 ,0.0}; +Point(312 )={ 12000.58989579 , -4788.68214207 ,0.0}; +Point(313 )={ 12429.00385613 , -3663.55312506 ,0.0}; +Point(314 )={ 12785.16395773 , -2460.17408617 ,0.0}; +Point(315 )={ 13062.57247180 , -1231.63782221 ,0.0}; +Point(316 )={ 13174.62670683 , 0.00068560 ,0.0}; +Point(317 )={ 13062.57227591 , 1231.63889959 ,0.0}; +Point(318 )={ 12785.16405567 , 2460.17526149 ,0.0}; +Point(319 )={ 12429.00346436 , 3663.55430037 ,0.0}; +Point(320 )={ 12000.58940608 , 4788.68321945 ,0.0}; +Point(321 )={ 11466.09905851 , 5775.53809573 ,0.0}; +Point(322 )={ 10822.31822904 , 6589.77563827 ,0.0}; +Point(323 )={ 10101.39295732 , 7217.73712006 ,0.0}; +Point(324 )={ 9358.15961989 , 7648.72178806 ,0.0}; +Point(325 )={ 8657.05897336 , 7883.48997310 ,0.0}; +Point(326 )={ 8059.97409309 , 7954.29310140 ,0.0}; +Point(327 )={ 7611.09927040 , 7921.05068879 ,0.0}; +Point(328 )={ 7318.19315113 , 7855.42364760 ,0.0}; +Point(329 )={ 7158.54757277 , 7803.01831212 ,0.0}; +Point(330 )={ 7123.33670347 , 7789.81296288 ,0.0}; +Point(331 )={ 7097.76410250 , 7779.62425538 ,0.0}; +Point(332 )={ 7073.54791294 , 7769.97599688 ,0.0}; +Point(333 )={ 7046.77854750 , 7758.54135757 ,0.0}; +Point(334 )={ 6967.26388673 , 7723.46173178 ,0.0}; +Point(335 )={ 6783.61886648 , 7630.34113525 ,0.0}; +Point(336 )={ 6501.73808308 , 7449.74576351 ,0.0}; +Point(337 )={ 6135.91826366 , 7144.15192330 ,0.0}; +Point(338 )={ 5728.20003279 , 6694.94478029 ,0.0}; +Point(339 )={ 5320.27768888 , 6113.28159947 ,0.0}; +Point(340 )={ 4939.99414966 , 5423.00501612 ,0.0}; +Point(341 )={ 4601.92665077 , 4646.52955990 ,0.0}; +Point(342 )={ 4315.79573256 , 3800.60190199 ,0.0}; +Point(343 )={ 4087.63820449 , 2899.35167891 ,0.0}; +Point(344 )={ 3922.11889165 , 1956.30255438 ,0.0}; +Point(345 )={ 3821.57578933 , 985.18455784 ,0.0}; +Point(346 )={ 3787.99057652 , 0.00048971 ,0.0}; +Point(347 )={ 3821.57578933 , -985.18367635 ,0.0}; +Point(348 )={ 3922.11879370 , -1956.30177084 ,0.0}; +Point(349 )={ 4087.63800860 , -2899.35060154 ,0.0}; +Point(350 )={ 4315.79543873 , -3800.60102051 ,0.0}; +Point(351 )={ 4601.92625900 , -4646.52848253 ,0.0}; +Point(352 )={ 4939.99395378 , -5423.00384081 ,0.0}; +Point(353 )={ 5320.27710123 , -6113.28062004 ,0.0}; +Point(354 )={ 5728.19944513 , -6694.94389881 ,0.0}; +Point(355 )={ 6135.91767600 , -7144.15143358 ,0.0}; +Point(356 )={ 6501.72358753 , -7449.73518567 ,0.0}; +Point(357 )={ 6783.67038445 , -7630.27208549 ,0.0}; +Point(358 )={ 6967.29532640 , -7723.47593350 ,0.0}; +Point(359 )={ 7046.81889998 , -7758.55879141 ,0.0}; +Point(360 )={ 7073.61040052 , -7770.00087438 ,0.0}; +Point(361 )={ 6990.76088147 , -8045.48422253 ,0.0}; +Point(362 )={ 7016.94729069 , -8055.64423276 ,0.0}; +Point(363 )={ 7059.59183126 , -8071.55868300 ,0.0}; +Point(364 )={ 7243.61158110 , -8131.39426175 ,0.0}; +Point(365 )={ 7573.92190328 , -8198.89191465 ,0.0}; +Point(366 )={ 8071.32734184 , -8216.57394066 ,0.0}; +Point(367 )={ 8713.26909721 , -8109.88208015 ,0.0}; +Point(368 )={ 9443.78376374 , -7828.47367543 ,0.0}; +Point(369 )={ 10200.74360466 , -7351.89481807 ,0.0}; +Point(370 )={ 10923.79061372 , -6684.04344015 ,0.0}; +Point(371 )={ 11562.24922525 , -5837.46602895 ,0.0}; +Point(372 )={ 12085.01423895 , -4826.55519771 ,0.0}; +Point(373 )={ 12500.02549507 , -3687.12592762 ,0.0}; +Point(374 )={ 12849.37249170 , -2476.78393110 ,0.0}; +Point(375 )={ 13127.73957306 , -1241.92868417 ,0.0}; +Point(376 )={ 13242.27460416 , 0.00068560 ,0.0}; +Point(377 )={ 13127.73947512 , 1241.92976154 ,0.0}; +Point(378 )={ 12849.37209992 , 2476.78510642 ,0.0}; +Point(379 )={ 12500.02510330 , 3687.12720088 ,0.0}; +Point(380 )={ 12085.01365129 , 4826.55637303 ,0.0}; +Point(381 )={ 11562.24863759 , 5837.46700838 ,0.0}; +Point(382 )={ 10923.78963429 , 6684.04451753 ,0.0}; +Point(383 )={ 10200.74272317 , 7351.89550367 ,0.0}; +Point(384 )={ 9443.78268636 , 7828.47426309 ,0.0}; +Point(385 )={ 8713.26792189 , 8109.88237398 ,0.0}; +Point(386 )={ 8071.32646035 , 8216.57403860 ,0.0}; +Point(387 )={ 7573.92180533 , 8198.89191465 ,0.0}; +Point(388 )={ 7243.60462715 , 8131.39230289 ,0.0}; +Point(389 )={ 7059.60250704 , 8071.56260072 ,0.0}; +Point(390 )={ 7016.85238401 , 8055.60877742 ,0.0}; +Point(391 )={ 6990.67371228 , 8045.44857131 ,0.0}; +Point(392 )={ 6966.51540698 , 8035.55212547 ,0.0}; +Point(393 )={ 6939.39511208 , 8024.44236281 ,0.0}; +Point(394 )={ 6843.39176177 , 7980.67480879 ,0.0}; +Point(395 )={ 6641.19811661 , 7871.98843879 ,0.0}; +Point(396 )={ 6338.09339761 , 7664.88236884 ,0.0}; +Point(397 )={ 5959.08380187 , 7321.26258410 ,0.0}; +Point(398 )={ 5549.15676240 , 6832.91510210 ,0.0}; +Point(399 )={ 5146.96309953 , 6217.95671744 ,0.0}; +Point(400 )={ 4775.15642156 , 5501.89832705 ,0.0}; +Point(401 )={ 4445.52151371 , 4705.49383849 ,0.0}; +Point(402 )={ 4166.76814550 , 3843.66603001 ,0.0}; +Point(403 )={ 3944.69776952 , 2929.34708805 ,0.0}; +Point(404 )={ 3783.47109870 , 1975.26694696 ,0.0}; +Point(405 )={ 3685.61848823 , 994.35740143 ,0.0}; +Point(406 )={ 3653.00242055 , 0.00058766 ,0.0}; +Point(407 )={ 3685.61848823 , -994.35651994 ,0.0}; +Point(408 )={ 3783.47100076 , -1975.26626136 ,0.0}; +Point(409 )={ 3944.69757363 , -2929.34610862 ,0.0}; +Point(410 )={ 4166.76794961 , -3843.66514852 ,0.0}; +Point(411 )={ 4445.52112194 , -4705.49276112 ,0.0}; +Point(412 )={ 4775.15602979 , -5501.89744556 ,0.0}; +Point(413 )={ 5146.96251187 , -6217.95564006 ,0.0}; +Point(414 )={ 5549.15607680 , -6832.91422062 ,0.0}; +Point(415 )={ 5959.08301832 , -7321.26180056 ,0.0}; +Point(416 )={ 6338.09261406 , -7664.88178119 ,0.0}; +Point(417 )={ 6641.19703924 , -7871.98775319 ,0.0}; +Point(418 )={ 6843.39812806 , -7980.67784502 ,0.0}; +Point(419 )={ 6939.42988182 , -8024.45656453 ,0.0}; +Point(420 )={ 6966.58690531 , -8035.58141040 ,0.0}; +Point(421 )={ 6885.36607898 , -8303.16693581 ,0.0}; +Point(422 )={ 6911.66855055 , -8313.76093109 ,0.0}; +Point(423 )={ 6965.26643894 , -8334.16459478 ,0.0}; +Point(424 )={ 7175.59248012 , -8399.31739639 ,0.0}; +Point(425 )={ 7546.77594733 , -8465.48488657 ,0.0}; +Point(426 )={ 8092.74520441 , -8461.05463475 ,0.0}; +Point(427 )={ 8773.94101050 , -8314.12175278 ,0.0}; +Point(428 )={ 9526.87324292 , -7986.62513463 ,0.0}; +Point(429 )={ 10292.59809315 , -7468.21005957 ,0.0}; +Point(430 )={ 11015.88036109 , -6765.49120021 ,0.0}; +Point(431 )={ 11648.01616987 , -5890.31994298 ,0.0}; +Point(432 )={ 12159.41490842 , -4858.53013108 ,0.0}; +Point(433 )={ 12562.63912663 , -3707.22038554 ,0.0}; +Point(434 )={ 12905.73139083 , -2491.16479120 ,0.0}; +Point(435 )={ 13185.16986974 , -1251.02571995 ,0.0}; +Point(436 )={ 13301.96219117 , 0.00068560 ,0.0}; +Point(437 )={ 13185.16967385 , 1251.02679732 ,0.0}; +Point(438 )={ 12905.73109701 , 2491.16596651 ,0.0}; +Point(439 )={ 12562.63873486 , 3707.22165879 ,0.0}; +Point(440 )={ 12159.41432076 , 4858.53140434 ,0.0}; +Point(441 )={ 11648.01558221 , 5890.32102035 ,0.0}; +Point(442 )={ 11015.87947960 , 6765.49227759 ,0.0}; +Point(443 )={ 10292.59721166 , 7468.21074517 ,0.0}; +Point(444 )={ 9526.87206761 , 7986.62582023 ,0.0}; +Point(445 )={ 8773.93973724 , 8314.12214455 ,0.0}; +Point(446 )={ 8092.74412703 , 8461.05483064 ,0.0}; +Point(447 )={ 7546.77565350 , 8465.48488657 ,0.0}; +Point(448 )={ 7175.58591795 , 8399.31563341 ,0.0}; +Point(449 )={ 6965.28886787 , 8334.17370348 ,0.0}; +Point(450 )={ 6911.54543630 , 8313.71137197 ,0.0}; +Point(451 )={ 6885.25520760 , 8303.12227384 ,0.0}; +Point(452 )={ 6860.83402352 , 8293.01740548 ,0.0}; +Point(453 )={ 6833.32166314 , 8280.82488391 ,0.0}; +Point(454 )={ 6719.02218474 , 8227.16891536 ,0.0}; +Point(455 )={ 6497.20636240 , 8101.30296650 ,0.0}; +Point(456 )={ 6174.93715345 , 7863.76867769 ,0.0}; +Point(457 )={ 5786.17851595 , 7481.15390123 ,0.0}; +Point(458 )={ 5378.59143064 , 6954.99379437 ,0.0}; +Point(459 )={ 4984.71968333 , 6309.89886483 ,0.0}; +Point(460 )={ 4622.41278240 , 5571.15660177 ,0.0}; +Point(461 )={ 4301.62104230 , 4757.27420024 ,0.0}; +Point(462 )={ 4029.87715460 , 3881.60607860 ,0.0}; +Point(463 )={ 3813.63075810 , 2955.80411354 ,0.0}; +Point(464 )={ 3656.53003048 , 1992.00431357 ,0.0}; +Point(465 )={ 3561.28436654 , 1002.44670257 ,0.0}; +Point(466 )={ 3529.49454528 , 0.00058766 ,0.0}; +Point(467 )={ 3561.28426860 , -1002.44572314 ,0.0}; +Point(468 )={ 3656.52993254 , -1992.00353002 ,0.0}; +Point(469 )={ 3813.63056222 , -2955.80313411 ,0.0}; +Point(470 )={ 4029.87695871 , -3881.60519711 ,0.0}; +Point(471 )={ 4301.62065053 , -4757.27312286 ,0.0}; +Point(472 )={ 4622.41239063 , -5571.15562234 ,0.0}; +Point(473 )={ 4984.71909567 , -6309.89778746 ,0.0}; +Point(474 )={ 5378.59084298 , -6954.99291288 ,0.0}; +Point(475 )={ 5786.17783035 , -7481.15311769 ,0.0}; +Point(476 )={ 6174.93636990 , -7863.76799209 ,0.0}; +Point(477 )={ 6497.20528503 , -8101.30218296 ,0.0}; +Point(478 )={ 6719.02962841 , -8227.17273514 ,0.0}; +Point(479 )={ 6833.33831343 , -8280.83222963 ,0.0}; +Point(480 )={ 6860.92060506 , -8293.05579910 ,0.0}; +Point(481 )={ 6782.20026132 , -8552.13096679 ,0.0}; +Point(482 )={ 6808.09431093 , -8562.59949719 ,0.0}; +Point(483 )={ 6876.77021709 , -8588.19080526 ,0.0}; +Point(484 )={ 7115.14544376 , -8660.05769155 ,0.0}; +Point(485 )={ 7530.76463155 , -8718.73695626 ,0.0}; +Point(486 )={ 8123.06235601 , -8685.29660102 ,0.0}; +Point(487 )={ 8836.52565096 , -8494.94493974 ,0.0}; +Point(488 )={ 9605.53227440 , -8124.01338171 ,0.0}; +Point(489 )={ 10375.98835502 , -7568.02544603 ,0.0}; +Point(490 )={ 11098.14986220 , -6835.17983610 ,0.0}; +Point(491 )={ 11724.04455262 , -5935.34361487 ,0.0}; +Point(492 )={ 12224.90473158 , -4885.60125863 ,0.0}; +Point(493 )={ 12617.08177266 , -3724.17254095 ,0.0}; +Point(494 )={ 12954.78218151 , -2503.53596065 ,0.0}; +Point(495 )={ 13235.32085317 , -1258.99905668 ,0.0}; +Point(496 )={ 13354.33226720 , 0.00068560 ,0.0}; +Point(497 )={ 13235.32065728 , 1259.00023200 ,0.0}; +Point(498 )={ 12954.78188769 , 2503.53713596 ,0.0}; +Point(499 )={ 12617.08138089 , 3724.17381421 ,0.0}; +Point(500 )={ 12224.90424187 , 4885.60253189 ,0.0}; +Point(501 )={ 11724.04386702 , 5935.34469224 ,0.0}; +Point(502 )={ 11098.14907865 , 6835.18091347 ,0.0}; +Point(503 )={ 10375.98737559 , 7568.02622958 ,0.0}; +Point(504 )={ 9605.53119702 , 8124.01406731 ,0.0}; +Point(505 )={ 8836.52437770 , 8494.94542946 ,0.0}; +Point(506 )={ 8123.06118070 , 8685.29669896 ,0.0}; +Point(507 )={ 7530.76423978 , 8718.73695626 ,0.0}; +Point(508 )={ 7115.13927336 , 8660.05622240 ,0.0}; +Point(509 )={ 6876.80077528 , 8588.20167692 ,0.0}; +Point(510 )={ 6807.93672079 , 8562.54024173 ,0.0}; +Point(511 )={ 6782.05981118 , 8552.07249487 ,0.0}; +Point(512 )={ 6757.52021412 , 8541.86057490 ,0.0}; +Point(513 )={ 6727.58425633 , 8529.14582171 ,0.0}; +Point(514 )={ 6593.71470638 , 8464.09537045 ,0.0}; +Point(515 )={ 6351.42548498 , 8317.80881377 ,0.0}; +Point(516 )={ 6012.79011307 , 8045.72643536 ,0.0}; +Point(517 )={ 5619.96439608 , 7622.68816979 ,0.0}; +Point(518 )={ 5218.70510860 , 7061.27272755 ,0.0}; +Point(519 )={ 4835.19914957 , 6389.53801104 ,0.0}; +Point(520 )={ 4483.05314036 , 5631.17386462 ,0.0}; +Point(521 )={ 4170.65471620 , 4802.38308246 ,0.0}; +Point(522 )={ 3905.77741030 , 3914.69305581 ,0.0}; +Point(523 )={ 3694.70357498 , 2978.96193197 ,0.0}; +Point(524 )={ 3541.42908522 , 2006.65774879 ,0.0}; +Point(525 )={ 3448.81220909 , 1009.51798506 ,0.0}; +Point(526 )={ 3417.63080922 , 0.00058766 ,0.0}; +Point(527 )={ 3448.81220909 , -1009.51710358 ,0.0}; +Point(528 )={ 3541.42898728 , -2006.65696525 ,0.0}; +Point(529 )={ 3694.70337909 , -2978.96105048 ,0.0}; +Point(530 )={ 3905.77711647 , -3914.69217432 ,0.0}; +Point(531 )={ 4170.65442237 , -4802.38210303 ,0.0}; +Point(532 )={ 4483.05274858 , -5631.17298314 ,0.0}; +Point(533 )={ 4835.19865986 , -6389.53703162 ,0.0}; +Point(534 )={ 5218.70452094 , -7061.27184606 ,0.0}; +Point(535 )={ 5619.96371048 , -7622.68738625 ,0.0}; +Point(536 )={ 6012.78923159 , -8045.72574976 ,0.0}; +Point(537 )={ 6351.42440761 , -8317.80812817 ,0.0}; +Point(538 )={ 6593.72244387 , -8464.09967994 ,0.0}; +Point(539 )={ 6727.56907518 , -8529.13886776 ,0.0}; +Point(540 )={ 6757.63392584 , -8541.90788133 ,0.0}; +Point(541 )={ 6681.27381044 , -8792.74232813 ,0.0}; +Point(542 )={ 6706.33113374 , -8803.06649067 ,0.0}; +Point(543 )={ 6793.39503842 , -8836.29597482 ,0.0}; +Point(544 )={ 7064.45704756 , -8910.25355055 ,0.0}; +Point(545 )={ 7526.40323360 , -8956.16918856 ,0.0}; +Point(546 )={ 8160.33129976 , -8886.28868251 ,0.0}; +Point(547 )={ 8898.65123298 , -8652.58239454 ,0.0}; +Point(548 )={ 9678.15008900 , -8241.81216452 ,0.0}; +Point(549 )={ 10451.24612292 , -7653.80492735 ,0.0}; +Point(550 )={ 11170.59960676 , -6894.26820836 ,0.0}; +Point(551 )={ 11790.64622375 , -5973.42078354 ,0.0}; +Point(552 )={ 12281.59712634 , -4908.22636556 ,0.0}; +Point(553 )={ 12664.22443949 , -3738.46113882 ,0.0}; +Point(554 )={ 12997.10615493 , -2514.10644962 ,0.0}; +Point(555 )={ 13278.70447097 , -1265.92430629 ,0.0}; +Point(556 )={ 13399.75299967 , 0.00068560 ,0.0}; +Point(557 )={ 13278.70427508 , 1265.92548160 ,0.0}; +Point(558 )={ 12997.10586110 , 2514.10762494 ,0.0}; +Point(559 )={ 12664.22404772 , 3738.46241208 ,0.0}; +Point(560 )={ 12281.59663663 , 4908.22763882 ,0.0}; +Point(561 )={ 11790.64553815 , 5973.42195885 ,0.0}; +Point(562 )={ 11170.59872528 , 6894.26928573 ,0.0}; +Point(563 )={ 10451.24524144 , 7653.80580883 ,0.0}; +Point(564 )={ 9678.14881575 , 8241.81294807 ,0.0}; +Point(565 )={ 8898.64995972 , 8652.58288425 ,0.0}; +Point(566 )={ 8160.33022239 , 8886.28956399 ,0.0}; +Point(567 )={ 7526.40254800 , 8956.16918856 ,0.0}; +Point(568 )={ 7064.45156276 , 8910.25237524 ,0.0}; +Point(569 )={ 6793.42922050 , 8836.30860946 ,0.0}; +Point(570 )={ 6706.14553192 , 8802.98999726 ,0.0}; +Point(571 )={ 6681.09545639 , 8792.66887094 ,0.0}; +Point(572 )={ 6656.75115750 , 8782.17399389 ,0.0}; +Point(573 )={ 6623.00678745 , 8766.68255910 ,0.0}; +Point(574 )={ 6468.27363388 , 8689.75613777 ,0.0}; +Point(575 )={ 6205.00592182 , 8518.88581177 ,0.0}; +Point(576 )={ 5853.56559130 , 8209.05515699 ,0.0}; +Point(577 )={ 5462.22390534 , 7746.00407695 ,0.0}; +Point(578 )={ 5070.65557947 , 7152.75405353 ,0.0}; +Point(579 )={ 4698.97514992 , 6457.90275256 ,0.0}; +Point(580 )={ 4356.79845607 , 5682.99448091 ,0.0}; +Point(581 )={ 4052.57953848 , 4841.42567443 ,0.0}; +Point(582 )={ 3794.30642532 , 3943.35977137 ,0.0}; +Point(583 )={ 3588.12395705 , 2999.03993548 ,0.0}; +Point(584 )={ 3438.43447177 , 2019.35281545 ,0.0}; +Point(585 )={ 3347.89320188 , 1015.66086668 ,0.0}; +Point(586 )={ 3317.70406166 , 0.00048971 ,0.0}; +Point(587 )={ 3347.89310393 , -1015.65998519 ,0.0}; +Point(588 )={ 3438.43437383 , -2019.35203191 ,0.0}; +Point(589 )={ 3588.12376117 , -2999.03905399 ,0.0}; +Point(590 )={ 3794.30622943 , -3943.35879194 ,0.0}; +Point(591 )={ 4052.57924465 , -4841.42469501 ,0.0}; +Point(592 )={ 4356.79806430 , -5682.99350148 ,0.0}; +Point(593 )={ 4698.97466020 , -6457.90177313 ,0.0}; +Point(594 )={ 5070.65499181 , -7152.75317205 ,0.0}; +Point(595 )={ 5462.22331768 , -7746.00329340 ,0.0}; +Point(596 )={ 5853.56480776 , -8209.05437345 ,0.0}; +Point(597 )={ 6205.00504034 , -8518.88512617 ,0.0}; +Point(598 )={ 6468.28137137 , -8689.76025137 ,0.0}; +Point(599 )={ 6622.94576901 , -8766.65454743 ,0.0}; +Point(600 )={ 6656.90835587 , -8782.24617782 ,0.0}; +Point(601 )={ 6582.97683296 , -9024.44264728 ,0.0}; +Point(602 )={ 6607.30144533 , -9034.56720217 ,0.0}; +Point(603 )={ 6717.61905456 , -9074.51958587 ,0.0}; +Point(604 )={ 7024.58017785 , -9150.78665550 ,0.0}; +Point(605 )={ 7533.43573070 , -9174.90313918 ,0.0}; +Point(606 )={ 8202.28994610 , -9063.21991190 ,0.0}; +Point(607 )={ 8958.00914414 , -8787.65713204 ,0.0}; +Point(608 )={ 9744.33981223 , -8342.63126997 ,0.0}; +Point(609 )={ 10517.17286943 , -7725.83116675 ,0.0}; +Point(610 )={ 11234.04967081 , -6944.34220866 ,0.0}; +Point(611 )={ 11848.27123093 , -6005.35800888 ,0.0}; +Point(612 )={ 12330.45702628 , -4927.12866233 ,0.0}; +Point(613 )={ 12704.74489209 , -3750.45561982 ,0.0}; +Point(614 )={ 13033.32515064 , -2523.07596373 ,0.0}; +Point(615 )={ 13315.89094678 , -1271.88354494 ,0.0}; +Point(616 )={ 13438.71606199 , 0.00068560 ,0.0}; +Point(617 )={ 13315.89075089 , 1271.88462231 ,0.0}; +Point(618 )={ 13033.32485681 , 2523.07713904 ,0.0}; +Point(619 )={ 12704.74459826 , 3750.45679514 ,0.0}; +Point(620 )={ 12330.45653657 , 4927.12993559 ,0.0}; +Point(621 )={ 11848.27064328 , 6005.35918420 ,0.0}; +Point(622 )={ 11234.04878932 , 6944.34328603 ,0.0}; +Point(623 )={ 10517.17189000 , 7725.83195030 ,0.0}; +Point(624 )={ 9744.33873486 , 8342.63205351 ,0.0}; +Point(625 )={ 8958.00796882 , 8787.65781764 ,0.0}; +Point(626 )={ 8202.28867285 , 9063.22069544 ,0.0}; +Point(627 )={ 7533.43475127 , 9174.90323712 ,0.0}; +Point(628 )={ 7024.57557453 , 9150.78587196 ,0.0}; +Point(629 )={ 6717.65304075 , 9074.53114313 ,0.0}; +Point(630 )={ 6607.07970257 , 9034.48218772 ,0.0}; +Point(631 )={ 6582.75499226 , 9024.34695705 ,0.0}; +Point(632 )={ 6558.65320003 , 9013.94914143 ,0.0}; +Point(633 )={ 6516.90708980 , 8995.12030185 ,0.0}; +Point(634 )={ 6342.58985884 , 8902.11116435 ,0.0}; +Point(635 )={ 6059.04629859 , 8702.78097822 ,0.0}; +Point(636 )={ 5699.95936890 , 8352.35651160 ,0.0}; +Point(637 )={ 5315.10679275 , 7851.43913398 ,0.0}; +Point(638 )={ 4936.55175007 , 7229.90378471 ,0.0}; +Point(639 )={ 4576.92564464 , 6515.82952187 ,0.0}; +Point(640 )={ 4244.42806131 , 5727.11355205 ,0.0}; +Point(641 )={ 3947.86240301 , 4874.76955591 ,0.0}; +Point(642 )={ 3695.60954693 , 3967.91376604 ,0.0}; +Point(643 )={ 3493.76124849 , 3016.28356900 ,0.0}; +Point(644 )={ 3347.39604364 , 2030.24739753 ,0.0}; +Point(645 )={ 3258.89443493 , 1020.92617978 ,0.0}; +Point(646 )={ 3229.04594016 , 0.00048971 ,0.0}; +Point(647 )={ 3258.89433699 , -1020.92539624 ,0.0}; +Point(648 )={ 3347.39594570 , -2030.24661399 ,0.0}; +Point(649 )={ 3493.76115054 , -3016.28258957 ,0.0}; +Point(650 )={ 3695.60925310 , -3967.91288456 ,0.0}; +Point(651 )={ 3947.86210918 , -4874.76857648 ,0.0}; +Point(652 )={ 4244.42766954 , -5727.11267056 ,0.0}; +Point(653 )={ 4576.92515492 , -6515.82854244 ,0.0}; +Point(654 )={ 4936.55116241 , -7229.90280528 ,0.0}; +Point(655 )={ 5315.10620509 , -7851.43835044 ,0.0}; +Point(656 )={ 5699.95868330 , -8352.35572806 ,0.0}; +Point(657 )={ 6059.04551505 , -8702.78029262 ,0.0}; +Point(658 )={ 6342.59593130 , -8902.11459235 ,0.0}; +Point(659 )={ 6516.79455340 , -8995.06594353 ,0.0}; +Point(660 )={ 6558.86789089 , -9014.04179543 ,0.0}; +Point(661 )={ 6490.82812396 , -9246.52683321 ,0.0}; +Point(662 )={ 6513.21601315 , -9255.60565161 ,0.0}; +Point(663 )={ 6649.21209965 , -9305.43518639 ,0.0}; +Point(664 )={ 6997.11404652 , -9377.32900698 ,0.0}; +Point(665 )={ 7550.56477101 , -9370.28025136 ,0.0}; +Point(666 )={ 8246.13663800 , -9215.36404248 ,0.0}; +Point(667 )={ 9012.97010407 , -8901.79206634 ,0.0}; +Point(668 )={ 9802.22182163 , -8426.21545881 ,0.0}; +Point(669 )={ 10574.59425330 , -7786.35969162 ,0.0}; +Point(670 )={ 11288.48771352 , -6986.11907296 ,0.0}; +Point(671 )={ 11897.61898453 , -6031.98036201 ,0.0}; +Point(672 )={ 12372.18687798 , -4942.83586537 ,0.0}; +Point(673 )={ 12738.70160237 , -3760.29878472 ,0.0}; +Point(674 )={ 13063.79842325 , -2530.57045755 ,0.0}; +Point(675 )={ 13347.35736054 , -1276.94523473 ,0.0}; +Point(676 )={ 13471.81459647 , 0.00068560 ,0.0}; +Point(677 )={ 13347.35716465 , 1276.94641004 ,0.0}; +Point(678 )={ 13063.79812942 , 2530.57163287 ,0.0}; +Point(679 )={ 12738.70121060 , 3760.29996003 ,0.0}; +Point(680 )={ 12372.18648621 , 4942.83713862 ,0.0}; +Point(681 )={ 11897.61839687 , 6031.98153732 ,0.0}; +Point(682 )={ 11288.48683203 , 6986.12015033 ,0.0}; +Point(683 )={ 10574.59327387 , 7786.36067105 ,0.0}; +Point(684 )={ 9802.22064631 , 8426.21634030 ,0.0}; +Point(685 )={ 9012.96883081 , 8901.79275194 ,0.0}; +Point(686 )={ 8246.13516886 , 9215.36443425 ,0.0}; +Point(687 )={ 7550.56349775 , 9370.28044725 ,0.0}; +Point(688 )={ 6997.11032469 , 9377.32851727 ,0.0}; +Point(689 )={ 6649.24422492 , 9305.44576423 ,0.0}; +Point(690 )={ 6512.97076410 , 9255.50614161 ,0.0}; +Point(691 )={ 6490.57641068 , 9246.42467875 ,0.0}; +Point(692 )={ 6467.53602580 , 9237.08131654 ,0.0}; +Point(693 )={ 6411.40729250 , 9211.48912698 ,0.0}; +Point(694 )={ 6215.71637122 , 9100.40188234 ,0.0}; +Point(695 )={ 5915.13975472 , 8867.44387823 ,0.0}; +Point(696 )={ 5554.79376887 , 8474.88995282 ,0.0}; +Point(697 )={ 5181.45663492 , 7939.24358503 ,0.0}; +Point(698 )={ 4817.10341270 , 7294.09488484 ,0.0}; +Point(699 )={ 4469.33554967 , 6564.32575977 ,0.0}; +Point(700 )={ 4146.31453091 , 5764.10051814 ,0.0}; +Point(701 )={ 3856.57196776 , 4902.87760509 ,0.0}; +Point(702 )={ 3609.43016470 , 3988.73025912 ,0.0}; +Point(703 )={ 3411.61192333 , 3030.88705334 ,0.0}; +Point(704 )={ 3268.18510385 , 2039.47665625 ,0.0}; +Point(705 )={ 3181.30856396 , 1025.40667632 ,0.0}; +Point(706 )={ 3151.98994036 , 0.00058766 ,0.0}; +Point(707 )={ 3181.30856396 , -1025.40579483 ,0.0}; +Point(708 )={ 3268.18500591 , -2039.47587270 ,0.0}; +Point(709 )={ 3411.61172745 , -3030.88617186 ,0.0}; +Point(710 )={ 3609.42996881 , -3988.72937764 ,0.0}; +Point(711 )={ 3856.57167393 , -4902.87662566 ,0.0}; +Point(712 )={ 4146.31413914 , -5764.09953871 ,0.0}; +Point(713 )={ 4469.33515790 , -6564.32468239 ,0.0}; +Point(714 )={ 4817.10292298 , -7294.09400335 ,0.0}; +Point(715 )={ 5181.45604727 , -7939.24270355 ,0.0}; +Point(716 )={ 5554.79318121 , -8474.88916927 ,0.0}; +Point(717 )={ 5915.13906912 , -8867.44329057 ,0.0}; +Point(718 )={ 6215.71823214 , -9100.40315559 ,0.0}; +Point(719 )={ 6411.26096579 , -9211.42213403 ,0.0}; +Point(720 )={ 6467.79900252 , -9237.18787843 ,0.0}; +Point(721 )={ 6401.70869135 , -9460.32651777 ,0.0}; +Point(722 )={ 6422.27141434 , -9468.67644500 ,0.0}; +Point(723 )={ 6590.38239462 , -9526.56237211 ,0.0}; +Point(724 )={ 6983.30771956 , -9585.76631701 ,0.0}; +Point(725 )={ 7575.29760944 , -9540.35390970 ,0.0}; +Point(726 )={ 8289.16021765 , -9343.29443208 ,0.0}; +Point(727 )={ 9062.40639806 , -8996.96799492 ,0.0}; +Point(728 )={ 9852.87182420 , -8496.16256605 ,0.0}; +Point(729 )={ 10623.47854102 , -7836.35670879 ,0.0}; +Point(730 )={ 11334.12578131 , -7020.31682075 ,0.0}; +Point(731 )={ 11938.95853371 , -6053.77834103 ,0.0}; +Point(732 )={ 12406.75024668 , -4955.54121603 ,0.0}; +Point(733 )={ 12767.30984602 , -3768.44430509 ,0.0}; +Point(734 )={ 13089.20892870 , -2536.78395601 ,0.0}; +Point(735 )={ 13373.59450418 , -1281.18097192 ,0.0}; +Point(736 )={ 13499.42000262 , 0.00068560 ,0.0}; +Point(737 )={ 13373.59430829 , 1281.18214724 ,0.0}; +Point(738 )={ 13089.20863487 , 2536.78513132 ,0.0}; +Point(739 )={ 12767.30945425 , 3768.44557835 ,0.0}; +Point(740 )={ 12406.74985490 , 4955.54248929 ,0.0}; +Point(741 )={ 11938.95784811 , 6053.77951634 ,0.0}; +Point(742 )={ 11334.12499777 , 7020.31789813 ,0.0}; +Point(743 )={ 10623.47756160 , 7836.35778616 ,0.0}; +Point(744 )={ 9852.87064889 , 8496.16344753 ,0.0}; +Point(745 )={ 9062.40512480 , 8996.96858258 ,0.0}; +Point(746 )={ 8289.15884645 , 9343.29501974 ,0.0}; +Point(747 )={ 7575.29623824 , 9540.35420352 ,0.0}; +Point(748 )={ 6983.30487921 , 9585.76621907 ,0.0}; +Point(749 )={ 6590.40981864 , 9526.57050137 ,0.0}; +Point(750 )={ 6422.02361876 , 9468.57585763 ,0.0}; +Point(751 )={ 6401.42181655 , 9460.21006365 ,0.0}; +Point(752 )={ 6379.76360207 , 9450.19197270 ,0.0}; +Point(753 )={ 6306.05636843 , 9414.84652984 ,0.0}; +Point(754 )={ 6088.38823260 , 9283.08686614 ,0.0}; +Point(755 )={ 5775.47169044 , 9010.75816130 ,0.0}; +Point(756 )={ 5421.34361047 , 8576.40435501 ,0.0}; +Point(757 )={ 5062.39967743 , 8011.13965831 ,0.0}; +Point(758 )={ 4712.74886189 , 7346.73185531 ,0.0}; +Point(759 )={ 4376.40809656 , 6604.29263902 ,0.0}; +Point(760 )={ 4061.61633937 , 5794.88828545 ,0.0}; +Point(761 )={ 3778.15270054 , 4926.31632380 ,0.0}; +Point(762 )={ 3535.62753466 , 4006.09651717 ,0.0}; +Point(763 )={ 3341.41692258 , 3043.06429582 ,0.0}; +Point(764 )={ 3200.34563018 , 2047.20190357 ,0.0}; +Point(765 )={ 3114.95782258 , 1029.15455986 ,0.0}; +Point(766 )={ 3086.16015734 , 0.00058766 ,0.0}; +Point(767 )={ 3114.95772464 , -1029.15377632 ,0.0}; +Point(768 )={ 3200.34553224 , -2047.20102209 ,0.0}; +Point(769 )={ 3341.41672670 , -3043.06331639 ,0.0}; +Point(770 )={ 3535.62733878 , -4006.09553775 ,0.0}; +Point(771 )={ 3778.15240671 , -4926.31534437 ,0.0}; +Point(772 )={ 4061.61594760 , -5794.88740396 ,0.0}; +Point(773 )={ 4376.40760685 , -6604.29165959 ,0.0}; +Point(774 )={ 4712.74837218 , -7346.73087588 ,0.0}; +Point(775 )={ 5062.39918772 , -8011.13877682 ,0.0}; +Point(776 )={ 5421.34302282 , -8576.40347352 ,0.0}; +Point(777 )={ 5775.47100484 , -9010.75747570 ,0.0}; +Point(778 )={ 6088.38460872 , -9283.08431963 ,0.0}; +Point(779 )={ 6305.89740708 , -9414.76768580 ,0.0}; +Point(780 )={ 6380.09455118 , -9450.34770194 ,0.0}; +Point(781 )={ 6314.98670537 , -9662.35924272 ,0.0}; +Point(782 )={ 6335.54090733 , -9671.27665120 ,0.0}; +Point(783 )={ 6544.14325117 , -9735.74062028 ,0.0}; +Point(784 )={ 6982.53514585 , -9773.86773984 ,0.0}; +Point(785 )={ 7604.57010193 , -9683.84733036 ,0.0}; +Point(786 )={ 8328.82504095 , -9447.51352784 ,0.0}; +Point(787 )={ 9104.80196774 , -9073.76797195 ,0.0}; +Point(788 )={ 9895.23242827 , -8552.55505960 ,0.0}; +Point(789 )={ 10663.88782842 , -7876.65101120 ,0.0}; +Point(790 )={ 11371.95084492 , -7048.10626164 ,0.0}; +Point(791 )={ 11973.03904384 , -6071.40953466 ,0.0}; +Point(792 )={ 12435.42910716 , -4965.87536876 ,0.0}; +Point(793 )={ 12790.42643049 , -3774.92812599 ,0.0}; +Point(794 )={ 13110.00093605 , -2541.84437254 ,0.0}; +Point(795 )={ 13395.09297377 , -1284.66254868 ,0.0}; +Point(796 )={ 13522.14971257 , 0.00068560 ,0.0}; +Point(797 )={ 13395.09277788 , 1284.66372399 ,0.0}; +Point(798 )={ 13110.00064222 , 2541.84554785 ,0.0}; +Point(799 )={ 12790.42603872 , 3774.92930130 ,0.0}; +Point(800 )={ 12435.42871539 , 4965.87654407 ,0.0}; +Point(801 )={ 11973.03845619 , 6071.41070998 ,0.0}; +Point(802 )={ 11371.95006138 , 7048.10743696 ,0.0}; +Point(803 )={ 10663.88684899 , 7876.65199063 ,0.0}; +Point(804 )={ 9895.23125295 , 8552.55594109 ,0.0}; +Point(805 )={ 9104.80069448 , 9073.76865755 ,0.0}; +Point(806 )={ 8328.82366975 , 9447.51411550 ,0.0}; +Point(807 )={ 7604.56863279 , 9683.84762419 ,0.0}; +Point(808 )={ 6982.53299111 , 9773.86783778 ,0.0}; +Point(809 )={ 6544.16519038 , 9735.74512566 ,0.0}; +Point(810 )={ 6335.28057507 , 9671.17861034 ,0.0}; +Point(811 )={ 6314.63156437 , 9662.20067314 ,0.0}; +Point(812 )={ 6293.50038071 , 9652.76886848 ,0.0}; +Point(813 )={ 6199.67694583 , 9605.81856153 ,0.0}; +Point(814 )={ 5962.06224588 , 9446.55496054 ,0.0}; +Point(815 )={ 5643.84131138 , 9130.63470509 ,0.0}; +Point(816 )={ 5301.72690923 , 8658.28717749 ,0.0}; +Point(817 )={ 4960.32484589 , 8068.04351182 ,0.0}; +Point(818 )={ 4624.19994675 , 7388.91655390 ,0.0}; +Point(819 )={ 4298.17560648 , 6636.57893291 ,0.0}; +Point(820 )={ 3990.45209555 , 5819.95599070 ,0.0}; +Point(821 )={ 3712.32262369 , 4945.48727799 ,0.0}; +Point(822 )={ 3473.71830854 , 4020.33643742 ,0.0}; +Point(823 )={ 3282.47282023 , 3053.07876287 ,0.0}; +Point(824 )={ 3143.42189426 , 2053.55741925 ,0.0}; +Point(825 )={ 3059.36816709 , 1032.23114267 ,0.0}; +Point(826 )={ 3031.10145038 , 0.00048971 ,0.0}; +Point(827 )={ 3059.36816709 , -1032.23026118 ,0.0}; +Point(828 )={ 3143.42179631 , -2053.55653777 ,0.0}; +Point(829 )={ 3282.47262435 , -3053.07778344 ,0.0}; +Point(830 )={ 3473.71811265 , -4020.33545799 ,0.0}; +Point(831 )={ 3712.32232986 , -4945.48629856 ,0.0}; +Point(832 )={ 3990.45180172 , -5819.95510922 ,0.0}; +Point(833 )={ 4298.17521471 , -6636.57795348 ,0.0}; +Point(834 )={ 4624.19945703 , -7388.91567241 ,0.0}; +Point(835 )={ 4960.32435618 , -8068.04253239 ,0.0}; +Point(836 )={ 5301.72632157 , -8658.28629601 ,0.0}; +Point(837 )={ 5643.84062578 , -9130.63382361 ,0.0}; +Point(838 )={ 5962.05343102 , -9446.54771277 ,0.0}; +Point(839 )={ 6199.51230379 , -9605.73217588 ,0.0}; +Point(840 )={ 6293.92829330 , -9652.95985717 ,0.0}; +Point(841 )={ 6233.10417672 , -9853.21922772 ,0.0}; +Point(842 )={ 6256.68363940 , -9863.22380254 ,0.0}; +Point(843 )={ 6511.73707515 , -9930.86925130 ,0.0}; +Point(844 )={ 6992.89319665 , -9936.09097980 ,0.0}; +Point(845 )={ 7634.80547120 , -9799.79518799 ,0.0}; +Point(846 )={ 8364.17606656 , -9531.84991826 ,0.0}; +Point(847 )={ 9140.85543992 , -9135.94281925 ,0.0}; +Point(848 )={ 9929.99266222 , -8597.46404034 ,0.0}; +Point(849 )={ 10696.75815590 , -7908.77256511 ,0.0}; +Point(850 )={ 11402.69199140 , -7070.33421005 ,0.0}; +Point(851 )={ 12000.45542017 , -6085.37031760 ,0.0}; +Point(852 )={ 12458.12737745 , -4973.92059559 ,0.0}; +Point(853 )={ 12809.20473153 , -3780.13075563 ,0.0}; +Point(854 )={ 13126.68443405 , -2545.89000254 ,0.0}; +Point(855 )={ 13412.35688148 , -1287.46606664 ,0.0}; +Point(856 )={ 13540.41136475 , 0.00068560 ,0.0}; +Point(857 )={ 13412.35668559 , 1287.46733990 ,0.0}; +Point(858 )={ 13126.68414022 , 2545.89117785 ,0.0}; +Point(859 )={ 12809.20443770 , 3780.13193094 ,0.0}; +Point(860 )={ 12458.12698567 , 4973.92186885 ,0.0}; +Point(861 )={ 12000.45483251 , 6085.37149292 ,0.0}; +Point(862 )={ 11402.69120786 , 7070.33538537 ,0.0}; +Point(863 )={ 10696.75717647 , 7908.77364248 ,0.0}; +Point(864 )={ 9929.99148690 , 8597.46501977 ,0.0}; +Point(865 )={ 9140.85416667 , 9135.94350485 ,0.0}; +Point(866 )={ 8364.17469536 , 9531.85060386 ,0.0}; +Point(867 )={ 7634.80400206 , 9799.79557976 ,0.0}; +Point(868 )={ 6992.89133574 , 9936.09117569 ,0.0}; +Point(869 )={ 6511.75078716 , 9930.87150398 ,0.0}; +Point(870 )={ 6256.47012384 , 9863.13320534 ,0.0}; +Point(871 )={ 6232.67812504 , 9853.03842510 ,0.0}; +Point(872 )={ 6212.27602843 , 9844.38203449 ,0.0}; +Point(873 )={ 6093.15746485 , 9781.00914946 ,0.0}; +Point(874 )={ 5838.61362607 , 9587.70352990 ,0.0}; +Point(875 )={ 5523.88700092 , 9226.92404872 ,0.0}; +Point(876 )={ 5198.65717357 , 8721.93126645 ,0.0}; +Point(877 )={ 4874.27553185 , 8112.60763556 ,0.0}; +Point(878 )={ 4550.78262413 , 7422.18962264 ,0.0}; +Point(879 )={ 4233.67539851 , 6662.26984892 ,0.0}; +Point(880 )={ 3932.08889262 , 5839.97601201 ,0.0}; +Point(881 )={ 3658.30896762 , 4960.87871307 ,0.0}; +Point(882 )={ 3422.96145024 , 4031.79086119 ,0.0}; +Point(883 )={ 3234.17765913 , 3061.14112971 ,0.0}; +Point(884 )={ 3096.88079280 , 2058.66651341 ,0.0}; +Point(885 )={ 3013.86810086 , 1034.70322181 ,0.0}; +Point(886 )={ 2986.21382120 , 0.00048971 ,0.0}; +Point(887 )={ 3013.86810086 , -1034.70234033 ,0.0}; +Point(888 )={ 3096.88069486 , -2058.66572987 ,0.0}; +Point(889 )={ 3234.17746325 , -3061.14015028 ,0.0}; +Point(890 )={ 3422.96125436 , -4031.78997970 ,0.0}; +Point(891 )={ 3658.30867379 , -4960.87763570 ,0.0}; +Point(892 )={ 3932.08859879 , -5839.97513052 ,0.0}; +Point(893 )={ 4233.67510468 , -6662.26886949 ,0.0}; +Point(894 )={ 4550.78213442 , -7422.18864321 ,0.0}; +Point(895 )={ 4874.27504214 , -8112.60665613 ,0.0}; +Point(896 )={ 5198.65658591 , -8721.93028702 ,0.0}; +Point(897 )={ 5523.88621737 , -9226.92297135 ,0.0}; +Point(898 )={ 5838.61245076 , -9587.70245253 ,0.0}; +Point(899 )={ 6093.04355724 , -9780.80856237 ,0.0}; +Point(900 )={ 6212.75242277 , -9844.58409072 ,0.0}; +Point(901 )={ 6155.98862762 , -10032.67552337 ,0.0}; +Point(902 )={ 6189.96326146 , -10046.45942141 ,0.0}; +Point(903 )={ 6493.75211171 , -10109.68343321 ,0.0}; +Point(904 )={ 7011.20950097 , -10070.52477888 ,0.0}; +Point(905 )={ 7663.48922884 , -9891.45653305 ,0.0}; +Point(906 )={ 8393.37010677 , -9596.54767708 ,0.0}; +Point(907 )={ 9169.91804075 , -9184.19361221 ,0.0}; +Point(908 )={ 9958.16887967 , -8633.00683818 ,0.0}; +Point(909 )={ 10723.01831613 , -7934.02224830 ,0.0}; +Point(910 )={ 11427.07419420 , -7087.74150618 ,0.0}; +Point(911 )={ 12022.41392762 , -6096.40956136 ,0.0}; +Point(912 )={ 12476.44985217 , -4980.32939221 ,0.0}; +Point(913 )={ 12824.10361170 , -3784.21771754 ,0.0}; +Point(914 )={ 13139.78400495 , -2549.05620311 ,0.0}; +Point(915 )={ 13425.88808679 , -1289.66831306 ,0.0}; +Point(916 )={ 13554.74178424 , 0.00068560 ,0.0}; +Point(917 )={ 13425.88789091 , 1289.66948838 ,0.0}; +Point(918 )={ 13139.78371112 , 2549.05737843 ,0.0}; +Point(919 )={ 12824.10331787 , 3784.21889285 ,0.0}; +Point(920 )={ 12476.44946039 , 4980.33066547 ,0.0}; +Point(921 )={ 12022.41333997 , 6096.41063873 ,0.0}; +Point(922 )={ 11427.07341066 , 7087.74268150 ,0.0}; +Point(923 )={ 10723.01723876 , 7934.02332567 ,0.0}; +Point(924 )={ 9958.16770435 , 8633.00771966 ,0.0}; +Point(925 )={ 9169.91676749 , 9184.19429781 ,0.0}; +Point(926 )={ 8393.36873557 , 9596.54826474 ,0.0}; +Point(927 )={ 7663.48775969 , 9891.45702277 ,0.0}; +Point(928 )={ 7011.20783594 , 10070.52517065 ,0.0}; +Point(929 )={ 6493.75818417 , 10109.68382498 ,0.0}; +Point(930 )={ 6189.85875637 , 10046.41701212 ,0.0}; +Point(931 )={ 6155.48569076 , 10032.47150828 ,0.0}; +Point(932 )={ 6135.76733363 , 10024.47153108 ,0.0}; +Point(933 )={ 5986.57588807 , 9938.76756375 ,0.0}; +Point(934 )={ 5720.61611708 , 9704.87332333 ,0.0}; +Point(935 )={ 5419.95585733 , 9300.03627915 ,0.0}; +Point(936 )={ 5113.64576059 , 8769.66462700 ,0.0}; +Point(937 )={ 4804.02617278 , 8146.73839040 ,0.0}; +Point(938 )={ 4491.65781711 , 7447.86173362 ,0.0}; +Point(939 )={ 4181.74635942 , 6682.34677506 ,0.0}; +Point(940 )={ 3885.47952495 , 5855.61034551 ,0.0}; +Point(941 )={ 3615.35688630 , 4972.90169546 ,0.0}; +Point(942 )={ 3382.58272104 , 4040.76360741 ,0.0}; +Point(943 )={ 3195.69197057 , 3067.47333498 ,0.0}; +Point(944 )={ 3059.87462989 , 2062.67071356 ,0.0}; +Point(945 )={ 2977.86732196 , 1036.63152190 ,0.0}; +Point(946 )={ 2950.21088756 , 0.00048971 ,0.0}; +Point(947 )={ 2977.86732196 , -1036.63064042 ,0.0}; +Point(948 )={ 3059.87453195 , -2062.66983207 ,0.0}; +Point(949 )={ 3195.69187263 , -3067.47235555 ,0.0}; +Point(950 )={ 3382.58252516 , -4040.76262798 ,0.0}; +Point(951 )={ 3615.35659247 , -4972.90071603 ,0.0}; +Point(952 )={ 3885.47923112 , -5855.60946403 ,0.0}; +Point(953 )={ 4181.74596765 , -6682.34579563 ,0.0}; +Point(954 )={ 4491.65742534 , -7447.86075419 ,0.0}; +Point(955 )={ 4804.02568307 , -8146.73741097 ,0.0}; +Point(956 )={ 5113.64527087 , -8769.66364757 ,0.0}; +Point(957 )={ 5419.95517173 , -9300.03520178 ,0.0}; +Point(958 )={ 5720.62150394 , -9704.87949373 ,0.0}; +Point(959 )={ 5986.40536946 , -9938.64209888 ,0.0}; +Point(960 )={ 6136.28075038 , -10024.67985566 ,0.0}; +Point(961 )={ 6082.60676034 , -10200.14341048 ,0.0}; +Point(962 )={ 6138.44058752 , -10221.27978512 ,0.0}; +Point(963 )={ 6490.25339495 , -10264.67398075 ,0.0}; +Point(964 )={ 7033.10767559 , -10175.45748671 ,0.0}; +Point(965 )={ 7688.27877622 , -9960.71843166 ,0.0}; +Point(966 )={ 8417.45515077 , -9647.00943338 ,0.0}; +Point(967 )={ 9192.51435246 , -9220.63474245 ,0.0}; +Point(968 )={ 9979.78732933 , -8659.79324568 ,0.0}; +Point(969 )={ 10743.35136299 , -7953.32493570 ,0.0}; +Point(970 )={ 11445.60440584 , -7100.83794291 ,0.0}; +Point(971 )={ 12038.88567305 , -6104.61051742 ,0.0}; +Point(972 )={ 12490.47233914 , -4985.18314919 ,0.0}; +Point(973 )={ 12835.22267893 , -3787.24297826 ,0.0}; +Point(974 )={ 13149.78505382 , -2551.46775354 ,0.0}; +Point(975 )={ 13436.27160275 , -1291.36106044 ,0.0}; +Point(976 )={ 13565.69082258 , 0.00068560 ,0.0}; +Point(977 )={ 13436.27140686 , 1291.36223576 ,0.0}; +Point(978 )={ 13149.78476000 , 2551.46892885 ,0.0}; +Point(979 )={ 12835.22238510 , 3787.24415357 ,0.0}; +Point(980 )={ 12490.47194737 , 4985.18442245 ,0.0}; +Point(981 )={ 12038.88508539 , 6104.61169274 ,0.0}; +Point(982 )={ 11445.60362230 , 7100.83911822 ,0.0}; +Point(983 )={ 10743.35038356 , 7953.32601307 ,0.0}; +Point(984 )={ 9979.78615401 , 8659.79412717 ,0.0}; +Point(985 )={ 9192.51307920 , 9220.63552599 ,0.0}; +Point(986 )={ 8417.45368163 , 9647.01011898 ,0.0}; +Point(987 )={ 7688.27740502 , 9960.71901932 ,0.0}; +Point(988 )={ 7033.10610850 , 10175.45787848 ,0.0}; +Point(989 )={ 6490.25633323 , 10264.67378487 ,0.0}; +Point(990 )={ 6138.39230166 , 10221.26587723 ,0.0}; +Point(991 )={ 6081.89628245 , 10199.86466495 ,0.0}; +Point(992 )={ 6062.57841389 , 10192.11218949 ,0.0}; +Point(993 )={ 5880.68089111 , 10076.17060021 ,0.0}; +Point(994 )={ 5616.28144869 , 9793.34995660 ,0.0}; +Point(995 )={ 5332.82887741 , 9353.98921061 ,0.0}; +Point(996 )={ 5045.44791379 , 8804.83974713 ,0.0}; +Point(997 )={ 4749.40625008 , 8171.89444017 ,0.0}; +Point(998 )={ 4445.46039734 , 7467.23415637 ,0.0}; +Point(999 )={ 4141.61238956 , 6697.49207960 ,0.0}; +Point(1000)={ 3849.34720872, 5867.51520875, 0.0}; +Point(1001)={ 3581.85002782, 4982.14907361, 0.0}; +Point(1002)={ 3351.19446573, 4047.65300992, 0.0}; +Point(1003)={ 3165.83260414, 3072.32944259, 0.0}; +Point(1004)={ 3031.18068620, 2065.73857945, 0.0}; +Point(1005)={ 2949.88072199, 1038.11320230, 0.0}; +Point(1006)={ 2922.69960454, 0.00048971, 0.0}; +Point(1007)={ 2949.88062405, -1038.11222287, 0.0}; +Point(1008)={ 3031.18058825, -2065.73779590, 0.0}; +Point(1009)={ 3165.83250620, -3072.32846316, 0.0}; +Point(1010)={ 3351.19426984, -4047.65203049, 0.0}; +Point(1011)={ 3581.84973399, -4982.14809418, 0.0}; +Point(1012)={ 3849.34691489, -5867.51432726, 0.0}; +Point(1013)={ 4141.61199779, -6697.49119811, 0.0}; +Point(1014)={ 4445.46000556, -7467.23317695, 0.0}; +Point(1015)={ 4749.40576037, -8171.89336279, 0.0}; +Point(1016)={ 5045.44742408, -8804.83866976, 0.0}; +Point(1017)={ 5332.82828975, -9353.98813324, 0.0}; +Point(1018)={ 5616.28340755, -9793.35269901, 0.0}; +Point(1019)={ 5880.52418245, -10076.05718231, 0.0}; +Point(1020)={ 6063.23786353, -10192.44196328, 0.0}; +Point(1021)={ 6013.48785839, -10356.19086001, 0.0}; +Point(1022)={ 6102.92119805, -10385.90977630, 0.0}; +Point(1023)={ 6498.94768946, -10392.83189174, 0.0}; +Point(1024)={ 7054.22279661, -10251.80389010, 0.0}; +Point(1025)={ 7708.49899284, -10012.15021457, 0.0}; +Point(1026)={ 8435.66792943, -9683.61265914, 0.0}; +Point(1027)={ 9209.45877038, -9247.35572409, 0.0}; +Point(1028)={ 9995.92058404, -8679.52012384, 0.0}; +Point(1029)={ 10758.36826437, -7967.44497382, 0.0}; +Point(1030)={ 11459.33090933, -7110.46357659, 0.0}; +Point(1031)={ 12051.05899781, -6110.62666091, 0.0}; +Point(1032)={ 12500.49356426, -4988.62476524, 0.0}; +Point(1033)={ 12843.39415418, -3789.45315805, 0.0}; +Point(1034)={ 13157.18454302, -2553.24923720, 0.0}; +Point(1035)={ 13443.94376502, -1292.61345648, 0.0}; +Point(1036)={ 13573.80617653, 0.00068560, 0.0}; +Point(1037)={ 13443.94347119, 1292.61463180, 0.0}; +Point(1038)={ 13157.18424919, 2553.25051045, 0.0}; +Point(1039)={ 12843.39376241, 3789.45433337, 0.0}; +Point(1040)={ 12500.49317248, 4988.62594056, 0.0}; +Point(1041)={ 12051.05841015, 6110.62783622, 0.0}; +Point(1042)={ 11459.33012579, 7110.46465397, 0.0}; +Point(1043)={ 10758.36728494, 7967.44605119, 0.0}; +Point(1044)={ 9995.91940872, 8679.52110327, 0.0}; +Point(1045)={ 9209.45749712, 9247.35650763, 0.0}; +Point(1046)={ 8435.66655823, 9683.61334474, 0.0}; +Point(1047)={ 7708.49752369, 10012.15090018, 0.0}; +Point(1048)={ 7054.22132747, 10251.80437982, 0.0}; +Point(1049)={ 6498.94886478, 10392.83179380, 0.0}; +Point(1050)={ 6102.86683973, 10385.89577047, 0.0}; +Point(1051)={ 6012.64780202, 10355.86422040, 0.0}; +Point(1052)={ 5989.43239315, 10345.75102689, 0.0}; +Point(1053)={ 5778.46178965, 10189.08036659, 0.0}; +Point(1054)={ 5526.03763142, 9857.94370005, 0.0}; +Point(1055)={ 5265.71956816, 9390.99517764, 0.0}; +Point(1056)={ 4993.34620135, 8829.86239864, 0.0}; +Point(1057)={ 4708.19050074, 8190.06343834, 0.0}; +Point(1058)={ 4411.25305114, 7481.19258868, 0.0}; +Point(1059)={ 4111.80316991, 6708.53573079, 0.0}; +Point(1060)={ 3822.24376000, 5876.32634916, 0.0}; +Point(1061)={ 3557.07419245, 4988.91164004, 0.0}; +Point(1062)={ 3327.95417936, 4052.70627661, 0.0}; +Point(1063)={ 3143.58731984, 3075.91542649, 0.0}; +Point(1064)={ 3009.83050218, 2067.99998339, 0.0}; +Point(1065)={ 2929.20193665, 1039.19733242, 0.0}; +Point(1066)={ 2901.99476639, 0.00048971, 0.0}; +Point(1067)={ 2929.20183871, -1039.19645093, 0.0}; +Point(1068)={ 3009.83040424, -2067.99910190, 0.0}; +Point(1069)={ 3143.58722189, -3075.91454501, 0.0}; +Point(1070)={ 3327.95398348, -4052.70529718, 0.0}; +Point(1071)={ 3557.07389862, -4988.91066061, 0.0}; +Point(1072)={ 3822.24346618, -5876.32546768, 0.0}; +Point(1073)={ 4111.80277814, -6708.53484930, 0.0}; +Point(1074)={ 4411.25265936, -7481.19160925, 0.0}; +Point(1075)={ 4708.19001102, -8190.06236097, 0.0}; +Point(1076)={ 4993.34571163, -8829.86132127, 0.0}; +Point(1077)={ 5265.71898050, -9390.99400232, 0.0}; +Point(1078)={ 5526.03743553, -9857.94350417, 0.0}; +Point(1079)={ 5778.35777428, -10188.96929933, 0.0}; +Point(1080)={ 5990.22886493, -10346.00734349, 0.0}; +Point(1081)={ 5950.25415024, -10503.47437762, 0.0}; +Point(1082)={ 6083.95327952, -10539.25282610, 0.0}; +Point(1083)={ 6514.84147375, -10487.79596980, 0.0}; +Point(1084)={ 7072.70864011, -10307.05015774, 0.0}; +Point(1085)={ 7723.59513003, -10048.08684086, 0.0}; +Point(1086)={ 8448.90432658, -9709.43129271, 0.0}; +Point(1087)={ 9221.72014582, -9266.39024379, 0.0}; +Point(1088)={ 10007.50576160, -8693.54907505, 0.0}; +Point(1089)={ 10769.02318013, -7977.39430883, 0.0}; +Point(1090)={ 11469.25595450, -7117.38451671, 0.0}; +Point(1091)={ 12059.74535895, -6114.89520898, 0.0}; +Point(1092)={ 12507.61215318, -4991.05541454, 0.0}; +Point(1093)={ 12849.24105231, -3791.02827599, 0.0}; +Point(1094)={ 13162.45739773, -2554.51749999, 0.0}; +Point(1095)={ 13449.40613927, -1293.50601026, 0.0}; +Point(1096)={ 13579.59058708, 0.00068560, 0.0}; +Point(1097)={ 13449.40594338, 1293.50718557, 0.0}; +Point(1098)={ 13162.45710390, 2554.51867530, 0.0}; +Point(1099)={ 12849.24066053, 3791.02945131, 0.0}; +Point(1100)={ 12507.61176140, 4991.05658985, 0.0}; +Point(1101)={ 12059.74477129, 6114.89638429, 0.0}; +Point(1102)={ 11469.25517096, 7117.38569203, 0.0}; +Point(1103)={ 10769.02220070, 7977.39538621, 0.0}; +Point(1104)={ 10007.50458629, 8693.55005448, 0.0}; +Point(1105)={ 9221.71887256, 9266.39102734, 0.0}; +Point(1106)={ 8448.90295537, 9709.43188037, 0.0}; +Point(1107)={ 7723.59366089, 10048.08752646, 0.0}; +Point(1108)={ 7072.70717097, 10307.05064745, 0.0}; +Point(1109)={ 6514.84088609, 10487.79616568, 0.0}; +Point(1110)={ 6083.86679593, 10539.24469684, 0.0}; +Point(1111)={ 5949.92114434, 10503.33990199, 0.0}; +Point(1112)={ 5908.66239805, 10482.09549633, 0.0}; +Point(1113)={ 5688.56459236, 10270.60922339, 0.0}; +Point(1114)={ 5457.48503539, 9899.48755816, 0.0}; +Point(1115)={ 5216.42313665, 9415.59354045, 0.0}; +Point(1116)={ 4956.53964610, 8846.60818834, 0.0}; +Point(1117)={ 4678.20919538, 8202.86114918, 0.0}; +Point(1118)={ 4386.05978307, 7491.26249143, 0.0}; +Point(1119)={ 4090.08462259, 6716.47194715, 0.0}; +Point(1120)={ 3802.80581344, 5882.58235484, 0.0}; +Point(1121)={ 3539.10029656, 4993.77705223, 0.0}; +Point(1122)={ 3311.14022140, 4056.33662866, 0.0}; +Point(1123)={ 3127.71136116, 3078.45763276, 0.0}; +Point(1124)={ 2994.60674537, 2069.60095826, 0.0}; +Point(1125)={ 2914.38444705, 1039.96990612, 0.0}; +Point(1126)={ 2887.13731607, 0.00048971, 0.0}; +Point(1127)={ 2914.38434910, -1039.96892669, 0.0}; +Point(1128)={ 2994.60664743, -2069.60007677, 0.0}; +Point(1129)={ 3127.71126322, -3078.45675128, 0.0}; +Point(1130)={ 3311.14002551, -4056.33564923, 0.0}; +Point(1131)={ 3539.10000273, -4993.77607280, 0.0}; +Point(1132)={ 3802.80551961, -5882.58137541, 0.0}; +Point(1133)={ 4090.08423082, -6716.47106567, 0.0}; +Point(1134)={ 4386.05929335, -7491.26160994, 0.0}; +Point(1135)={ 4678.20880361, -8202.86007181, 0.0}; +Point(1136)={ 4956.53925433, -8846.60711096, 0.0}; +Point(1137)={ 5216.42264694, -9415.59246307, 0.0}; +Point(1138)={ 5457.48454568, -9899.48657873, 0.0}; +Point(1139)={ 5688.53383828, -10270.56554085, 0.0}; +Point(1140)={ 5909.27816515, -10481.65925859, 0.0}; +Point(1141)={ 5891.44511117, -10651.00069570, 0.0}; +Point(1142)={ 6083.65044003, -10675.11198840, 0.0}; +Point(1143)={ 6532.68216728, -10553.76395027, 0.0}; +Point(1144)={ 7087.01085205, -10344.75210711, 0.0}; +Point(1145)={ 7734.35249409, -10072.52702587, 0.0}; +Point(1146)={ 8458.15728747, -9727.12360272, 0.0}; +Point(1147)={ 9230.40689873, -9279.73075426, 0.0}; +Point(1148)={ 10015.52699242, -8703.19449320, 0.0}; +Point(1149)={ 10776.41689070, -7984.26559190, 0.0}; +Point(1150)={ 11476.14516112, -7122.17010543, 0.0}; +Point(1151)={ 12065.80626234, -6117.86150807, 0.0}; +Point(1152)={ 12512.57717331, -4992.74385243, 0.0}; +Point(1153)={ 12853.30969889, -3792.12122097, 0.0}; +Point(1154)={ 13166.07393982, -2555.38664540, 0.0}; +Point(1155)={ 13453.17645173, -1294.12246296, 0.0}; +Point(1156)={ 13583.58342585, 0.00058766, 0.0}; +Point(1157)={ 13453.17625585, 1294.12373621, 0.0}; +Point(1158)={ 13166.07364600, 2555.38782072, 0.0}; +Point(1159)={ 12853.30940506, 3792.12249423, 0.0}; +Point(1160)={ 12512.57678154, 4992.74512569, 0.0}; +Point(1161)={ 12065.80567469, 6117.86268338, 0.0}; +Point(1162)={ 11476.14427963, 7122.17128074, 0.0}; +Point(1163)={ 10776.41591127, 7984.26666927, 0.0}; +Point(1164)={ 10015.52591504, 8703.19537469, 0.0}; +Point(1165)={ 9230.40572342, 9279.73153780, 0.0}; +Point(1166)={ 8458.15591627, 9727.12428833, 0.0}; +Point(1167)={ 7734.35102494, 10072.52771147, 0.0}; +Point(1168)={ 7087.00938290, 10344.75269476, 0.0}; +Point(1169)={ 6532.68069813, 10553.76443998, 0.0}; +Point(1170)={ 6083.60754104, 10675.11766909, 0.0}; +Point(1171)={ 5891.43512099, 10651.34378973, 0.0}; +Point(1172)={ 5814.57001193, 10598.21779029, 0.0}; +Point(1173)={ 5609.96677520, 10326.59770243, 0.0}; +Point(1174)={ 5407.42513887, 9925.50295905, 0.0}; +Point(1175)={ 5181.10031860, 9431.94677494, 0.0}; +Point(1176)={ 4929.50034999, 8858.42940832, 0.0}; +Point(1177)={ 4657.26606212, 8211.59246612, 0.0}; +Point(1178)={ 4369.13769613, 7497.92652728, 0.0}; +Point(1179)={ 4075.06184464, 6721.90768093, 0.0}; +Point(1180)={ 3789.37921115, 5886.87254830, 0.0}; +Point(1181)={ 3526.62942123, 4997.13384971, 0.0}; +Point(1182)={ 3299.45700298, 4058.84612199, 0.0}; +Point(1183)={ 3116.61364548, 3080.22569825, 0.0}; +Point(1184)={ 2984.04242680, 2070.70673375, 0.0}; +Point(1185)={ 2903.95793415, 1040.51143249, 0.0}; +Point(1186)={ 2876.88161562, 0.00048971, 0.0}; +Point(1187)={ 2903.95793415, -1040.51045306, 0.0}; +Point(1188)={ 2984.04232885, -2070.70575432, 0.0}; +Point(1189)={ 3116.61354754, -3080.22471882, 0.0}; +Point(1190)={ 3299.45680709, -4058.84514257, 0.0}; +Point(1191)={ 3526.62922534, -4997.13287028, 0.0}; +Point(1192)={ 3789.37891732, -5886.87156887, 0.0}; +Point(1193)={ 4075.06145287, -6721.90670150, 0.0}; +Point(1194)={ 4369.13720641, -7497.92564580, 0.0}; +Point(1195)={ 4657.26557240, -8211.59138875, 0.0}; +Point(1196)={ 4929.49986027, -8858.42833095, 0.0}; +Point(1197)={ 5181.09982889, -9431.94569757, 0.0}; +Point(1198)={ 5407.42455122, -9925.50188167, 0.0}; +Point(1199)={ 5609.96706903, -10326.59829008, 0.0}; +Point(1200)={ 5814.47177519, -10598.15363768, 0.0}; +Point(1201)={ 7678.76450362, -17179.22714600, 0.0}; +Point(1202)={ 7680.60152091, -17159.32534179, 0.0}; +Point(1203)={ 7682.50964476, -17124.38048545, 0.0}; +Point(1204)={ 7685.22785445, -17074.59864886, 0.0}; +Point(1205)={ 7688.74880426, -17010.11440559, 0.0}; +Point(1206)={ 7687.34498848, -16930.97995921, 0.0}; +Point(1207)={ 7684.94303646, -16837.38678812, 0.0}; +Point(1208)={ 7674.63993164, -16729.94478284, 0.0}; +Point(1209)={ 7659.32430437, -16608.83993696, 0.0}; +Point(1210)={ 7636.55022627, -16474.60966326, 0.0}; +Point(1211)={ 7604.63435248, -16327.95082556, 0.0}; +Point(1212)={ 7562.78696929, -16169.51141419, 0.0}; +Point(1213)={ 7511.46635158, -15999.58065457, 0.0}; +Point(1214)={ 7451.39032297, -15818.24904594, 0.0}; +Point(1215)={ 7383.84066239, -15625.33118238, 0.0}; +Point(1216)={ 7310.62471040, -15420.37260877, 0.0}; +Point(1217)={ 7233.46841705, -15202.90672505, 0.0}; +Point(1218)={ 7154.04268845, -14972.49876265, 0.0}; +Point(1219)={ 7074.96416747, -14728.45029063, 0.0}; +Point(1220)={ 6995.06459105, -14471.33623391, 0.0}; +Point(1221)={ 6915.62289775, -14200.95247945, 0.0}; +Point(1222)={ 6834.59854490, -13918.08972040, 0.0}; +Point(1223)={ 6751.30358149, -13623.07802437, 0.0}; +Point(1224)={ 6663.15535080, -13316.82013120, 0.0}; +Point(1225)={ 6567.23819025, -13000.31378536, 0.0}; +Point(1226)={ 6463.83535074, -12673.69473572, 0.0}; +Point(1227)={ 6348.20345695, -12338.73594490, 0.0}; +Point(1228)={ 6222.82732060, -11994.90754176, 0.0}; +Point(1229)={ 6086.65003971, -11642.96887769, 0.0}; +Point(1230)={ 5939.37827526, -11283.46686593, 0.0}; +Point(1231)={ 5788.21690387, -10913.58221970, 0.0}; +Point(1232)={ 6107.42647414, -10775.00367240, 0.0}; +Point(1233)={ 6548.16870493, -10596.20300661, 0.0}; +Point(1234)={ 7097.39446594, -10370.02069328, 0.0}; +Point(1235)={ 7741.87362838, -10089.09485329, 0.0}; +Point(1236)={ 8464.55658364, -9739.20241257, 0.0}; +Point(1237)={ 9236.39875237, -9288.86608572, 0.0}; +Point(1238)={ 10020.98544895, -8709.72650201, 0.0}; +Point(1239)={ 10781.50825719, -7988.98252263, 0.0}; +Point(1240)={ 11480.89167061, -7125.45912642, 0.0}; +Point(1241)={ 12070.01868912, -6119.91752571, 0.0}; +Point(1242)={ 12516.02995485, -4993.91485791, 0.0}; +Point(1243)={ 12856.10332462, -3792.87028837, 0.0}; +Point(1244)={ 13168.55630298, -2555.98292186, 0.0}; +Point(1245)={ 13455.76429940, -1294.54587017, 0.0}; +Point(1246)={ 13586.32406447, 0.00058766, 0.0}; +Point(1247)={ 13455.76400557, 1294.54704549, 0.0}; +Point(1248)={ 13168.55600915, 2555.98419512, 0.0}; +Point(1249)={ 12856.10303079, 3792.87156163, 0.0}; +Point(1250)={ 12516.02956308, 4993.91613116, 0.0}; +Point(1251)={ 12070.01810147, 6119.91870103, 0.0}; +Point(1252)={ 11480.89088707, 7125.46020379, 0.0}; +Point(1253)={ 10781.50727776, 7988.98360000, 0.0}; +Point(1254)={ 10020.98437157, 8709.72738350, 0.0}; +Point(1255)={ 9236.39747912, 9288.86686926, 0.0}; +Point(1256)={ 8464.55521244, 9739.20309817, 0.0}; +Point(1257)={ 7741.87215924, 10089.09544094, 0.0}; +Point(1258)={ 7097.39289886, 10370.02128093, 0.0}; +Point(1259)={ 6548.16713784, 10596.20369221, 0.0}; +Point(1260)={ 6107.42480911, 10775.00455388, 0.0}; +Point(1261)={ 5788.21690387, 10913.58221970, 0.0}; +Point(1262)={ 5939.37827526, 11283.46686593, 0.0}; +Point(1263)={ 6086.65003971, 11642.96887769, 0.0}; +Point(1264)={ 6222.82732060, 11994.90754176, 0.0}; +Point(1265)={ 6348.20345695, 12338.73594490, 0.0}; +Point(1266)={ 6463.83535074, 12673.69473572, 0.0}; +Point(1267)={ 6567.23819025, 13000.31378536, 0.0}; +Point(1268)={ 6663.15535080, 13316.82013120, 0.0}; +Point(1269)={ 6751.30358149, 13623.07802437, 0.0}; +Point(1270)={ 6834.59854490, 13918.08972040, 0.0}; +Point(1271)={ 6915.62289775, 14200.95247945, 0.0}; +Point(1272)={ 6995.06449311, 14471.33623391, 0.0}; +Point(1273)={ 7074.96416747, 14728.45029063, 0.0}; +Point(1274)={ 7154.04268845, 14972.49876265, 0.0}; +Point(1275)={ 7233.46841705, 15202.90672505, 0.0}; +Point(1276)={ 7310.62471040, 15420.37260877, 0.0}; +Point(1277)={ 7383.84056444, 15625.33118238, 0.0}; +Point(1278)={ 7451.39032297, 15818.24904594, 0.0}; +Point(1279)={ 7511.46635158, 15999.58065457, 0.0}; +Point(1280)={ 7562.78696929, 16169.51141419, 0.0}; +Point(1281)={ 7604.63435248, 16327.95082556, 0.0}; +Point(1282)={ 7636.55022627, 16474.60966326, 0.0}; +Point(1283)={ 7659.32430437, 16608.83993696, 0.0}; +Point(1284)={ 7674.63993164, 16729.94478284, 0.0}; +Point(1285)={ 7684.94303646, 16837.38678812, 0.0}; +Point(1286)={ 7687.34498848, 16930.97995921, 0.0}; +Point(1287)={ 7688.74880426, 17010.11440559, 0.0}; +Point(1288)={ 7685.22785445, 17074.59864886, 0.0}; +Point(1289)={ 7682.50964476, 17124.38048545, 0.0}; +Point(1290)={ 7680.60152091, 17159.32534179, 0.0}; +Point(1291)={ 7678.76450362, 17179.22714600, 0.0}; +Point(1292)={ 7683.44558725, -17183.90822962, 0.0}; +Point(1293)={ 7685.67467002, -17164.26019551, 0.0}; +Point(1294)={ 7687.53538950, -17129.74667976, 0.0}; +Point(1295)={ 7690.18484326, -17080.60538982, 0.0}; +Point(1296)={ 7693.61627325, -17016.96002761, 0.0}; +Point(1297)={ 7692.74183891, -16938.85917280, 0.0}; +Point(1298)={ 7690.31706620, -16846.44925005, 0.0}; +Point(1299)={ 7680.76616295, -16740.25523338, 0.0}; +Point(1300)={ 7666.10998533, -16620.40963954, 0.0}; +Point(1301)={ 7644.22238854, -16487.30404432, 0.0}; +Point(1302)={ 7612.54755226, -16341.68790689, 0.0}; +Point(1303)={ 7571.35462362, -16183.83948306, 0.0}; +Point(1304)={ 7520.55584576, -16014.02214133, 0.0}; +Point(1305)={ 7460.82682889, -15832.26957406, 0.0}; +Point(1306)={ 7393.24778543, -15638.49588532, 0.0}; +Point(1307)={ 7319.68109988, -15432.35690370, 0.0}; +Point(1308)={ 7242.09591451, -15213.47447163, 0.0}; +Point(1309)={ 7162.05010931, -14981.63781594, 0.0}; +Point(1310)={ 7082.63838654, -14736.11451953, 0.0}; +Point(1311)={ 7002.83949544, -14477.52416927, 0.0}; +Point(1312)={ 6923.78869231, -14205.75540406, 0.0}; +Point(1313)={ 6843.08706136, -13921.69108134, 0.0}; +Point(1314)={ 6760.55066581, -13625.49731228, 0.0}; +Point(1315)={ 6673.43847527, -13318.05959878, 0.0}; +Point(1316)={ 6579.96900608, -13000.00585284, 0.0}; +Point(1317)={ 6478.05245028, -12672.12510258, 0.0}; +Point(1318)={ 6367.42426407, -12334.72195047, 0.0}; +Point(1319)={ 6249.33400314, -11987.63263595, 0.0}; +Point(1320)={ 6126.62779063, -11630.61298734, 0.0}; +Point(1321)={ 6020.30370576, -11265.04125732, 0.0}; +Point(1322)={ 6039.07231046, -11014.12777059, 0.0}; +Point(1323)={ 6163.65432566, -10860.93927471, 0.0}; +Point(1324)={ 6567.32447796, -10633.69359517, 0.0}; +Point(1325)={ 7108.08150699, -10391.08351278, 0.0}; +Point(1326)={ 7749.44353825, -10103.06738938, 0.0}; +Point(1327)={ 8470.77977844, -9749.38318670, 0.0}; +Point(1328)={ 9242.03291849, -9296.55058879, 0.0}; +Point(1329)={ 10026.00619860, -8715.20846484, 0.0}; +Point(1330)={ 10786.10883174, -7992.93285417, 0.0}; +Point(1331)={ 11485.12985638, -7128.20534778, 0.0}; +Point(1332)={ 12073.75070591, -6121.62016533, 0.0}; +Point(1333)={ 12519.06363866, -4994.86764657, 0.0}; +Point(1334)={ 12858.55101598, -3793.47812210, 0.0}; +Point(1335)={ 13170.72730560, -2556.47567266, 0.0}; +Point(1336)={ 13458.02266711, -1294.90208855, 0.0}; +Point(1337)={ 13588.71338185, 0.00058766, 0.0}; +Point(1338)={ 13458.02247122, 1294.90336181, 0.0}; +Point(1339)={ 13170.72701178, 2556.47684798, 0.0}; +Point(1340)={ 12858.55072215, 3793.47939535, 0.0}; +Point(1341)={ 12519.06324689, 4994.86891983, 0.0}; +Point(1342)={ 12073.75011826, 6121.62134064, 0.0}; +Point(1343)={ 11485.12907284, 7128.20642515, 0.0}; +Point(1344)={ 10786.10785231, 7992.93383360, 0.0}; +Point(1345)={ 10026.00512122, 8715.20944427, 0.0}; +Point(1346)={ 9242.03164523, 9296.55137234, 0.0}; +Point(1347)={ 8470.77830929, 9749.38397024, 0.0}; +Point(1348)={ 7749.44197116, 10103.06817292, 0.0}; +Point(1349)={ 7108.08003784, 10391.08410044, 0.0}; +Point(1350)={ 6567.32300882, 10633.69437871, 0.0}; +Point(1351)={ 6163.65275857, 10860.94045003, 0.0}; +Point(1352)={ 6039.07240840, 11014.12737882, 0.0}; +Point(1353)={ 6020.30380371, 11265.04145321, 0.0}; +Point(1354)={ 6126.62788857, 11630.61328117, 0.0}; +Point(1355)={ 6249.33419903, 11987.63312566, 0.0}; +Point(1356)={ 6367.42445996, 12334.72244018, 0.0}; +Point(1357)={ 6478.05264617, 12672.12578818, 0.0}; +Point(1358)={ 6579.96929991, 13000.00673432, 0.0}; +Point(1359)={ 6673.43876910, 13318.06067615, 0.0}; +Point(1360)={ 6760.55105758, 13625.49868349, 0.0}; +Point(1361)={ 6843.08755108, 13921.69294226, 0.0}; +Point(1362)={ 6923.78937791, 14205.75775469, 0.0}; +Point(1363)={ 7002.84037692, 14477.52720550, 0.0}; +Point(1364)={ 7082.63965980, 14736.11833930, 0.0}; +Point(1365)={ 7162.05167640, 14981.64271309, 0.0}; +Point(1366)={ 7242.09806925, 15213.48054409, 0.0}; +Point(1367)={ 7319.68374433, 15432.36434737, 0.0}; +Point(1368)={ 7393.25091961, 15638.50489607, 0.0}; +Point(1369)={ 7460.83025690, 15832.28015189, 0.0}; +Point(1370)={ 7520.55946964, 16014.03428625, 0.0}; +Point(1371)={ 7571.35814956, 16183.85299918, 0.0}; +Point(1372)={ 7612.55078438, 16341.70250038, 0.0}; +Point(1373)={ 7644.22581654, 16487.31951930, 0.0}; +Point(1374)={ 7666.11262978, 16620.42570218, 0.0}; +Point(1375)={ 7680.76782798, 16740.27188367, 0.0}; +Point(1376)={ 7690.31745797, 16846.46619417, 0.0}; +Point(1377)={ 7692.74232863, 16938.87631281, 0.0}; +Point(1378)={ 7693.61539176, 17016.97716762, 0.0}; +Point(1379)={ 7690.18396178, 17080.62262778, 0.0}; +Point(1380)={ 7687.53450801, 17129.76391771, 0.0}; +Point(1381)={ 7685.67369059, 17164.27743346, 0.0}; +Point(1382)={ 7683.46586143, 17183.92850380, 0.0}; +Point(1383)={ 7696.45123089, -17196.91387326, 0.0}; +Point(1384)={ 7699.19157568, -17177.54664148, 0.0}; +Point(1385)={ 7701.57844449, -17143.49100885, 0.0}; +Point(1386)={ 7704.10478401, -17094.91475159, 0.0}; +Point(1387)={ 7707.37715470, -17031.99367723, 0.0}; +Point(1388)={ 7707.59870157, -16954.78997951, 0.0}; +Point(1389)={ 7705.05463438, -16863.40003426, 0.0}; +Point(1390)={ 7696.69040749, -16758.26233191, 0.0}; +Point(1391)={ 7683.15058319, -16639.48314053, 0.0}; +Point(1392)={ 7661.67170219, -16507.52886426, 0.0}; +Point(1393)={ 7630.71772575, -16362.93985416, 0.0}; +Point(1394)={ 7590.43840861, -16205.83951831, 0.0}; +Point(1395)={ 7540.46068619, -16036.36497677, 0.0}; +Point(1396)={ 7481.24498814, -15854.42857066, 0.0}; +Point(1397)={ 7413.83734478, -15659.83167172, 0.0}; +Point(1398)={ 7339.99573346, -15452.27359523, 0.0}; +Point(1399)={ 7262.00917803, -15231.40791710, 0.0}; +Point(1400)={ 7181.49500983, -14997.27107208, 0.0}; +Point(1401)={ 7101.46683436, -14749.40243465, 0.0}; +Point(1402)={ 7022.16578708, -14488.20758642, 0.0}; +Point(1403)={ 6944.12663631, -14213.89896558, 0.0}; +Point(1404)={ 6865.78170776, -13927.13729501, 0.0}; +Point(1405)={ 6785.24589416, -13628.56860618, 0.0}; +Point(1406)={ 6701.83516222, -13318.41846161, 0.0}; +Point(1407)={ 6613.34560049, -12997.34611507, 0.0}; +Point(1408)={ 6519.52392858, -12665.53021442, 0.0}; +Point(1409)={ 6419.59316536, -12323.61845615, 0.0}; +Point(1410)={ 6320.14006973, -11970.66294875, 0.0}; +Point(1411)={ 6233.89810198, -11609.21353804, 0.0}; +Point(1412)={ 6211.20325970, -11267.24458111, 0.0}; +Point(1413)={ 6251.69080348, -11102.09803900, 0.0}; +Point(1414)={ 6314.09552280, -11001.71957872, 0.0}; +Point(1415)={ 6627.50520754, -10727.79812621, 0.0}; +Point(1416)={ 7138.55095982, -10448.50372134, 0.0}; +Point(1417)={ 7770.94729676, -10143.39038906, 0.0}; +Point(1418)={ 8487.89216846, -9778.07899131, 0.0}; +Point(1419)={ 9257.41240454, -9318.02320145, 0.0}; +Point(1420)={ 10039.78422006, -8730.57962574, 0.0}; +Point(1421)={ 10798.79527942, -8004.03997237, 0.0}; +Point(1422)={ 11496.59231147, -7135.75811764, 0.0}; +Point(1423)={ 12084.15655285, -6126.45462755, 0.0}; +Point(1424)={ 12527.52835499, -4997.58262414, 0.0}; +Point(1425)={ 12865.33552162, -3795.20025235, 0.0}; +Point(1426)={ 13176.74521206, -2557.86567850, 0.0}; +Point(1427)={ 13464.28641028, -1295.90267336, 0.0}; +Point(1428)={ 13595.34294180, 0.00068560, 0.0}; +Point(1429)={ 13464.28621439, 1295.90404456, 0.0}; +Point(1430)={ 13176.74482029, 2557.86695175, 0.0}; +Point(1431)={ 12865.33512985, 3795.20152561, 0.0}; +Point(1432)={ 12527.52796322, 4997.58399534, 0.0}; +Point(1433)={ 12084.15596519, 6126.45580287, 0.0}; +Point(1434)={ 11496.59152793, 7135.75939089, 0.0}; +Point(1435)={ 10798.79420205, 8004.04104974, 0.0}; +Point(1436)={ 10039.78304474, 8730.58060517, 0.0}; +Point(1437)={ 9257.41103334, 9318.02408294, 0.0}; +Point(1438)={ 8487.89060137, 9778.07987279, 0.0}; +Point(1439)={ 7770.94553378, 10143.39127055, 0.0}; +Point(1440)={ 7138.54880508, 10448.50479871, 0.0}; +Point(1441)={ 6627.50344457, 10727.79920358, 0.0}; +Point(1442)={ 6314.09424954, 11001.72153758, 0.0}; +Point(1443)={ 6251.69060759, 11102.09843077, 0.0}; +Point(1444)={ 6211.20179055, 11267.24565848, 0.0}; +Point(1445)={ 6233.89819992, 11609.21422364, 0.0}; +Point(1446)={ 6320.14085327, 11970.66539733, 0.0}; +Point(1447)={ 6419.59385096, 12323.62061090, 0.0}; +Point(1448)={ 6519.52481006, 12665.53315271, 0.0}; +Point(1449)={ 6613.34648197, 12997.34934718, 0.0}; +Point(1450)={ 6701.83623960, 13318.42237933, 0.0}; +Point(1451)={ 6785.24755919, 13628.57477658, 0.0}; +Point(1452)={ 6865.78366661, 13927.14444484, 0.0}; +Point(1453)={ 6944.12908488, 14213.90787838, 0.0}; +Point(1454)={ 7022.16941097, 14488.21963340, 0.0}; +Point(1455)={ 7101.47153562, 14749.41771374, 0.0}; +Point(1456)={ 7181.50157200, 14997.28997506, 0.0}; +Point(1457)={ 7262.01740524, 15231.43112957, 0.0}; +Point(1458)={ 7340.00552775, 15452.30150896, 0.0}; +Point(1459)={ 7413.84870616, 15659.86448260, 0.0}; +Point(1460)={ 7481.25742689, 15854.46608279, 0.0}; +Point(1461)={ 7540.47351671, 16036.40689634, 0.0}; +Point(1462)={ 7590.45045559, 16205.88525765, 0.0}; +Point(1463)={ 7630.72840153, 16362.98853179, 0.0}; +Point(1464)={ 7661.67992939, 16507.57999046, 0.0}; +Point(1465)={ 7683.15920217, 16639.53553999, 0.0}; +Point(1466)={ 7696.69579435, 16758.31600463, 0.0}; +Point(1467)={ 7705.05610353, 16863.45449052, 0.0}; +Point(1468)={ 7707.60026866, 16954.84472960, 0.0}; +Point(1469)={ 7707.37431436, 17032.04852526, 0.0}; +Point(1470)={ 7704.10194366, 17094.96969757, 0.0}; +Point(1471)={ 7701.57560414, 17143.54595483, 0.0}; +Point(1472)={ 7699.20293705, 17177.60374220, 0.0}; +Point(1473)={ 7696.51587321, 17196.97851559, 0.0}; +Point(1474)={ 7717.38202335, -17217.84466572, 0.0}; +Point(1475)={ 7720.03137917, -17198.66244811, 0.0}; +Point(1476)={ 7724.16966316, -17165.11660834, 0.0}; +Point(1477)={ 7726.52450464, -17117.01694130, 0.0}; +Point(1478)={ 7729.57503464, -17054.70693277, 0.0}; +Point(1479)={ 7731.40999513, -16978.26621035, 0.0}; +Point(1480)={ 7728.65858279, -16887.74149281, 0.0}; +Point(1481)={ 7721.89033567, -16783.45579587, 0.0}; +Point(1482)={ 7709.88909661, -16665.48218495, 0.0}; +Point(1483)={ 7688.21041206, -16534.59196050, 0.0}; +Point(1484)={ 7658.46025198, -16390.77464262, 0.0}; +Point(1485)={ 7619.45340918, -16234.22317885, 0.0}; +Point(1486)={ 7570.42152148, -16065.03894012, 0.0}; +Point(1487)={ 7511.61679189, -15883.04543328, 0.0}; +Point(1488)={ 7444.35890325, -15687.76988790, 0.0}; +Point(1489)={ 7370.25059338, -15478.83326489, 0.0}; +Point(1490)={ 7291.80409802, -15255.83899341, 0.0}; +Point(1491)={ 7211.13371087, -15018.87267555, 0.0}; +Point(1492)={ 7131.10259711, -14767.84655447, 0.0}; +Point(1493)={ 7052.47667034, -14503.27120657, 0.0}; +Point(1494)={ 6975.48893675, -14225.65652267, 0.0}; +Point(1495)={ 6899.70266888, -13935.42845649, 0.0}; +Point(1496)={ 6824.01669455, -13633.07877942, 0.0}; +Point(1497)={ 6746.69517151, -13319.08770554, 0.0}; +Point(1498)={ 6667.21841464, -12993.60675256, 0.0}; +Point(1499)={ 6584.50072676, -12657.16167803, 0.0}; +Point(1500)={ 6502.65992178, -12310.08010100, 0.0}; +Point(1501)={ 6431.55463960, -11954.03851033, 0.0}; +Point(1502)={ 6396.37021489, -11602.20346986, 0.0}; +Point(1503)={ 6428.83662579, -11307.74965667, 0.0}; +Point(1504)={ 6468.76187930, -11195.72411891, 0.0}; +Point(1505)={ 6501.54748617, -11124.49043356, 0.0}; +Point(1506)={ 6733.24692384, -10853.39992303, 0.0}; +Point(1507)={ 7193.08547631, -10538.13637482, 0.0}; +Point(1508)={ 7806.27021275, -10205.88737061, 0.0}; +Point(1509)={ 8516.08533004, -9824.25643072, 0.0}; +Point(1510)={ 9282.14974834, -9352.13906897, 0.0}; +Point(1511)={ 10062.01109109, -8755.22607852, 0.0}; +Point(1512)={ 10819.18493728, -8021.83355536, 0.0}; +Point(1513)={ 11514.92174014, -7147.80852404, 0.0}; +Point(1514)={ 12100.41840661, -6133.98712323, 0.0}; +Point(1515)={ 12541.12361497, -5001.93461958, 0.0}; +Point(1516)={ 12876.25762566, -3797.97282036, 0.0}; +Point(1517)={ 13186.37074780, -2560.09446744, 0.0}; +Point(1518)={ 13474.30440328, -1297.50923097, 0.0}; +Point(1519)={ 13605.94820051, 0.00068560, 0.0}; +Point(1520)={ 13474.30410945, 1297.51050423, 0.0}; +Point(1521)={ 13186.37035603, 2560.09583864, 0.0}; +Point(1522)={ 12876.25733183, 3797.97409361, 0.0}; +Point(1523)={ 12541.12312526, 5001.93599078, 0.0}; +Point(1524)={ 12100.41772101, 6133.98849443, 0.0}; +Point(1525)={ 11514.92085865, 7147.80979730, 0.0}; +Point(1526)={ 10819.18376197, 8021.83473067, 0.0}; +Point(1527)={ 10062.00971989, 8755.22725384, 0.0}; +Point(1528)={ 9282.14837714, 9352.14004840, 0.0}; +Point(1529)={ 8516.08337118, 9824.25760604, 0.0}; +Point(1530)={ 7806.26796006, 10205.88854592, 0.0}; +Point(1531)={ 7193.08302773, 10538.13784397, 0.0}; +Point(1532)={ 6733.24506292, 10853.40158806, 0.0}; +Point(1533)={ 6501.54640880, 11124.49278419, 0.0}; +Point(1534)={ 6468.76089988, 11195.72617571, 0.0}; +Point(1535)={ 6428.83613608, 11307.75181141, 0.0}; +Point(1536)={ 6396.37011694, 11602.20611432, 0.0}; +Point(1537)={ 6431.55542314, 11954.04242805, 0.0}; +Point(1538)={ 6502.66109710, 12310.08519403, 0.0}; +Point(1539)={ 6584.50229385, 12657.16784843, 0.0}; +Point(1540)={ 6667.22017761, 12993.61439211, 0.0}; +Point(1541)={ 6746.69732625, 13319.09661835, 0.0}; +Point(1542)={ 6824.01973078, 13633.09151199, 0.0}; +Point(1543)={ 6899.70648865, 13935.44373559, 0.0}; +Point(1544)={ 6975.49373595, 14225.67483799, 0.0}; +Point(1545)={ 7052.48440783, 14503.29696556, 0.0}; +Point(1546)={ 7131.11229346, 14767.87809209, 0.0}; +Point(1547)={ 7211.14556196, 15018.90803294, 0.0}; +Point(1548)={ 7291.81927918, 15255.88306772, 0.0}; +Point(1549)={ 7370.26861487, 15478.88439109, 0.0}; +Point(1550)={ 7444.37917743, 15687.82796805, 0.0}; +Point(1551)={ 7511.63824139, 15883.10968383, 0.0}; +Point(1552)={ 7570.44277509, 16065.10847958, 0.0}; +Point(1553)={ 7619.47329159, 16234.29692986, 0.0}; +Point(1554)={ 7658.47709816, 16390.85172369, 0.0}; +Point(1555)={ 7688.22363436, 16534.67139220, 0.0}; +Point(1556)={ 7709.90241685, 16665.56269403, 0.0}; +Point(1557)={ 7721.89856288, 16783.53767615, 0.0}; +Point(1558)={ 7728.66112931, 16887.82415663, 0.0}; +Point(1559)={ 7731.41254164, 16978.34907006, 0.0}; +Point(1560)={ 7729.57092103, 17054.78979248, 0.0}; +Point(1561)={ 7726.52048898, 17117.09989895, 0.0}; +Point(1562)={ 7724.16564750, 17165.19956599, 0.0}; +Point(1563)={ 7720.08446423, 17198.75363296, 0.0}; +Point(1564)={ 7717.47918272, 17217.94182509, 0.0}; +Point(1565)={ 7746.04834714, -17246.51098952, 0.0}; +Point(1566)={ 7748.63629276, -17227.48606822, 0.0}; +Point(1567)={ 7753.15586851, -17194.26089356, 0.0}; +Point(1568)={ 7757.45938221, -17146.75152846, 0.0}; +Point(1569)={ 7760.28630853, -17084.95052925, 0.0}; +Point(1570)={ 7763.75407533, -17009.13840445, 0.0}; +Point(1571)={ 7761.18473888, -16919.34052127, 0.0}; +Point(1572)={ 7756.27466472, -16815.70937683, 0.0}; +Point(1573)={ 7743.79105681, -16698.60589075, 0.0}; +Point(1574)={ 7723.88719580, -16568.31027773, 0.0}; +Point(1575)={ 7695.74486660, -16424.96288995, 0.0}; +Point(1576)={ 7657.85232032, -16268.76970136, 0.0}; +Point(1577)={ 7609.61905914, -16099.74236718, 0.0}; +Point(1578)={ 7551.38582646, -15917.53857690, 0.0}; +Point(1579)={ 7484.24576314, -15721.57733318, 0.0}; +Point(1580)={ 7409.95537739, -15511.24492571, 0.0}; +Point(1581)={ 7330.90780637, -15286.11569459, 0.0}; +Point(1582)={ 7249.85553980, -15046.16868004, 0.0}; +Point(1583)={ 7169.28368321, -14791.75588888, 0.0}; +Point(1584)={ 7092.01230694, -14523.07976912, 0.0}; +Point(1585)={ 7017.59812135, -14241.16754605, 0.0}; +Point(1586)={ 6945.64651444, -13946.65849305, 0.0}; +Point(1587)={ 6875.55905502, -13639.98483221, 0.0}; +Point(1588)={ 6806.36698971, -13321.49680739, 0.0}; +Point(1589)={ 6737.68883086, -12991.42301735, 0.0}; +Point(1590)={ 6671.03319319, -12650.31468481, 0.0}; +Point(1591)={ 6612.48291930, -12300.19354739, 0.0}; +Point(1592)={ 6575.84796004, -11948.03216114, 0.0}; +Point(1593)={ 6583.46723313, -11620.31487760, 0.0}; +Point(1594)={ 6641.60869330, -11372.60275295, 0.0}; +Point(1595)={ 6672.18382655, -11286.72258633, 0.0}; +Point(1596)={ 6702.19226209, -11229.66564804, 0.0}; +Point(1597)={ 6873.01528166, -10985.90454054, 0.0}; +Point(1598)={ 7272.01502611, -10648.14046879, 0.0}; +Point(1599)={ 7856.24294007, -10287.07283955, 0.0}; +Point(1600)={ 8554.90892165, -9885.18740302, 0.0}; +Point(1601)={ 9315.77227741, -9397.39153551, 0.0}; +Point(1602)={ 10092.84009237, -8788.93391586, 0.0}; +Point(1603)={ 10846.50885550, -8045.42075553, 0.0}; +Point(1604)={ 11540.05163914, -7164.20632256, 0.0}; +Point(1605)={ 12122.17691463, -6143.98347084, 0.0}; +Point(1606)={ 12559.45764696, -5007.75654226, 0.0}; +Point(1607)={ 12891.06698600, -3801.71090960, 0.0}; +Point(1608)={ 13199.37276756, -2563.10337170, 0.0}; +Point(1609)={ 13487.81308173, -1299.68199657, 0.0}; +Point(1610)={ 13620.26882571, 0.00068560, 0.0}; +Point(1611)={ 13487.81278790, 1299.68336777, 0.0}; +Point(1612)={ 13199.37237579, 2563.10484084, 0.0}; +Point(1613)={ 12891.06669217, 3801.71228081, 0.0}; +Point(1614)={ 12559.45725519, 5007.75801140, 0.0}; +Point(1615)={ 12122.17622903, 6143.98493999, 0.0}; +Point(1616)={ 11540.05075766, 7164.20769376, 0.0}; +Point(1617)={ 10846.50768019, 8045.42202878, 0.0}; +Point(1618)={ 10092.83862323, 8788.93528707, 0.0}; +Point(1619)={ 9315.77051443, 9397.39271083, 0.0}; +Point(1620)={ 8554.90676691, 9885.18877422, 0.0}; +Point(1621)={ 7856.24049150, 10287.07460252, 0.0}; +Point(1622)={ 7272.01247960, 10648.14232970, 0.0}; +Point(1623)={ 6873.01312691, 10985.90698911, 0.0}; +Point(1624)={ 6702.19098883, 11229.66819456, 0.0}; +Point(1625)={ 6672.18304300, 11286.72483901, 0.0}; +Point(1626)={ 6641.60781182, 11372.60520153, 0.0}; +Point(1627)={ 6583.46693930, 11620.31889326, 0.0}; +Point(1628)={ 6575.84805798, 11948.03774388, 0.0}; +Point(1629)={ 6612.48399667, 12300.20059928, 0.0}; +Point(1630)={ 6671.03485822, 12650.32349967, 0.0}; +Point(1631)={ 6737.69108355, 12991.43398696, 0.0}; +Point(1632)={ 6806.36973211, 13321.50973586, 0.0}; +Point(1633)={ 6875.56277685, 13640.00118868, 0.0}; +Point(1634)={ 6945.65121570, 13946.67964872, 0.0}; +Point(1635)={ 7017.60429176, 14241.19252149, 0.0}; +Point(1636)={ 7092.02161152, 14523.11316766, 0.0}; +Point(1637)={ 7169.29504459, 14791.79477222, 0.0}; +Point(1638)={ 7249.87023124, 15046.21246052, 0.0}; +Point(1639)={ 7330.92553404, 15286.16711462, 0.0}; +Point(1640)={ 7409.97565157, 15511.30202643, 0.0}; +Point(1641)={ 7484.26750646, 15721.63942899, 0.0}; +Point(1642)={ 7551.40776567, 15917.60370894, 0.0}; +Point(1643)={ 7609.63992098, 16099.80936013, 0.0}; +Point(1644)={ 7657.87073359, 16268.83786963, 0.0}; +Point(1645)={ 7695.76034158, 16425.03174382, 0.0}; +Point(1646)={ 7723.89875306, 16568.37942543, 0.0}; +Point(1647)={ 7743.79850047, 16698.67533228, 0.0}; +Point(1648)={ 7756.28201044, 16815.77862247, 0.0}; +Point(1649)={ 7761.18718745, 16919.40996280, 0.0}; +Point(1650)={ 7763.75094116, 17009.20765009, 0.0}; +Point(1651)={ 7760.28307641, 17085.01967695, 0.0}; +Point(1652)={ 7757.45615009, 17146.82057821, 0.0}; +Point(1653)={ 7753.17457561, 17194.33317543, 0.0}; +Point(1654)={ 7748.69447085, 17227.56383489, 0.0}; +Point(1655)={ 7746.12905210, 17246.59169448, 0.0}; +Point(1656)={ 7782.41611814, -17282.87876051, 0.0}; +Point(1657)={ 7784.88467134, -17263.97421106, 0.0}; +Point(1658)={ 7789.19592252, -17230.95922189, 0.0}; +Point(1659)={ 7795.33586585, -17183.94025695, 0.0}; +Point(1660)={ 7799.00431768, -17122.65012799, 0.0}; +Point(1661)={ 7802.03986241, -17047.32879513, 0.0}; +Point(1662)={ 7802.11469080, -16958.12405424, 0.0}; +Point(1663)={ 7798.05505496, -16855.04315308, 0.0}; +Point(1664)={ 7786.68633124, -16738.51841169, 0.0}; +Point(1665)={ 7768.71449215, -16608.60340482, 0.0}; +Point(1666)={ 7741.94982797, -16465.53828852, 0.0}; +Point(1667)={ 7705.51222368, -16309.38652979, 0.0}; +Point(1668)={ 7658.16142815, -16140.23911759, 0.0}; +Point(1669)={ 7600.10419889, -15957.74198829, 0.0}; +Point(1670)={ 7532.80184416, -15761.05733821, 0.0}; +Point(1671)={ 7458.13692471, -15549.31915610, 0.0}; +Point(1672)={ 7378.20737775, -15322.08787416, 0.0}; +Point(1673)={ 7296.77499473, -15079.00795962, 0.0}; +Point(1674)={ 7216.04515623, -14820.84943966, 0.0}; +Point(1675)={ 7140.51589056, -14547.65903307, 0.0}; +Point(1676)={ 7068.66947434, -14261.04319950, 0.0}; +Point(1677)={ 7000.97143024, -13961.83122161, 0.0}; +Point(1678)={ 6938.09188367, -13650.35630119, 0.0}; +Point(1679)={ 6878.73847788, -13327.18170794, 0.0}; +Point(1680)={ 6823.49269996, -12992.79656878, 0.0}; +Point(1681)={ 6775.73279689, -12648.58021375, 0.0}; +Point(1682)={ 6743.25561226, -12299.32303078, 0.0}; +Point(1683)={ 6740.02055781, -11958.61215058, 0.0}; +Point(1684)={ 6779.29831072, -11659.75364866, 0.0}; +Point(1685)={ 6839.87845150, -11449.92741017, 0.0}; +Point(1686)={ 6871.39981124, -11379.70929490, 0.0}; +Point(1687)={ 6898.87867514, -11323.51562545, 0.0}; +Point(1688)={ 7031.56585824, -11112.35109499, 0.0}; +Point(1689)={ 7374.03021042, -10769.86842748, 0.0}; +Point(1690)={ 7922.45744286, -10384.79136617, 0.0}; +Point(1691)={ 8604.84110061, -9959.42107982, 0.0}; +Point(1692)={ 9358.75991200, -9453.47746775, 0.0}; +Point(1693)={ 10131.35761238, -8830.15397470, 0.0}; +Point(1694)={ 10880.98005991, -8074.74359067, 0.0}; +Point(1695)={ 11571.21883730, -7184.30606940, 0.0}; +Point(1696)={ 12150.02982253, -6156.63936034, 0.0}; +Point(1697)={ 12581.69558555, -5014.72077315, 0.0}; +Point(1698)={ 12908.98015729, -3806.18788020, 0.0}; +Point(1699)={ 13215.52100753, -2566.83470289, 0.0}; +Point(1700)={ 13504.64124141, -1302.39726797, 0.0}; +Point(1701)={ 13638.11157604, 0.00078354, 0.0}; +Point(1702)={ 13504.64094758, 1302.39873712, 0.0}; +Point(1703)={ 13215.52071370, 2566.83617203, 0.0}; +Point(1704)={ 12908.97976551, 3806.18934934, 0.0}; +Point(1705)={ 12581.69509583, 5014.72234024, 0.0}; +Point(1706)={ 12150.02913693, 6156.64082948, 0.0}; +Point(1707)={ 11571.21785787, 7184.30753854, 0.0}; +Point(1708)={ 10880.97878665, 8074.74505981, 0.0}; +Point(1709)={ 10131.35594735, 8830.15544384, 0.0}; +Point(1710)={ 9358.75805109, 9453.47893689, 0.0}; +Point(1711)={ 8604.83816233, 9959.42294074, 0.0}; +Point(1712)={ 7922.45470046, 10384.79312914, 0.0}; +Point(1713)={ 7374.02746802, 10769.87058222, 0.0}; +Point(1714)={ 7031.56370349, 11112.35422916, 0.0}; +Point(1715)={ 6898.87720600, 11323.51856374, 0.0}; +Point(1716)={ 6871.39863592, 11379.71174347, 0.0}; +Point(1717)={ 6839.87757002, 11449.93005463, 0.0}; +Point(1718)={ 6779.29733129, 11659.75844787, 0.0}; +Point(1719)={ 6740.02045987, 11958.61930041, 0.0}; +Point(1720)={ 6743.25629786, 12299.33262918, 0.0}; +Point(1721)={ 6775.73436397, 12648.59265250, 0.0}; +Point(1722)={ 6823.49505059, 12992.81145610, 0.0}; +Point(1723)={ 6878.74180794, 13327.20021915, 0.0}; +Point(1724)={ 6938.09629110, 13650.37921983, 0.0}; +Point(1725)={ 7000.97760064, 13961.86040859, 0.0}; +Point(1726)={ 7068.67672212, 14261.07601037, 0.0}; +Point(1727)={ 7140.52744783, 14547.70340121, 0.0}; +Point(1728)={ 7216.06072915, 14820.90066381, 0.0}; +Point(1729)={ 7296.79379977, 15079.06613771, 0.0}; +Point(1730)={ 7378.23000257, 15322.15232060, 0.0}; +Point(1731)={ 7458.16229192, 15549.39055648, 0.0}; +Point(1732)={ 7532.82838669, 15761.13304808, 0.0}; +Point(1733)={ 7600.13123113, 15957.82210559, 0.0}; +Point(1734)={ 7658.18748097, 16140.32227112, 0.0}; +Point(1735)={ 7705.53592586, 16309.47232778, 0.0}; +Point(1736)={ 7741.97029804, 16465.62624126, 0.0}; +Point(1737)={ 7768.73016302, 16608.69341436, 0.0}; +Point(1738)={ 7786.69641936, 16738.60989037, 0.0}; +Point(1739)={ 7798.05867885, 16855.13551325, 0.0}; +Point(1740)={ 7802.11831469, 16958.21680618, 0.0}; +Point(1741)={ 7802.03614058, 17047.42174296, 0.0}; +Point(1742)={ 7799.00059585, 17122.74317376, 0.0}; +Point(1743)={ 7795.33802059, 17184.03438009, 0.0}; +Point(1744)={ 7789.24841992, 17231.05990720, 0.0}; +Point(1745)={ 7784.97242819, 17264.07949969, 0.0}; +Point(1746)={ 7782.52405123, 17282.98669360, 0.0}; +Point(1747)={ 7826.34860803, -17326.81125040, 0.0}; +Point(1748)={ 7828.72156894, -17308.00346854, 0.0}; +Point(1749)={ 7832.86582746, -17275.15723501, 0.0}; +Point(1750)={ 7838.76806333, -17228.37676108, 0.0}; +Point(1751)={ 7846.15041252, -17167.73236974, 0.0}; +Point(1752)={ 7848.72983710, -17092.79605048, 0.0}; +Point(1753)={ 7851.78526424, -17004.03009384, 0.0}; +Point(1754)={ 7847.18968478, -16901.45487195, 0.0}; +Point(1755)={ 7838.34387257, -16785.24139313, 0.0}; +Point(1756)={ 7822.41972598, -16655.46899115, 0.0}; +Point(1757)={ 7796.61333527, -16512.53942784, 0.0}; +Point(1758)={ 7760.91167403, -16356.41313427, 0.0}; +Point(1759)={ 7714.55049371, -16186.92350953, 0.0}; +Point(1760)={ 7657.29806137, -16003.70610804, 0.0}; +Point(1761)={ 7589.85104495, -15806.07121581, 0.0}; +Point(1762)={ 7514.43421775, -15592.90590750, 0.0}; +Point(1763)={ 7433.69262610, -15363.43359375, 0.0}; +Point(1764)={ 7351.12861065, -15117.37131748, 0.0}; +Point(1765)={ 7270.73843817, -14855.14121266, 0.0}; +Point(1766)={ 7195.69898502, -14577.52035835, 0.0}; +Point(1767)={ 7126.32484383, -14285.96829987, 0.0}; +Point(1768)={ 7064.42570583, -13981.60354528, 0.0}; +Point(1769)={ 7009.72850617, -13665.23676809, 0.0}; +Point(1770)={ 6961.71395152, -13337.60371546, 0.0}; +Point(1771)={ 6922.03796272, -12999.81270941, 0.0}; +Point(1772)={ 6894.67114551, -12654.79204717, 0.0}; +Point(1773)={ 6888.12660000, -12310.68852238, 0.0}; +Point(1774)={ 6913.30635195, -11986.38033785, 0.0}; +Point(1775)={ 6971.45613727, -11714.18405183, 0.0}; +Point(1776)={ 7034.45164825, -11535.95674386, 0.0}; +Point(1777)={ 7062.62022616, -11468.99268395, 0.0}; +Point(1778)={ 7091.85363942, -11411.50636393, 0.0}; +Point(1779)={ 7200.63041073, -11232.45212394, 0.0}; +Point(1780)={ 7496.35679620, -10897.59685879, 0.0}; +Point(1781)={ 8003.94340066, -10493.48126212, 0.0}; +Point(1782)={ 8666.33485290, -10045.40222559, 0.0}; +Point(1783)={ 9411.08757875, -9519.17786818, 0.0}; +Point(1784)={ 10177.28000845, -8877.99899016, 0.0}; +Point(1785)={ 10922.08356668, -8109.06621568, 0.0}; +Point(1786)={ 11608.34037696, -7207.89513048, 0.0}; +Point(1787)={ 12182.25881981, -6171.04793828, 0.0}; +Point(1788)={ 12608.51539159, -5022.98764479, 0.0}; +Point(1789)={ 12930.33347548, -3811.46553411, 0.0}; +Point(1790)={ 13234.55396015, -2571.22264337, 0.0}; +Point(1791)={ 13524.48516135, -1305.61077498, 0.0}; +Point(1792)={ 13659.25128074, 0.00078354, 0.0}; +Point(1793)={ 13524.48486753, 1305.61214618, 0.0}; +Point(1794)={ 13234.55366632, 2571.22411251, 0.0}; +Point(1795)={ 12930.33318165, 3811.46710120, 0.0}; +Point(1796)={ 12608.51490187, 5022.98930982, 0.0}; +Point(1797)={ 12182.25813421, 6171.04930948, 0.0}; +Point(1798)={ 11608.33939753, 7207.89669757, 0.0}; +Point(1799)={ 10922.08219548, 8109.06778277, 0.0}; +Point(1800)={ 10177.27824548, 8878.00065519, 0.0}; +Point(1801)={ 9411.08552195, 9519.17933732, 0.0}; +Point(1802)={ 8666.33191461, 10045.40418445, 0.0}; +Point(1803)={ 8003.94065826, 10493.48322097, 0.0}; +Point(1804)={ 7496.35434763, 10897.59911148, 0.0}; +Point(1805)={ 7200.62845187, 11232.45486634, 0.0}; +Point(1806)={ 7091.85207233, 11411.50920428, 0.0}; +Point(1807)={ 7062.61905084, 11468.99562224, 0.0}; +Point(1808)={ 7034.45037499, 11535.95968215, 0.0}; +Point(1809)={ 6971.45476607, 11714.18855720, 0.0}; +Point(1810)={ 6913.30556841, 11986.38778151, 0.0}; +Point(1811)={ 6888.12650206, 12310.69763107, 0.0}; +Point(1812)={ 6894.67192905, 12654.80497564, 0.0}; +Point(1813)={ 6922.03962775, 12999.82818439, 0.0}; +Point(1814)={ 6961.71669392, 13337.62340199, 0.0}; +Point(1815)={ 7009.73213006, 13665.25949084, 0.0}; +Point(1816)={ 7064.43158240, 13981.63204667, 0.0}; +Point(1817)={ 7126.33218955, 14286.00238400, 0.0}; +Point(1818)={ 7195.70936697, 14577.56139643, 0.0}; +Point(1819)={ 7270.75175841, 14855.18656023, 0.0}; +Point(1820)={ 7351.14437946, 15117.42156220, 0.0}; +Point(1821)={ 7433.71035377, 15363.48423024, 0.0}; +Point(1822)={ 7514.45243514, 15592.95713164, 0.0}; +Point(1823)={ 7589.86838085, 15806.12018726, 0.0}; +Point(1824)={ 7657.31275281, 16003.75302270, 0.0}; +Point(1825)={ 7714.56234480, 16186.96631058, 0.0}; +Point(1826)={ 7760.92088067, 16356.45250732, 0.0}; +Point(1827)={ 7796.61979950, 16512.57576467, 0.0}; +Point(1828)={ 7822.42589638, 16655.50258557, 0.0}; +Point(1829)={ 7838.34759440, 16785.27342046, 0.0}; +Point(1830)={ 7847.19105598, 16901.48562602, 0.0}; +Point(1831)={ 7851.78428481, 17004.05996643, 0.0}; +Point(1832)={ 7848.72885767, 17092.82553130, 0.0}; +Point(1833)={ 7846.14943309, 17167.76145879, 0.0}; +Point(1834)={ 7838.77815145, 17228.40722132, 0.0}; +Point(1835)={ 7832.88698313, 17275.18906646, 0.0}; +Point(1836)={ 7828.75046210, 17308.03627942, 0.0}; +Point(1837)={ 7826.38200656, 17326.84464893, 0.0}; +Point(1838)={ 7874.59891127, -17375.06155365, 0.0}; +Point(1839)={ 7878.69351273, -17356.63966687, 0.0}; +Point(1840)={ 7884.39623889, -17324.22026856, 0.0}; +Point(1841)={ 7889.99357847, -17277.61540627, 0.0}; +Point(1842)={ 7897.24742655, -17217.21851668, 0.0}; +Point(1843)={ 7903.58932817, -17142.90628966, 0.0}; +Point(1844)={ 7905.98050647, -17054.48803036, 0.0}; +Point(1845)={ 7904.67453565, -16952.30311098, 0.0}; +Point(1846)={ 7898.36789349, -16836.26416644, 0.0}; +Point(1847)={ 7882.19693075, -16706.87668011, 0.0}; +Point(1848)={ 7857.87829291, -16564.05220955, 0.0}; +Point(1849)={ 7823.69376740, -16407.78752264, 0.0}; +Point(1850)={ 7778.38821581, -16237.94442192, 0.0}; +Point(1851)={ 7721.47750629, -16054.16580754, 0.0}; +Point(1852)={ 7653.99239008, -15855.55726480, 0.0}; +Point(1853)={ 7577.82855228, -15641.00459511, 0.0}; +Point(1854)={ 7495.97795301, -15409.44345284, 0.0}; +Point(1855)={ 7411.87829062, -15160.60145874, 0.0}; +Point(1856)={ 7331.20721786, -14894.47753543, 0.0}; +Point(1857)={ 7256.46286671, -14612.39214928, 0.0}; +Point(1858)={ 7190.50409287, -14315.74323950, 0.0}; +Point(1859)={ 7134.78123501, -14006.25783349, 0.0}; +Point(1860)={ 7088.52808573, -13685.25992356, 0.0}; +Point(1861)={ 7053.04160507, -13353.80357135, 0.0}; +Point(1862)={ 7029.63305278, -13014.02246324, 0.0}; +Point(1863)={ 7023.23179776, -12670.66203133, 0.0}; +Point(1864)={ 7040.70784981, -12335.09286028, 0.0}; +Point(1865)={ 7087.92661829, -12028.30480212, 0.0}; +Point(1866)={ 7155.26922756, -11778.48494596, 0.0}; +Point(1867)={ 7216.44329417, -11623.13377261, 0.0}; +Point(1868)={ 7248.54065618, -11557.45805379, 0.0}; +Point(1869)={ 7278.98905129, -11497.69906640, 0.0}; +Point(1870)={ 7371.38545792, -11345.11536801, 0.0}; +Point(1871)={ 7631.48804677, -11023.74116141, 0.0}; +Point(1872)={ 8099.36261944, -10608.94861181, 0.0}; +Point(1873)={ 8738.82113017, -10140.31938900, 0.0}; +Point(1874)={ 9471.66203885, -9591.89382159, 0.0}; +Point(1875)={ 10230.52941596, -8931.81548715, 0.0}; +Point(1876)={ 10969.59185441, -8147.89294147, 0.0}; +Point(1877)={ 11650.82830681, -7234.41895303, 0.0}; +Point(1878)={ 12220.03696876, -6187.64661772, 0.0}; +Point(1879)={ 12638.88445294, -5032.16166370, 0.0}; +Point(1880)={ 12954.88345449, -3817.44945437, 0.0}; +Point(1881)={ 13256.12510338, -2576.17914247, 0.0}; +Point(1882)={ 13547.08823112, -1309.28686636, 0.0}; +Point(1883)={ 13683.34886143, 0.00078354, 0.0}; +Point(1884)={ 13547.08803524, 1309.28823756, 0.0}; +Point(1885)={ 13256.12471161, 2576.18061161, 0.0}; +Point(1886)={ 12954.88306272, 3817.45102146, 0.0}; +Point(1887)={ 12638.88396322, 5032.16332873, 0.0}; +Point(1888)={ 12220.03638111, 6187.64798892, 0.0}; +Point(1889)={ 11650.82732738, 7234.42061806, 0.0}; +Point(1890)={ 10969.59058115, 8147.89450856, 0.0}; +Point(1891)={ 10230.52784887, 8931.81705423, 0.0}; +Point(1892)={ 9471.66017793, 9591.89529073, 0.0}; +Point(1893)={ 8738.81819188, 10140.32144580, 0.0}; +Point(1894)={ 8099.36017086, 10608.95057067, 0.0}; +Point(1895)={ 7631.48550025, 11023.74380587, 0.0}; +Point(1896)={ 7371.38389083, 11345.11762070, 0.0}; +Point(1897)={ 7278.98768009, 11497.70151497, 0.0}; +Point(1898)={ 7248.53938292, 11557.46040442, 0.0}; +Point(1899)={ 7216.44211886, 11623.13651501, 0.0}; +Point(1900)={ 7155.26785636, 11778.48847191, 0.0}; +Point(1901)={ 7087.92514915, 12028.31175607, 0.0}; +Point(1902)={ 7040.70706627, 12335.10167514, 0.0}; +Point(1903)={ 7023.23179776, 12670.67466597, 0.0}; +Point(1904)={ 7029.63383632, 13014.03764439, 0.0}; +Point(1905)={ 7053.04346598, 13353.82276816, 0.0}; +Point(1906)={ 7088.53082813, 13685.28166689, 0.0}; +Point(1907)={ 7134.78603422, 14006.28466985, 0.0}; +Point(1908)={ 7190.51075299, 14315.77340592, 0.0}; +Point(1909)={ 7256.47148569, 14612.42887787, 0.0}; +Point(1910)={ 7331.21828541, 14894.51563522, 0.0}; +Point(1911)={ 7411.89141497, 15160.64073384, 0.0}; +Point(1912)={ 7495.99039176, 15409.47939789, 0.0}; +Point(1913)={ 7577.83971777, 15641.03593684, 0.0}; +Point(1914)={ 7654.00218437, 15855.58566824, 0.0}; +Point(1915)={ 7721.48465612, 16054.18804058, 0.0}; +Point(1916)={ 7778.39419032, 16237.96508787, 0.0}; +Point(1917)={ 7823.69778306, 16407.80417293, 0.0}; +Point(1918)={ 7857.88103531, 16564.06680304, 0.0}; +Point(1919)={ 7882.19859578, 16706.89000035, 0.0}; +Point(1920)={ 7898.36857909, 16836.27670313, 0.0}; +Point(1921)={ 7904.67512331, 16952.31515796, 0.0}; +Point(1922)={ 7905.98021264, 17054.49978351, 0.0}; +Point(1923)={ 7903.58893640, 17142.91794487, 0.0}; +Point(1924)={ 7897.24605535, 17217.22997600, 0.0}; +Point(1925)={ 7889.99220727, 17277.62686559, 0.0}; +Point(1926)={ 7884.39486768, 17324.23162994, 0.0}; +Point(1927)={ 7878.69958519, 17356.65279122, 0.0}; +Point(1928)={ 7874.61409242, 17375.07673480, 0.0}; +Point(1929)={ 7928.94998068, -17429.41262305, 0.0}; +Point(1930)={ 7932.93449430, -17411.03099081, 0.0}; +Point(1931)={ 7939.88814735, -17378.92794811, 0.0}; +Point(1932)={ 7949.17391913, -17333.09918547, 0.0}; +Point(1933)={ 7955.93139252, -17272.84088510, 0.0}; +Point(1934)={ 7964.22549230, -17198.88086080, 0.0}; +Point(1935)={ 7968.46534309, -17110.87082757, 0.0}; +Point(1936)={ 7970.30030358, -17008.88052076, 0.0}; +Point(1937)={ 7963.41619000, -16893.12277032, 0.0}; +Point(1938)={ 7950.01201664, -16763.70178752, 0.0}; +Point(1939)={ 7927.82069888, -16620.64695522, 0.0}; +Point(1940)={ 7895.02373064, -16464.00009506, 0.0}; +Point(1941)={ 7850.50397504, -16293.60586957, 0.0}; +Point(1942)={ 7793.71833862, -16109.07995075, 0.0}; +Point(1943)={ 7725.49306782, -15909.54379068, 0.0}; +Point(1944)={ 7648.08868507, -15693.63529724, 0.0}; +Point(1945)={ 7564.46571083, -15460.15506151, 0.0}; +Point(1946)={ 7479.05057716, -15208.42992185, 0.0}; +Point(1947)={ 7396.66677667, -14938.81590075, 0.0}; +Point(1948)={ 7322.24828159, -14652.31632542, 0.0}; +Point(1949)={ 7259.97588314, -14350.60102460, 0.0}; +Point(1950)={ 7209.42362759, -14036.30554415, 0.0}; +Point(1951)={ 7172.53382087, -13711.02018316, 0.0}; +Point(1952)={ 7150.03319939, -13376.61075415, 0.0}; +Point(1953)={ 7143.43341408, -13036.31936346, 0.0}; +Point(1954)={ 7157.04365933, -12696.78957686, 0.0}; +Point(1955)={ 7195.28086672, -12371.52635097, 0.0}; +Point(1956)={ 7258.21310658, -12081.18222244, 0.0}; +Point(1957)={ 7334.52679704, -11850.96466106, 0.0}; +Point(1958)={ 7393.87520774, -11713.58660005, 0.0}; +Point(1959)={ 7427.03955985, -11645.78816446, 0.0}; +Point(1960)={ 7460.34720245, -11583.42585442, 0.0}; +Point(1961)={ 7539.89526175, -11450.87030660, 0.0}; +Point(1962)={ 7774.58499452, -11146.56539514, 0.0}; +Point(1963)={ 8207.98659980, -10729.55874803, 0.0}; +Point(1964)={ 8822.10992318, -10242.32761936, 0.0}; +Point(1965)={ 9541.89327847, -9672.33531615, 0.0}; +Point(1966)={ 10291.42493292, -8991.30366238, 0.0}; +Point(1967)={ 11022.95605101, -8190.42651272, 0.0}; +Point(1968)={ 11698.72121636, -7263.72357080, 0.0}; +Point(1969)={ 12261.60991592, -6205.51845709, 0.0}; +Point(1970)={ 12672.91099652, -5042.20326094, 0.0}; +Point(1971)={ 12981.77994983, -3823.89272690, 0.0}; +Point(1972)={ 13280.13042185, -2581.67481731, 0.0}; +Point(1973)={ 13572.24555414, -1313.39831400, 0.0}; +Point(1974)={ 13710.21538624, 0.00088149, 0.0}; +Point(1975)={ 13572.24526032, 1313.39988109, 0.0}; +Point(1976)={ 13280.13003008, 2581.67638439, 0.0}; +Point(1977)={ 12981.77955806, 3823.89439193, 0.0}; +Point(1978)={ 12672.91040886, 5042.20492597, 0.0}; +Point(1979)={ 12261.60883854, 6205.51963241, 0.0}; +Point(1980)={ 11698.72013899, 7263.72533377, 0.0}; +Point(1981)={ 11022.95458187, 8190.42827569, 0.0}; +Point(1982)={ 10291.42316995, 8991.30542535, 0.0}; +Point(1983)={ 9541.89102579, 9672.33707912, 0.0}; +Point(1984)={ 8822.10678901, 10242.32996999, 0.0}; +Point(1985)={ 8207.98385740, 10729.56100072, 0.0}; +Point(1986)={ 7774.58244800, 11146.56823548, 0.0}; +Point(1987)={ 7539.89330289, 11450.87334283, 0.0}; +Point(1988)={ 7460.34543947, 11583.42898860, 0.0}; +Point(1989)={ 7427.03779688, 11645.79159247, 0.0}; +Point(1990)={ 7393.87344477, 11713.59041983, 0.0}; +Point(1991)={ 7334.52503407, 11850.96936232, 0.0}; +Point(1992)={ 7258.21075595, 12081.19044965, 0.0}; +Point(1993)={ 7195.27910375, 12371.53702675, 0.0}; +Point(1994)={ 7157.04248401, 12696.80495389, 0.0}; +Point(1995)={ 7143.43331614, 13036.33718907, 0.0}; +Point(1996)={ 7150.03427676, 13376.63455428, 0.0}; +Point(1997)={ 7172.53626944, 13711.04731335, 0.0}; +Point(1998)={ 7209.42823091, 14036.33904062, 0.0}; +Point(1999)={ 7259.98352269, 14350.63961410, 0.0}; +Point(2000)={ 7322.25925120, 14652.35971413, 0.0}; +Point(2001)={ 7396.68048868, 14938.86487221, 0.0}; +Point(2002)={ 7479.06732540, 15208.48114600, 0.0}; +Point(2003)={ 7564.48431998, 15460.20863628, 0.0}; +Point(2004)={ 7648.10876336, 15693.69132058, 0.0}; +Point(2005)={ 7725.51353788, 15909.60196877, 0.0}; +Point(2006)={ 7793.73929841, 16109.14312393, 0.0}; +Point(2007)={ 7850.52424922, 16293.67384195, 0.0}; +Point(2008)={ 7895.04224185, 16464.07276870, 0.0}; +Point(2009)={ 7927.83597797, 16620.72452601, 0.0}; +Point(2010)={ 7950.02318213, 16763.78327602, 0.0}; +Point(2011)={ 7963.42157686, 16893.20719712, 0.0}; +Point(2012)={ 7970.29873650, 17008.96671053, 0.0}; +Point(2013)={ 7968.46377601, 17110.95799676, 0.0}; +Point(2014)={ 7964.21569800, 17198.96812794, 0.0}; +Point(2015)={ 7955.92159823, 17272.92844607, 0.0}; +Point(2016)={ 7949.16402689, 17333.18694232, 0.0}; +Point(2017)={ 7939.86953820, 17379.01433376, 0.0}; +Point(2018)={ 7932.99521890, 17411.13441853, 0.0}; +Point(2019)={ 7929.06516154, 17429.52780392, 0.0}; +Point(2020)={ 7990.67546589, -17491.13810827, 0.0}; +Point(2021)={ 7994.52687509, -17472.76920861, 0.0}; +Point(2022)={ 8001.25310470, -17440.68957426, 0.0}; +Point(2023)={ 8010.80469354, -17394.98999832, 0.0}; +Point(2024)={ 8022.81915490, -17335.69594594, 0.0}; +Point(2025)={ 8030.35850658, -17261.79439356, 0.0}; +Point(2026)={ 8039.29462215, -17174.20218480, 0.0}; +Point(2027)={ 8040.34917350, -17072.33401281, 0.0}; +Point(2028)={ 8037.38189499, -16956.59007232, 0.0}; +Point(2029)={ 8027.03775208, -16826.84538819, 0.0}; +Point(2030)={ 8005.67699023, -16683.46225124, 0.0}; +Point(2031)={ 7973.96131176, -16526.25133784, 0.0}; +Point(2032)={ 7930.11853758, -16355.06103234, 0.0}; +Point(2033)={ 7874.01820773, -16169.27507794, 0.0}; +Point(2034)={ 7804.76326307, -15968.51012607, 0.0}; +Point(2035)={ 7725.38307792, -15751.17695500, 0.0}; +Point(2036)={ 7639.31672182, -15515.77870319, 0.0}; +Point(2037)={ 7551.36280987, -15261.36992770, 0.0}; +Point(2038)={ 7466.61760573, -14988.35709160, 0.0}; +Point(2039)={ 7392.85895206, -14697.38123128, 0.0}; +Point(2040)={ 7332.73150343, -14390.89728586, 0.0}; +Point(2041)={ 7287.27061437, -14071.97439451, 0.0}; +Point(2042)={ 7259.76432645, -13742.95290313, 0.0}; +Point(2043)={ 7250.20637132, -13406.47785807, 0.0}; +Point(2044)={ 7259.99184784, -13067.03504478, 0.0}; +Point(2045)={ 7292.24053165, -12732.85597751, 0.0}; +Point(2046)={ 7348.31950994, -12418.41945926, 0.0}; +Point(2047)={ 7423.93927486, -12143.34316185, 0.0}; +Point(2048)={ 7505.51445865, -11929.02457574, 0.0}; +Point(2049)={ 7563.68069838, -11803.74804733, 0.0}; +Point(2050)={ 7599.67618836, -11734.68379752, 0.0}; +Point(2051)={ 7636.15483073, -11670.59181562, 0.0}; +Point(2052)={ 7708.06109007, -11553.45052358, 0.0}; +Point(2053)={ 7921.94774794, -11265.51784754, 0.0}; +Point(2054)={ 8326.11545024, -10851.35624619, 0.0}; +Point(2055)={ 8915.75852997, -10349.73622611, 0.0}; +Point(2056)={ 9619.79139145, -9757.09717059, 0.0}; +Point(2057)={ 10358.68047094, -9054.53296310, 0.0}; +Point(2058)={ 11081.59065375, -8235.87966429, 0.0}; +Point(2059)={ 11751.38962651, -7295.23219795, 0.0}; +Point(2060)={ 12307.50488797, -6224.78177144, 0.0}; +Point(2061)={ 12710.00285948, -5052.86042940, 0.0}; +Point(2062)={ 13011.38025725, -3830.85245242, 0.0}; +Point(2063)={ 13306.29352065, -2587.64032430, 0.0}; +Point(2064)={ 13599.67858077, -1317.90594072, 0.0}; +Point(2065)={ 13739.60149251, 0.00088149, 0.0}; +Point(2066)={ 13599.67828694, 1317.90750781, 0.0}; +Point(2067)={ 13306.29312888, 2587.64189139, 0.0}; +Point(2068)={ 13011.37986548, 3830.85401950, 0.0}; +Point(2069)={ 12710.00236976, 5052.86219237, 0.0}; +Point(2070)={ 12307.50361471, 6224.78275087, 0.0}; +Point(2071)={ 11751.38854914, 7295.23386298, 0.0}; +Point(2072)={ 11081.58918461, 8235.88142726, 0.0}; +Point(2073)={ 10358.67870797, 9054.53472607, 0.0}; +Point(2074)={ 9619.78923671, 9757.09903151, 0.0}; +Point(2075)={ 8915.75539579, 10349.73887057, 0.0}; +Point(2076)={ 8326.11251195, 10851.35889065, 0.0}; +Point(2077)={ 7921.94500554, 11265.52107965, 0.0}; +Point(2078)={ 7708.05922915, 11553.45346187, 0.0}; +Point(2079)={ 7636.15316570, 11670.59475391, 0.0}; +Point(2080)={ 7599.67432744, 11734.68732347, 0.0}; +Point(2081)={ 7563.67893540, 11803.75167122, 0.0}; +Point(2082)={ 7505.51240185, 11929.02898317, 0.0}; +Point(2083)={ 7423.93672834, 12143.35119317, 0.0}; +Point(2084)={ 7348.31686548, 12418.43003709, 0.0}; +Point(2085)={ 7292.23837690, 12732.87135454, 0.0}; +Point(2086)={ 7259.99067252, 13067.05316422, 0.0}; +Point(2087)={ 7250.20627337, 13406.50195203, 0.0}; +Point(2088)={ 7259.76569765, 13742.97895595, 0.0}; +Point(2089)={ 7287.27414032, 14072.00691155, 0.0}; +Point(2090)={ 7332.73796766, 14390.93430829, 0.0}; +Point(2091)={ 7392.86864841, 14697.42197553, 0.0}; +Point(2092)={ 7466.63082803, 14988.40048031, 0.0}; +Point(2093)={ 7551.37769720, 15261.41556909, 0.0}; +Point(2094)={ 7639.33258857, 15515.82258162, 0.0}; +Point(2095)={ 7725.39923850, 15751.22073548, 0.0}; +Point(2096)={ 7804.77834628, 15968.55165386, 0.0}; +Point(2097)={ 7874.03113620, 16169.31680162, 0.0}; +Point(2098)={ 7930.12901747, 16355.10177659, 0.0}; +Point(2099)={ 7973.96944102, 16526.29002529, 0.0}; +Point(2100)={ 8005.68227915, 16683.49917572, 0.0}; +Point(2101)={ 8027.04294306, 16826.88035381, 0.0}; +Point(2102)={ 8037.38444150, 16956.62376468, 0.0}; +Point(2103)={ 8040.34897762, 17072.36662780, 0.0}; +Point(2104)={ 8039.29139003, 17174.23382036, 0.0}; +Point(2105)={ 8030.35537240, 17261.82563735, 0.0}; +Point(2106)={ 8022.81602073, 17335.72689590, 0.0}; +Point(2107)={ 8010.79832726, 17395.02036063, 0.0}; +Point(2108)={ 8001.26054836, 17440.72277691, 0.0}; +Point(2109)={ 7994.55498471, 17472.80672074, 0.0}; +Point(2110)={ 7990.71542660, 17491.17806898, 0.0}; +Point(2111)={ 8055.33022778, -17555.79287015, 0.0}; +Point(2112)={ 8061.03736137, -17537.93630987, 0.0}; +Point(2113)={ 8070.94330767, -17506.73522347, 0.0}; +Point(2114)={ 8080.10439812, -17461.01028031, 0.0}; +Point(2115)={ 8091.96234670, -17401.74159515, 0.0}; +Point(2116)={ 8105.43370889, -17328.82015751, 0.0}; +Point(2117)={ 8113.27501858, -17241.20356096, 0.0}; +Point(2118)={ 8119.40330669, -17139.68112745, 0.0}; +Point(2119)={ 8118.71369064, -17023.85883263, 0.0}; +Point(2120)={ 8108.91724451, -16894.07506928, 0.0}; +Point(2121)={ 8089.93091272, -16750.30172776, 0.0}; +Point(2122)={ 8059.67693429, -16592.50394042, 0.0}; +Point(2123)={ 8016.70624382, -16420.49796634, 0.0}; +Point(2124)={ 7960.58348504, -16233.67763682, 0.0}; +Point(2125)={ 7890.96145034, -16031.38546109, 0.0}; +Point(2126)={ 7809.46491471, -15812.55131487, 0.0}; +Point(2127)={ 7720.21688305, -15575.39753428, 0.0}; +Point(2128)={ 7628.19070063, -15318.81873558, 0.0}; +Point(2129)={ 7541.58507084, -15042.29905345, 0.0}; +Point(2130)={ 7466.12083927, -14747.43769980, 0.0}; +Point(2131)={ 7407.19240779, -14436.40636284, 0.0}; +Point(2132)={ 7366.62004545, -14113.13784234, 0.0}; +Point(2133)={ 7347.91902136, -13780.96699657, 0.0}; +Point(2134)={ 7351.21068681, -13443.26002554, 0.0}; +Point(2135)={ 7376.51404272, -13105.75432719, 0.0}; +Point(2136)={ 7425.60792828, -12777.84576115, 0.0}; +Point(2137)={ 7496.90899835, -12474.20480469, 0.0}; +Point(2138)={ 7584.00365711, -12212.82983945, 0.0}; +Point(2139)={ 7669.16296389, -12011.34275447, 0.0}; +Point(2140)={ 7727.41088801, -11895.14259589, 0.0}; +Point(2141)={ 7766.25201141, -11824.47962390, 0.0}; +Point(2142)={ 7804.55670147, -11758.05650271, 0.0}; +Point(2143)={ 7871.41459126, -11652.20900807, 0.0}; +Point(2144)={ 8071.66994615, -11381.40566616, 0.0}; +Point(2145)={ 8451.48433881, -10972.87176671, 0.0}; +Point(2146)={ 9018.13531951, -10460.08292438, 0.0}; +Point(2147)={ 9706.48605135, -9846.65009854, 0.0}; +Point(2148)={ 10432.42952620, -9121.10926701, 0.0}; +Point(2149)={ 11145.62220488, -8284.07394419, 0.0}; +Point(2150)={ 11808.22844592, -7328.41702013, 0.0}; +Point(2151)={ 12357.21091674, -6245.10051863, 0.0}; +Point(2152)={ 12749.84828951, -5063.97087766, 0.0}; +Point(2153)={ 13042.96469222, -3838.12393023, 0.0}; +Point(2154)={ 13334.32086487, -2594.00289187, 0.0}; +Point(2155)={ 13629.11111198, -1322.77174468, 0.0}; +Point(2156)={ 13771.23480099, 0.00107737, 0.0}; +Point(2157)={ 13629.11072020, 1322.77340971, 0.0}; +Point(2158)={ 13334.32037516, 2594.00465484, 0.0}; +Point(2159)={ 13042.96430045, 3838.12579114, 0.0}; +Point(2160)={ 12749.84779980, 5063.97303240, 0.0}; +Point(2161)={ 12357.21013320, 6245.10237955, 0.0}; +Point(2162)={ 11808.22727061, 7328.41888105, 0.0}; +Point(2163)={ 11145.62063779, 8284.07609893, 0.0}; +Point(2164)={ 10432.42756735, 9121.11142175, 0.0}; +Point(2165)={ 9706.48340689, 9846.65254712, 0.0}; +Point(2166)={ 9018.13159768, 10460.08625444, 0.0}; +Point(2167)={ 8451.48051904, 10972.87539059, 0.0}; +Point(2168)={ 8071.66642020, 11381.41007360, 0.0}; +Point(2169)={ 7871.41165297, 11652.21361138, 0.0}; +Point(2170)={ 7804.55386112, 11758.06130191, 0.0}; +Point(2171)={ 7766.24877929, 11824.48530459, 0.0}; +Point(2172)={ 7727.40755795, 11895.14896218, 0.0}; +Point(2173)={ 7669.15914412, 12011.35137345, 0.0}; +Point(2174)={ 7583.99915174, 12212.84178849, 0.0}; +Point(2175)={ 7496.90439504, 12474.22194470, 0.0}; +Point(2176)={ 7425.60303113, 12777.86887568, 0.0}; +Point(2177)={ 7376.51051677, 13105.78263270, 0.0}; +Point(2178)={ 7351.20872795, 13443.29724384, 0.0}; +Point(2179)={ 7347.91941314, 13781.00901408, 0.0}; +Point(2180)={ 7366.62425699, 14113.19161300, 0.0}; +Point(2181)={ 7407.20112471, 14436.46816482, 0.0}; +Point(2182)={ 7466.13739163, 14747.51223435, 0.0}; +Point(2183)={ 7541.60926274, 15042.38181522, 0.0}; +Point(2184)={ 7628.22370739, 15318.91530729, 0.0}; +Point(2185)={ 7720.25547255, 15575.50223525, 0.0}; +Point(2186)={ 7809.51212319, 15812.67266614, 0.0}; +Point(2187)={ 7891.01012797, 16031.52199351, 0.0}; +Point(2188)={ 7960.63333799, 16233.83170102, 0.0}; +Point(2189)={ 8016.75433379, 16420.66799523, 0.0}; +Point(2190)={ 8059.71836414, 16592.68973813, 0.0}; +Point(2191)={ 8089.96333182, 16750.50045394, 0.0}; +Point(2192)={ 8108.93595161, 16894.28407945, 0.0}; +Point(2193)={ 8118.71496390, 17024.07450293, 0.0}; +Point(2194)={ 8119.40457995, 17139.90091135, 0.0}; +Point(2195)={ 8113.25523411, 17241.42491194, 0.0}; +Point(2196)={ 8105.41382648, 17329.04297764, 0.0}; +Point(2197)={ 8091.91827238, 17401.96177082, 0.0}; +Point(2198)={ 8080.06032381, 17461.23074981, 0.0}; +Point(2199)={ 8070.89893953, 17506.95579091, 0.0}; +Point(2200)={ 8061.23050479, 17538.23307690, 0.0}; +Point(2201)={ 8055.67479095, 17556.13743332, 0.0}; +Point(2202)={ 8126.47615627, -17626.93879865, 0.0}; +Point(2203)={ 8132.05684556, -17609.04394269, 0.0}; +Point(2204)={ 8141.77464353, -17577.78291522, 0.0}; +Point(2205)={ 8155.47950164, -17533.21046634, 0.0}; +Point(2206)={ 8169.51521090, -17474.52023202, 0.0}; +Point(2207)={ 8183.02388935, -17401.54923526, 0.0}; +Point(2208)={ 8196.42336145, -17314.68826830, 0.0}; +Point(2209)={ 8203.99650343, -17213.11177030, 0.0}; +Point(2210)={ 8205.57720412, -17097.28996520, 0.0}; +Point(2211)={ 8199.86781784, -16967.08612468, 0.0}; +Point(2212)={ 8183.80263346, -16822.52679129, 0.0}; +Point(2213)={ 8155.17039380, -16663.71862484, 0.0}; +Point(2214)={ 8112.84054381, -16490.52430939, 0.0}; +Point(2215)={ 8055.87018706, -16302.52406159, 0.0}; +Point(2216)={ 7984.50212403, -16098.85353523, 0.0}; +Point(2217)={ 7900.38140391, -15878.34260633, 0.0}; +Point(2218)={ 7807.08813402, -15639.42830186, 0.0}; +Point(2219)={ 7710.95951472, -15380.49652260, 0.0}; +Point(2220)={ 7619.53127379, -15101.20525190, 0.0}; +Point(2221)={ 7540.88301604, -14802.67907029, 0.0}; +Point(2222)={ 7482.61129179, -14487.23687420, 0.0}; +Point(2223)={ 7446.67290253, -14159.81371324, 0.0}; +Point(2224)={ 7435.94952466, -13824.96638147, 0.0}; +Point(2225)={ 7451.40824653, -13486.77821690, 0.0}; +Point(2226)={ 7491.51577180, -13152.04087502, 0.0}; +Point(2227)={ 7556.06455945, -12831.02131970, 0.0}; +Point(2228)={ 7641.43434556, -12537.84448622, 0.0}; +Point(2229)={ 7735.77658405, -12287.47987158, 0.0}; +Point(2230)={ 7825.53391887, -12097.31772984, 0.0}; +Point(2231)={ 7884.31788455, -11987.11833771, 0.0}; +Point(2232)={ 7926.15165368, -11914.88220663, 0.0}; +Point(2233)={ 7967.98512899, -11847.43695319, 0.0}; +Point(2234)={ 8031.65576047, -11749.76093379, 0.0}; +Point(2235)={ 8221.12407461, -11494.28683322, 0.0}; +Point(2236)={ 8582.18288898, -11093.38944481, 0.0}; +Point(2237)={ 9128.69347654, -10572.64039011, 0.0}; +Point(2238)={ 9800.08167101, -9938.27922038, 0.0}; +Point(2239)={ 10512.29354935, -9190.17508390, 0.0}; +Point(2240)={ 11214.46451604, -8334.26185210, 0.0}; +Point(2241)={ 11869.21798809, -7363.09429643, 0.0}; +Point(2242)={ 12409.80283347, -6265.97724660, 0.0}; +Point(2243)={ 12792.25443703, -5075.41256885, 0.0}; +Point(2244)={ 13076.50690809, -3845.67199882, 0.0}; +Point(2245)={ 13364.06044712, -2600.72432228, 0.0}; +Point(2246)={ 13660.48898534, -1327.99494233, 0.0}; +Point(2247)={ 13805.00972923, 0.00117531, 0.0}; +Point(2248)={ 13660.48869151, 1327.99680325, 0.0}; +Point(2249)={ 13364.06005535, 2600.72598731, 0.0}; +Point(2250)={ 13076.50651632, 3845.67395768, 0.0}; +Point(2251)={ 12792.25384937, 5075.41482154, 0.0}; +Point(2252)={ 12409.80195199, 6265.97930341, 0.0}; +Point(2253)={ 11869.21681277, 7363.09625529, 0.0}; +Point(2254)={ 11214.46294896, 8334.26381096, 0.0}; +Point(2255)={ 10512.29149255, 9190.17743453, 0.0}; +Point(2256)={ 9800.07883067, 9938.28206073, 0.0}; +Point(2257)={ 9128.68955882, 10572.64401400, 0.0}; +Point(2258)={ 8582.17906921, 11093.39326459, 0.0}; +Point(2259)={ 8221.12025483, 11494.29153448, 0.0}; +Point(2260)={ 8031.65233247, 11749.76583094, 0.0}; +Point(2261)={ 7967.98189687, 11847.44214417, 0.0}; +Point(2262)={ 7926.14812774, 11914.88818115, 0.0}; +Point(2263)={ 7884.31396684, 11987.12519371, 0.0}; +Point(2264)={ 7825.52892378, 12097.32723030, 0.0}; +Point(2265)={ 7735.77119719, 12287.49221238, 0.0}; +Point(2266)={ 7641.42817515, 12537.86270360, 0.0}; +Point(2267)={ 7556.05868288, 12831.04609926, 0.0}; +Point(2268)={ 7491.51136437, 13152.07133526, 0.0}; +Point(2269)={ 7451.40550413, 13486.81847144, 0.0}; +Point(2270)={ 7435.94991644, 13825.01094549, 0.0}; +Point(2271)={ 7446.67779968, 14159.87042219, 0.0}; +Point(2272)={ 7482.62196757, 14487.30239801, 0.0}; +Point(2273)={ 7540.89770747, 14802.75380073, 0.0}; +Point(2274)={ 7619.55487803, 15101.28732806, 0.0}; +Point(2275)={ 7710.99212971, 15380.58780539, 0.0}; +Point(2276)={ 7807.12525438, 15639.52330648, 0.0}; +Point(2277)={ 7900.42126668, 15878.44554433, 0.0}; +Point(2278)={ 7984.54188886, 16098.96039095, 0.0}; +Point(2279)={ 8055.90681771, 16302.63170085, 0.0}; +Point(2280)={ 8112.87227731, 16490.63047951, 0.0}; +Point(2281)={ 8155.19634867, 16663.82254227, 0.0}; +Point(2282)={ 8183.82075290, 16822.62728072, 0.0}; +Point(2283)={ 8199.87800391, 16967.18308817, 0.0}; +Point(2284)={ 8205.57916298, 17097.38340274, 0.0}; +Point(2285)={ 8203.98974537, 17213.20217161, 0.0}; +Point(2286)={ 8196.41679928, 17314.77690663, 0.0}; +Point(2287)={ 8183.00792466, 17401.63552297, 0.0}; +Point(2288)={ 8169.49934415, 17474.60593207, 0.0}; +Point(2289)={ 8155.45403648, 17533.29342398, 0.0}; +Point(2290)={ 8141.74917837, 17577.86567699, 0.0}; +Point(2291)={ 8132.12148789, 17609.15471613, 0.0}; +Point(2292)={ 8126.60769361, 17627.07033598, 0.0}; +Point(2293)={ 8203.20130492, -17703.66394729, 0.0}; +Point(2294)={ 8210.55642597, -17686.40248816, 0.0}; +Point(2295)={ 8221.06442737, -17655.41364405, 0.0}; +Point(2296)={ 8234.27506553, -17610.64452579, 0.0}; +Point(2297)={ 8251.39940459, -17552.61207608, 0.0}; +Point(2298)={ 8269.32716937, -17480.63676699, 0.0}; +Point(2299)={ 8284.03848885, -17393.77638768, 0.0}; +Point(2300)={ 8295.99741658, -17292.61683266, 0.0}; +Point(2301)={ 8302.76566369, -17176.63361764, 0.0}; +Point(2302)={ 8298.13120090, -17045.95416634, 0.0}; +Point(2303)={ 8283.44887251, -16900.79101488, 0.0}; +Point(2304)={ 8256.34366082, -16740.98765049, 0.0}; +Point(2305)={ 8214.86199647, -16566.46797152, 0.0}; +Point(2306)={ 8158.60701476, -16376.59632847, 0.0}; +Point(2307)={ 8086.47989415, -16170.80357505, 0.0}; +Point(2308)={ 7998.59336693, -15948.62604953, 0.0}; +Point(2309)={ 7900.76955168, -15707.75866541, 0.0}; +Point(2310)={ 7798.48130252, -15446.82581448, 0.0}; +Point(2311)={ 7700.68383391, -15165.00702894, 0.0}; +Point(2312)={ 7618.79464514, -14862.74873260, 0.0}; +Point(2313)={ 7559.73252158, -14543.18862465, 0.0}; +Point(2314)={ 7526.85857020, -14211.87331023, 0.0}; +Point(2315)={ 7522.93634828, -13874.70012808, 0.0}; +Point(2316)={ 7549.48632159, -13536.60667431, 0.0}; +Point(2317)={ 7602.82759955, -13205.11800094, 0.0}; +Point(2318)={ 7681.33658248, -12891.07207903, 0.0}; +Point(2319)={ 7777.57166573, -12606.93087113, 0.0}; +Point(2320)={ 7880.89850155, -12367.22244551, 0.0}; +Point(2321)={ 7974.35278959, -12186.31688856, 0.0}; +Point(2322)={ 8035.14096112, -12080.09907176, 0.0}; +Point(2323)={ 8079.77579964, -12006.60026064, 0.0}; +Point(2324)={ 8124.08869981, -11938.06088691, 0.0}; +Point(2325)={ 8187.02877510, -11846.21139351, 0.0}; +Point(2326)={ 8369.13824634, -11604.94430436, 0.0}; +Point(2327)={ 8716.66507186, -11212.88939810, 0.0}; +Point(2328)={ 9246.15190773, -10686.15181982, 0.0}; +Point(2329)={ 9901.32261659, -10032.21127396, 0.0}; +Point(2330)={ 10597.15608910, -9260.30475673, 0.0}; +Point(2331)={ 11287.26626744, -8385.58766078, 0.0}; +Point(2332)={ 11933.81672662, -7398.80643756, 0.0}; +Point(2333)={ 12465.68220410, -6287.47963391, 0.0}; +Point(2334)={ 12837.05646411, -5087.07629663, 0.0}; +Point(2335)={ 13111.58594623, -3853.36943037, 0.0}; +Point(2336)={ 13395.06124026, -2607.69795569, 0.0}; +Point(2337)={ 13693.35598277, -1333.50805101, 0.0}; +Point(2338)={ 13840.52549481, 0.00117531, 0.0}; +Point(2339)={ 13693.35559099, 1333.50991193, 0.0}; +Point(2340)={ 13395.06075055, 2607.69962071, 0.0}; +Point(2341)={ 13111.58545651, 3853.37138922, 0.0}; +Point(2342)={ 12837.05587645, 5087.07874521, 0.0}; +Point(2343)={ 12465.68132262, 6287.48188660, 0.0}; +Point(2344)={ 11933.81545337, 7398.80859231, 0.0}; +Point(2345)={ 11287.26479830, 8385.58961964, 0.0}; +Point(2346)={ 10597.15393436, 9260.30730324, 0.0}; +Point(2347)={ 9901.31977625, 10032.21421225, 0.0}; +Point(2348)={ 9246.14799002, 10686.15554165, 0.0}; +Point(2349)={ 8716.66115414, 11212.89351170, 0.0}; +Point(2350)={ 8369.13432863, 11604.94910357, 0.0}; +Point(2351)={ 8187.02524915, 11846.21648654, 0.0}; +Point(2352)={ 8124.08527180, 11938.06607788, 0.0}; +Point(2353)={ 8079.77178398, 12006.60643105, 0.0}; +Point(2354)={ 8035.13694546, 12080.10573188, 0.0}; +Point(2355)={ 7974.34750067, 12186.32629108, 0.0}; +Point(2356)={ 7880.89252703, 12367.23449249, 0.0}; +Point(2357)={ 7777.56441796, 12606.94928439, 0.0}; +Point(2358)={ 7681.32904088, 12891.09676065, 0.0}; +Point(2359)={ 7602.82162503, 13205.14865707, 0.0}; +Point(2360)={ 7549.48162033, 13536.64692885, 0.0}; +Point(2361)={ 7522.93487913, 13874.74557359, 0.0}; +Point(2362)={ 7526.86209615, 14211.93001918, 0.0}; +Point(2363)={ 7559.74172821, 14543.25160194, 0.0}; +Point(2364)={ 7618.81168720, 14862.81954533, 0.0}; +Point(2365)={ 7700.70871141, 15165.08244499, 0.0}; +Point(2366)={ 7798.51039157, 15446.90524618, 0.0}; +Point(2367)={ 7900.80148107, 15707.83750946, 0.0}; +Point(2368)={ 7998.62549221, 15948.70548123, 0.0}; +Point(2369)={ 8086.50829760, 16170.88271293, 0.0}; +Point(2370)={ 8158.63071695, 16376.67096097, 0.0}; +Point(2371)={ 8214.88099739, 16566.53898013, 0.0}; +Point(2372)={ 8256.35707900, 16741.05493727, 0.0}; +Point(2373)={ 8283.45709972, 16900.85555926, 0.0}; +Point(2374)={ 8298.13374741, 17046.01665391, 0.0}; +Point(2375)={ 8302.76203981, 17176.69444019, 0.0}; +Point(2376)={ 8295.99398857, 17292.67667578, 0.0}; +Point(2377)={ 8284.02859662, 17393.83505548, 0.0}; +Point(2378)={ 8269.31717919, 17480.69514097, 0.0}; +Point(2379)={ 8251.38275429, 17552.66878503, 0.0}; +Point(2380)={ 8234.25831729, 17610.70113679, 0.0}; +Point(2381)={ 8221.04777708, 17655.47025505, 0.0}; +Point(2382)={ 8210.53350733, 17686.45684647, 0.0}; +Point(2383)={ 8203.31188247, 17703.77452484, 0.0}; +Point(2384)={ 8284.58422677, -17785.04686914, 0.0}; +Point(2385)={ 8291.75531309, -17767.66719291, 0.0}; +Point(2386)={ 8304.27946937, -17737.31439009, 0.0}; +Point(2387)={ 8322.11908553, -17694.07905786, 0.0}; +Point(2388)={ 8340.66996312, -17636.45708690, 0.0}; +Point(2389)={ 8360.24933926, -17564.63398110, 0.0}; +Point(2390)={ 8380.07043850, -17478.74206132, 0.0}; +Point(2391)={ 8394.91740892, -17377.57359350, 0.0}; +Point(2392)={ 8403.48663034, -17261.53014358, 0.0}; +Point(2393)={ 8404.44725444, -17130.41445454, 0.0}; +Point(2394)={ 8393.94777408, -16984.16041491, 0.0}; +Point(2395)={ 8368.82316399, -16822.95499771, 0.0}; +Point(2396)={ 8327.57186137, -16646.89252196, 0.0}; +Point(2397)={ 8269.79278998, -16455.51579015, 0.0}; +Point(2398)={ 8195.49074903, -16247.82891873, 0.0}; +Point(2399)={ 8105.10109476, -16023.07196862, 0.0}; +Point(2400)={ 8001.10217467, -15780.44347297, 0.0}; +Point(2401)={ 7891.91002746, -15517.41023625, 0.0}; +Point(2402)={ 7786.78780010, -15233.14072313, 0.0}; +Point(2403)={ 7698.05739673, -14927.92092690, 0.0}; +Point(2404)={ 7635.93240237, -14604.44447359, 0.0}; +Point(2405)={ 7604.89879835, -14269.20380308, 0.0}; +Point(2406)={ 7606.43150701, -13929.75207698, 0.0}; +Point(2407)={ 7642.68732925, -13592.03237337, 0.0}; +Point(2408)={ 7709.28900038, -13264.18482576, 0.0}; +Point(2409)={ 7799.74917354, -12956.71204869, 0.0}; +Point(2410)={ 7907.72428210, -12681.66905187, 0.0}; +Point(2411)={ 8017.88018758, -12450.58988668, 0.0}; +Point(2412)={ 8114.59088162, -12277.37490527, 0.0}; +Point(2413)={ 8178.60088531, -12174.14013580, 0.0}; +Point(2414)={ 8227.22866054, -12099.53447181, 0.0}; +Point(2415)={ 8274.09689133, -12030.16601131, 0.0}; +Point(2416)={ 8337.15293103, -11942.55587900, 0.0}; +Point(2417)={ 8514.82284588, -11714.34095638, 0.0}; +Point(2418)={ 8853.07790545, -11330.98612326, 0.0}; +Point(2419)={ 9369.12932418, -10799.55247609, 0.0}; +Point(2420)={ 10008.27774765, -10126.22579547, 0.0}; +Point(2421)={ 10687.73927857, -9331.74941111, 0.0}; +Point(2422)={ 11363.85086800, -8437.73070514, 0.0}; +Point(2423)={ 12001.59479009, -7435.20486469, 0.0}; +Point(2424)={ 12524.26421150, -6309.28035533, 0.0}; +Point(2425)={ 12883.44575405, -5098.68488255, 0.0}; +Point(2426)={ 13148.09005376, -3861.16793899, 0.0}; +Point(2427)={ 13427.29072726, -2614.91536901, 0.0}; +Point(2428)={ 13727.57165411, -1339.29628133, 0.0}; +Point(2429)={ 13877.64135379, 0.00117531, 0.0}; +Point(2430)={ 13727.57126234, 1339.29824019, 0.0}; +Point(2431)={ 13427.29023755, 2614.91722992, 0.0}; +Point(2432)={ 13148.08956404, 3861.17019168, 0.0}; +Point(2433)={ 12883.44516639, 5098.68752701, 0.0}; +Point(2434)={ 12524.26333001, 6309.28290184, 0.0}; +Point(2435)={ 12001.59341889, 7435.20731326, 0.0}; +Point(2436)={ 11363.84920297, 8437.73305577, 0.0}; +Point(2437)={ 10687.73682999, 9331.75234940, 0.0}; +Point(2438)={ 10008.27451553, 10126.22941935, 0.0}; +Point(2439)={ 9369.12540646, 10799.55649175, 0.0}; +Point(2440)={ 8853.07340008, 11330.99092247, 0.0}; +Point(2441)={ 8514.81804667, 11714.34673501, 0.0}; +Point(2442)={ 8337.14803388, 11942.56253912, 0.0}; +Point(2443)={ 8274.09199418, 12030.17286732, 0.0}; +Point(2444)={ 8227.22317574, 12099.54260107, 0.0}; +Point(2445)={ 8178.59540050, 12174.14885272, 0.0}; +Point(2446)={ 8114.58373179, 12277.38695225, 0.0}; +Point(2447)={ 8017.87205832, 12450.60496989, 0.0}; +Point(2448)={ 7907.71458575, 12681.69157875, 0.0}; +Point(2449)={ 7799.73879159, 12956.74221511, 0.0}; +Point(2450)={ 7709.27940197, 13264.22175024, 0.0}; +Point(2451)={ 7642.67890616, 13592.08193248, 0.0}; +Point(2452)={ 7606.42768724, 13929.80859004, 0.0}; +Point(2453)={ 7604.90105104, 14269.27559523, 0.0}; +Point(2454)={ 7635.94288226, 14604.52625593, 0.0}; +Point(2455)={ 7698.07874829, 14928.01250353, 0.0}; +Point(2456)={ 7786.82129657, 15233.24062490, 0.0}; +Point(2457)={ 7891.95400383, 15517.51836523, 0.0}; +Point(2458)={ 8001.15065641, 15780.55865384, 0.0}; +Point(2459)={ 8105.15222096, 16023.19694378, 0.0}; +Point(2460)={ 8195.54177728, 16247.96398200, 0.0}; +Point(2461)={ 8269.84205526, 16455.66182303, 0.0}; +Point(2462)={ 8327.61691511, 16647.04854502, 0.0}; +Point(2463)={ 8368.86136173, 16823.12022740, 0.0}; +Point(2464)={ 8393.97412072, 16984.33543890, 0.0}; +Point(2465)={ 8404.45832199, 17130.59653042, 0.0}; +Point(2466)={ 8403.47957845, 17261.71633306, 0.0}; +Point(2467)={ 8394.88998491, 17377.76037064, 0.0}; +Point(2468)={ 8380.04272066, 17478.93060143, 0.0}; +Point(2469)={ 8360.19889866, 17564.81879938, 0.0}; +Point(2470)={ 8340.61942458, 17636.64229695, 0.0}; +Point(2471)={ 8322.11820404, 17694.28630506, 0.0}; +Point(2472)={ 8304.44665792, 17737.59088293, 0.0}; +Point(2473)={ 8292.04052286, 17767.99226544, 0.0}; +Point(2474)={ 8284.93701715, 17785.39965952, 0.0}; +Point(2475)={ 8373.93000546, -17874.39264784, 0.0}; +Point(2476)={ 8382.93037159, -17857.81776853, 0.0}; +Point(2477)={ 8396.84708021, -17828.02324031, 0.0}; +Point(2478)={ 8414.07132104, -17784.37811493, 0.0}; +Point(2479)={ 8435.94109221, -17727.62156756, 0.0}; +Point(2480)={ 8460.53465582, -17657.21197389, 0.0}; +Point(2481)={ 8481.62930678, -17571.16510842, 0.0}; +Point(2482)={ 8501.46392214, -17470.61759867, 0.0}; +Point(2483)={ 8515.67504717, -17354.48031945, 0.0}; +Point(2484)={ 8519.23517414, -17222.69812888, 0.0}; +Point(2485)={ 8511.67388325, -17075.40834293, 0.0}; +Point(2486)={ 8488.90421259, -16912.60782743, 0.0}; +Point(2487)={ 8448.72822522, -16734.47523026, 0.0}; +Point(2488)={ 8390.62790107, -16540.76324555, 0.0}; +Point(2489)={ 8315.69530364, -16330.02398322, 0.0}; +Point(2490)={ 8220.32495837, -16102.91777438, 0.0}; +Point(2491)={ 8110.13183458, -15857.79290975, 0.0}; +Point(2492)={ 7992.03775388, -15592.81403704, 0.0}; +Point(2493)={ 7876.50938575, -15306.60780074, 0.0}; +Point(2494)={ 7778.72729417, -14998.58360506, 0.0}; +Point(2495)={ 7711.76352810, -14671.20001304, 0.0}; +Point(2496)={ 7680.42845579, -14331.89980463, 0.0}; +Point(2497)={ 7685.78612906, -13989.95748817, 0.0}; +Point(2498)={ 7730.41156506, -13652.68342482, 0.0}; +Point(2499)={ 7808.64131275, -13328.47426058, 0.0}; +Point(2500)={ 7912.44336758, -13027.90959310, 0.0}; +Point(2501)={ 8029.16027297, -12760.12543946, 0.0}; +Point(2502)={ 8146.39794084, -12536.84174667, 0.0}; +Point(2503)={ 8247.49011113, -12370.89226855, 0.0}; +Point(2504)={ 8314.45965584, -12269.47864961, 0.0}; +Point(2505)={ 8367.24608719, -12193.94771892, 0.0}; +Point(2506)={ 8417.97532559, -12124.18758471, 0.0}; +Point(2507)={ 8481.88993287, -12039.20712169, 0.0}; +Point(2508)={ 8657.13811123, -11822.98246852, 0.0}; +Point(2509)={ 8990.48309665, -11448.09372294, 0.0}; +Point(2510)={ 9496.94453291, -10912.56557225, 0.0}; +Point(2511)={ 10120.78065917, -10219.94521497, 0.0}; +Point(2512)={ 10781.70296770, -9402.34372512, 0.0}; +Point(2513)={ 11443.75592923, -8490.21909621, 0.0}; +Point(2514)={ 12072.23425578, -7472.01484794, 0.0}; +Point(2515)={ 12585.14121726, -6331.13582684, 0.0}; +Point(2516)={ 12931.36461847, -5110.17476166, 0.0}; +Point(2517)={ 13185.54528492, -3868.94490018, 0.0}; +Point(2518)={ 13460.38446253, -2622.29203750, 0.0}; +Point(2519)={ 13762.79858605, -1345.30987830, 0.0}; +Point(2520)={ 13916.01195943, 0.00107737, 0.0}; +Point(2521)={ 13762.79819428, 1345.31203304, 0.0}; +Point(2522)={ 13460.38407076, 2622.29389842, 0.0}; +Point(2523)={ 13185.54479521, 3868.94734875, 0.0}; +Point(2524)={ 12931.36393287, 5110.17760201, 0.0}; +Point(2525)={ 12585.14023783, 6331.13856924, 0.0}; +Point(2526)={ 12072.23278663, 7472.01739446, 0.0}; +Point(2527)={ 11443.75416626, 8490.22174066, 0.0}; +Point(2528)={ 10781.70042119, 9402.34705518, 0.0}; +Point(2529)={ 10120.77713323, 10219.94923063, 0.0}; +Point(2530)={ 9496.94012548, 10912.57017557, 0.0}; +Point(2531)={ 8990.47819950, 11448.09891391, 0.0}; +Point(2532)={ 8657.13272437, 11822.98883481, 0.0}; +Point(2533)={ 8481.88425218, 12039.21436946, 0.0}; +Point(2534)={ 8417.96905724, 12124.19581191, 0.0}; +Point(2535)={ 8367.23962296, 12193.95663172, 0.0}; +Point(2536)={ 8314.45260395, 12269.48903156, 0.0}; +Point(2537)={ 8247.48139421, 12370.90588261, 0.0}; +Point(2538)={ 8146.38785272, 12536.85869079, 0.0}; +Point(2539)={ 8029.14832393, 12760.14953342, 0.0}; +Point(2540)={ 7912.43063500, 13027.94250192, 0.0}; +Point(2541)={ 7808.62946165, 13328.51441717, 0.0}; +Point(2542)={ 7730.40255431, 13652.73680371, 0.0}; +Point(2543)={ 7685.78299489, 13990.01909427, 0.0}; +Point(2544)={ 7680.43286322, 14331.97659187, 0.0}; +Point(2545)={ 7711.77812159, 14671.28659457, 0.0}; +Point(2546)={ 7778.75520790, 14998.68027472, 0.0}; +Point(2547)={ 7876.54611434, 15306.71181611, 0.0}; +Point(2548)={ 7992.08457059, 15592.92432077, 0.0}; +Point(2549)={ 8110.18354844, 15857.90887416, 0.0}; +Point(2550)={ 8220.38010023, 16103.03922360, 0.0}; +Point(2551)={ 8315.74133681, 16330.15326787, 0.0}; +Point(2552)={ 8390.66962475, 16540.89732940, 0.0}; +Point(2553)={ 8448.76338672, 16734.61048942, 0.0}; +Point(2554)={ 8488.92909009, 16912.74387014, 0.0}; +Point(2555)={ 8511.68583229, 17075.54507124, 0.0}; +Point(2556)={ 8519.23331323, 17222.83338804, 0.0}; +Point(2557)={ 8515.65878865, 17354.61273827, 0.0}; +Point(2558)={ 8501.44795745, 17470.74864629, 0.0}; +Point(2559)={ 8481.59865064, 17571.29253215, 0.0}; +Point(2560)={ 8460.50331409, 17657.33861408, 0.0}; +Point(2561)={ 8435.89437344, 17727.74291883, 0.0}; +Point(2562)={ 8414.02460227, 17784.49927031, 0.0}; +Point(2563)={ 8396.79879436, 17828.14371009, 0.0}; +Point(2564)={ 8383.04192856, 17858.02481985, 0.0}; +Point(2565)={ 8374.24694873, 17874.70959110, 0.0}; +Point(2566)={ 8469.77635329, -17970.23899566, 0.0}; +Point(2567)={ 8478.66212620, -17953.51063981, 0.0}; +Point(2568)={ 8493.86521706, -17924.12678623, 0.0}; +Point(2569)={ 8515.52039531, -17882.27235114, 0.0}; +Point(2570)={ 8541.49270131, -17827.09425177, 0.0}; +Point(2571)={ 8566.11936963, -17756.23137829, 0.0}; +Point(2572)={ 8594.88353839, -17672.04180430, 0.0}; +Point(2573)={ 8615.95634808, -17571.08636232, 0.0}; +Point(2574)={ 8633.91927436, -17455.05339229, 0.0}; +Point(2575)={ 8644.58476796, -17322.86033120, 0.0}; +Point(2576)={ 8642.59721241, -17174.09532908, 0.0}; +Point(2577)={ 8623.22665057, -17009.05476120, 0.0}; +Point(2578)={ 8583.89248254, -16828.30796972, 0.0}; +Point(2579)={ 8522.82556548, -16632.42635359, 0.0}; +Point(2580)={ 8443.66976755, -16419.47926209, 0.0}; +Point(2581)={ 8346.30716547, -16188.17012693, 0.0}; +Point(2582)={ 8229.01993849, -15939.99541790, 0.0}; +Point(2583)={ 8100.21051124, -15673.05278978, 0.0}; +Point(2584)={ 7973.36542707, -15384.67055576, 0.0}; +Point(2585)={ 7863.85663042, -15074.29837461, 0.0}; +Point(2586)={ 7788.19337885, -14743.49647694, 0.0}; +Point(2587)={ 7754.37848991, -14399.98717181, 0.0}; +Point(2588)={ 7762.11225827, -14055.23781145, 0.0}; +Point(2589)={ 7812.61221230, -13718.17892868, 0.0}; +Point(2590)={ 7902.00833365, -13397.79433727, 0.0}; +Point(2591)={ 8015.63562983, -13102.55355277, 0.0}; +Point(2592)={ 8141.93096042, -12841.83255236, 0.0}; +Point(2593)={ 8266.95371874, -12626.17978787, 0.0}; +Point(2594)={ 8372.19955006, -12466.07936262, 0.0}; +Point(2595)={ 8443.13108152, -12366.29179194, 0.0}; +Point(2596)={ 8500.19281901, -12290.18035360, 0.0}; +Point(2597)={ 8554.39511313, -12219.69593154, 0.0}; +Point(2598)={ 8621.04830222, -12137.05170084, 0.0}; +Point(2599)={ 8795.53918597, -11931.52858427, 0.0}; +Point(2600)={ 9127.83843490, -11564.48418460, 0.0}; +Point(2601)={ 9628.40439335, -11024.52588004, 0.0}; +Point(2602)={ 10237.80902303, -10312.31978033, 0.0}; +Point(2603)={ 10879.67604796, -9472.42883392, 0.0}; +Point(2604)={ 11526.10104227, -8542.38594069, 0.0}; +Point(2605)={ 12145.16676097, -7508.86998288, 0.0}; +Point(2606)={ 12647.90891302, -6352.83409997, 0.0}; +Point(2607)={ 12980.57887588, -5121.44799104, 0.0}; +Point(2608)={ 13223.89571432, -3876.67445700, 0.0}; +Point(2609)={ 13494.20336714, -2629.79808859, 0.0}; +Point(2610)={ 13798.88085345, -1351.53023276, 0.0}; +Point(2611)={ 13955.38432519, 0.00117531, 0.0}; +Point(2612)={ 13798.88036374, 1351.53238750, 0.0}; +Point(2613)={ 13494.20287743, 2629.79994951, 0.0}; +Point(2614)={ 13223.89522461, 3876.67690557, 0.0}; +Point(2615)={ 12980.57819028, 5121.45102727, 0.0}; +Point(2616)={ 12647.90793359, 6352.83713620, 0.0}; +Point(2617)={ 12145.16538977, 7508.87262733, 0.0}; +Point(2618)={ 11526.09927929, 8542.38858515, 0.0}; +Point(2619)={ 10879.67350144, 9472.43226192, 0.0}; +Point(2620)={ 10237.80569297, 10312.32399188, 0.0}; +Point(2621)={ 9628.40008386, 11024.53067924, 0.0}; +Point(2622)={ 9127.83353776, 11564.48947352, 0.0}; +Point(2623)={ 8795.53360323, 11931.53504850, 0.0}; +Point(2624)={ 8621.04242565, 12137.05865479, 0.0}; +Point(2625)={ 8554.38884478, 12219.70366903, 0.0}; +Point(2626)={ 8500.18606095, 12290.18907052, 0.0}; +Point(2627)={ 8443.12393169, 12366.30158623, 0.0}; +Point(2628)={ 8372.19044137, 12466.09248697, 0.0}; +Point(2629)={ 8266.94323884, 12626.19702582, 0.0}; +Point(2630)={ 8141.91852167, 12841.85517717, 0.0}; +Point(2631)={ 8015.62133016, 13102.58479656, 0.0}; +Point(2632)={ 7901.99540519, 13397.83243707, 0.0}; +Point(2633)={ 7812.60134064, 13718.22809602, 0.0}; +Point(2634)={ 7762.10745907, 14055.29452039, 0.0}; +Point(2635)={ 7754.38103642, 14400.05700511, 0.0}; +Point(2636)={ 7788.20532789, 14743.57287242, 0.0}; +Point(2637)={ 7863.88092027, 15074.38133225, 0.0}; +Point(2638)={ 7973.39941326, 15384.75351341, 0.0}; +Point(2639)={ 8100.24880692, 15673.13506183, 0.0}; +Point(2640)={ 8229.06058480, 15940.07612286, 0.0}; +Point(2641)={ 8346.34075989, 16188.24701212, 0.0}; +Point(2642)={ 8443.69817099, 16419.55066247, 0.0}; +Point(2643)={ 8522.84809235, 16632.48962471, 0.0}; +Point(2644)={ 8583.90962255, 16828.36428689, 0.0}; +Point(2645)={ 8623.23252715, 17009.10383060, 0.0}; +Point(2646)={ 8642.59780007, 17174.13764042, 0.0}; +Point(2647)={ 8644.58525768, 17322.89715774, 0.0}; +Point(2648)={ 8633.91614019, 17455.08620317, 0.0}; +Point(2649)={ 8615.95017767, 17571.11623491, 0.0}; +Point(2650)={ 8594.87756387, 17672.07020775, 0.0}; +Point(2651)={ 8566.11006505, 17756.25801877, 0.0}; +Point(2652)={ 8541.48359262, 17827.12040253, 0.0}; +Point(2653)={ 8515.50785862, 17882.29673893, 0.0}; +Point(2654)={ 8493.85258242, 17924.15097812, 0.0}; +Point(2655)={ 8478.64958951, 17953.53492965, 0.0}; +Point(2656)={ 8469.84373801, 17970.30638039, 0.0}; +Point(2657)={ 8572.73854763, -18073.20119001, 0.0}; +Point(2658)={ 8583.54821320, -18057.51484881, 0.0}; +Point(2659)={ 8602.42700367, -18030.11894255, 0.0}; +Point(2660)={ 8625.74280403, -17989.00054846, 0.0}; +Point(2661)={ 8652.47877093, -17933.68797347, 0.0}; +Point(2662)={ 8684.74596595, -17865.49737446, 0.0}; +Point(2663)={ 8713.27575733, -17780.81602910, 0.0}; +Point(2664)={ 8742.88850350, -17681.35137620, 0.0}; +Point(2665)={ 8763.30538949, -17564.79646839, 0.0}; +Point(2666)={ 8777.64237116, -17432.14640566, 0.0}; +Point(2667)={ 8780.72463466, -17282.27572599, 0.0}; +Point(2668)={ 8766.75738748, -17114.92301975, 0.0}; +Point(2669)={ 8729.77698356, -16930.92383792, 0.0}; +Point(2670)={ 8667.46903184, -16731.74360239, 0.0}; +Point(2671)={ 8584.63929726, -16515.78809635, 0.0}; +Point(2672)={ 8482.12940329, -16281.04371144, 0.0}; +Point(2673)={ 8360.24454005, -16027.39624621, 0.0}; +Point(2674)={ 8218.45013512, -15758.35430967, 0.0}; +Point(2675)={ 8076.64632766, -15468.51243240, 0.0}; +Point(2676)={ 7951.59722270, -15156.25808228, 0.0}; +Point(2677)={ 7863.47543660, -14822.13092475, 0.0}; +Point(2678)={ 7823.98837969, -14473.94122159, 0.0}; +Point(2679)={ 7832.04222549, -14125.44211677, 0.0}; +Point(2680)={ 7887.18604484, -13787.85140398, 0.0}; +Point(2681)={ 7984.84227977, -13470.32028143, 0.0}; +Point(2682)={ 8110.90098029, -13181.17624742, 0.0}; +Point(2683)={ 8247.15632168, -12927.26306307, 0.0}; +Point(2684)={ 8378.98699399, -12717.79235736, 0.0}; +Point(2685)={ 8488.62037402, -12562.81258353, 0.0}; +Point(2686)={ 8564.26452673, -12464.41208040, 0.0}; +Point(2687)={ 8625.38237410, -12387.45186876, 0.0}; +Point(2688)={ 8683.76389236, -12317.13453731, 0.0}; +Point(2689)={ 8753.36457550, -12235.83153688, 0.0}; +Point(2690)={ 8928.94409474, -12040.06284893, 0.0}; +Point(2691)={ 9264.29739961, -11680.54007327, 0.0}; +Point(2692)={ 9763.03016054, -11135.42615166, 0.0}; +Point(2693)={ 10358.69232203, -10402.72500752, 0.0}; +Point(2694)={ 10979.98222636, -9540.65048084, 0.0}; +Point(2695)={ 11610.36417139, -8593.85298305, 0.0}; +Point(2696)={ 12219.88486342, -7545.47585309, 0.0}; +Point(2697)={ 12712.19629103, -6374.20054251, 0.0}; +Point(2698)={ 13030.93524560, -5132.43258266, 0.0}; +Point(2699)={ 13262.58326323, -3884.22752069, 0.0}; +Point(2700)={ 13528.37143823, -2637.35027079, 0.0}; +Point(2701)={ 13835.45783051, -1357.90230079, 0.0}; +Point(2702)={ 13995.65404393, 0.00107737, 0.0}; +Point(2703)={ 13835.45734080, 1357.90455348, 0.0}; +Point(2704)={ 13528.37094852, 2637.35222965, 0.0}; +Point(2705)={ 13262.58277352, 3884.23006720, 0.0}; +Point(2706)={ 13030.93456000, 5132.43571683, 0.0}; +Point(2707)={ 12712.19511572, 6374.20406845, 0.0}; +Point(2708)={ 12219.88329633, 7545.47879138, 0.0}; +Point(2709)={ 11610.36231047, 8593.85601928, 0.0}; +Point(2710)={ 10979.97948396, 9540.65439855, 0.0}; +Point(2711)={ 10358.68869815, 10402.72980673, 0.0}; +Point(2712)={ 9763.02536134, 11135.43173441, 0.0}; +Point(2713)={ 9264.29201275, 11680.54585190, 0.0}; +Point(2714)={ 8928.93782639, 12040.06970493, 0.0}; +Point(2715)={ 8753.35762156, 12235.83947026, 0.0}; +Point(2716)={ 8683.75625281, 12317.14325423, 0.0}; +Point(2717)={ 8625.37414690, 12387.46185894, 0.0}; +Point(2718)={ 8564.25551598, 12464.42344178, 0.0}; +Point(2719)={ 8488.60930647, 12562.82727497, 0.0}; +Point(2720)={ 8378.97406552, 12717.81175005, 0.0}; +Point(2721)={ 8247.14163024, 12927.28852823, 0.0}; +Point(2722)={ 8110.88403616, 13181.21091922, 0.0}; +Point(2723)={ 7984.82700068, 13470.36357220, 0.0}; +Point(2724)={ 7887.17125546, 13787.90634995, 0.0}; +Point(2725)={ 7832.03448800, 14125.50685704, 0.0}; +Point(2726)={ 7823.98945706, 14474.02026152, 0.0}; +Point(2727)={ 7863.49492724, 14822.21731040, 0.0}; +Point(2728)={ 7951.63218832, 15156.35269513, 0.0}; +Point(2729)={ 8076.69089168, 15468.60949383, 0.0}; +Point(2730)={ 8218.50341606, 15758.45303613, 0.0}; +Point(2731)={ 8360.29831071, 16027.50457107, 0.0}; +Point(2732)={ 8482.18180275, 16281.15428899, 0.0}; +Point(2733)={ 8584.68533043, 16515.90758671, 0.0}; +Point(2734)={ 8667.51183289, 16731.86985081, 0.0}; +Point(2735)={ 8729.81243890, 16931.05988063, 0.0}; +Point(2736)={ 8766.78040407, 17115.06836703, 0.0}; +Point(2737)={ 8780.73168655, 17282.42841899, 0.0}; +Point(2738)={ 8777.63277275, 17432.30399581, 0.0}; +Point(2739)={ 8763.27825930, 17564.95601740, 0.0}; +Point(2740)={ 8742.84344976, 17681.50935812, 0.0}; +Point(2741)={ 8713.22835296, 17780.97508839, 0.0}; +Point(2742)={ 8684.67730797, 17865.64957775, 0.0}; +Point(2743)={ 8652.40580346, 17933.83880556, 0.0}; +Point(2744)={ 8625.66983656, 17989.15157644, 0.0}; +Point(2745)={ 8602.45295855, 18030.33931411, 0.0}; +Point(2746)={ 8583.95967138, 18057.99711972, 0.0}; +Point(2747)={ 8573.37076914, 18073.83341151, 0.0}; +Point(2748)={ 8687.08200239, -18187.54464477, 0.0}; +Point(2749)={ 8698.79773786, -18172.40570652, 0.0}; +Point(2750)={ 8717.54763546, -18144.63360153, 0.0}; +Point(2751)={ 8744.10681540, -18104.98033549, 0.0}; +Point(2752)={ 8776.26705676, -18052.12955564, 0.0}; +Point(2753)={ 8811.89506493, -17985.23317428, 0.0}; +Point(2754)={ 8845.31504804, -17901.47699769, 0.0}; +Point(2755)={ 8878.61289635, -17802.62527155, 0.0}; +Point(2756)={ 8906.74298269, -17686.56761991, 0.0}; +Point(2757)={ 8924.43607625, -17552.93646301, 0.0}; +Point(2758)={ 8932.29766011, -17401.72200656, 0.0}; +Point(2759)={ 8924.55311803, -17231.80809312, 0.0}; +Point(2760)={ 8893.62039521, -17043.29756274, 0.0}; +Point(2761)={ 8833.19324126, -16838.33017426, 0.0}; +Point(2762)={ 8740.37323153, -16620.34578076, 0.0}; +Point(2763)={ 8630.96649139, -16382.35556769, 0.0}; +Point(2764)={ 8503.59731469, -16122.57560279, 0.0}; +Point(2765)={ 8351.86552377, -15847.88794287, 0.0}; +Point(2766)={ 8190.30594500, -15557.81668330, 0.0}; +Point(2767)={ 8047.94758476, -15243.75499259, 0.0}; +Point(2768)={ 7943.43632529, -14906.94351362, 0.0}; +Point(2769)={ 7893.90629993, -14554.16929855, 0.0}; +Point(2770)={ 7899.01353318, -14201.21271378, 0.0}; +Point(2771)={ 7955.71327365, -13861.96226037, 0.0}; +Point(2772)={ 8059.57047035, -13546.59920216, 0.0}; +Point(2773)={ 8195.27811496, -13262.36916002, 0.0}; +Point(2774)={ 8341.83763854, -13014.68269642, 0.0}; +Point(2775)={ 8482.00824791, -12811.30883915, 0.0}; +Point(2776)={ 8596.96051582, -12660.91201014, 0.0}; +Point(2777)={ 8676.71650793, -12562.97840088, 0.0}; +Point(2778)={ 8742.91866991, -12486.42347702, 0.0}; +Point(2779)={ 8805.48509299, -12416.32093439, 0.0}; +Point(2780)={ 8879.19790937, -12336.46621582, 0.0}; +Point(2781)={ 9057.82149437, -12150.18829416, 0.0}; +Point(2782)={ 9400.13090087, -11797.67313810, 0.0}; +Point(2783)={ 9901.34964884, -11246.02231054, 0.0}; +Point(2784)={ 10482.77473043, -10490.49145673, 0.0}; +Point(2785)={ 11082.15069134, -9606.67722706, 0.0}; +Point(2786)={ 11696.27313323, -8644.46909738, 0.0}; +Point(2787)={ 12295.73685099, -7581.49504526, 0.0}; +Point(2788)={ 12777.51539970, -6395.03848509, 0.0}; +Point(2789)={ 13081.27241851, -5142.85018275, 0.0}; +Point(2790)={ 13301.67188837, -3891.61555056, 0.0}; +Point(2791)={ 13562.77016489, -2644.92595929, 0.0}; +Point(2792)={ 13872.44420895, -1364.41883462, 0.0}; +Point(2793)={ 14036.38615116, 0.00107737, 0.0}; +Point(2794)={ 13872.44371923, 1364.42118525, 0.0}; +Point(2795)={ 13562.76967517, 2644.92791815, 0.0}; +Point(2796)={ 13301.67149660, 3891.61809708, 0.0}; +Point(2797)={ 13081.27183085, 5142.85331692, 0.0}; +Point(2798)={ 12777.51432233, 6395.04201103, 0.0}; +Point(2799)={ 12295.73538184, 7581.49798355, 0.0}; +Point(2800)={ 11696.27127232, 8644.47213361, 0.0}; +Point(2801)={ 11082.14794893, 9606.68143860, 0.0}; +Point(2802)={ 10482.77130243, 10490.49615799, 0.0}; +Point(2803)={ 9901.34484963, 11246.02789328, 0.0}; +Point(2804)={ 9400.12531812, 11797.67881879, 0.0}; +Point(2805)={ 9057.81503014, 12150.19485634, 0.0}; +Point(2806)={ 8879.19017188, 12336.47414920, 0.0}; +Point(2807)={ 8805.47755138, 12416.32945542, 0.0}; +Point(2808)={ 8742.91024682, 12486.43258572, 0.0}; +Point(2809)={ 8676.70749719, 12562.98878283, 0.0}; +Point(2810)={ 8596.94984005, 12660.92552627, 0.0}; +Point(2811)={ 8481.99473179, 12811.32656682, 0.0}; +Point(2812)={ 8341.82216356, 13014.70551712, 0.0}; +Point(2813)={ 8195.26117084, 13262.40157913, 0.0}; +Point(2814)={ 8059.55479948, 13546.63867315, 0.0}; +Point(2815)={ 7955.70132462, 13862.01211331, 0.0}; +Point(2816)={ 7899.00902780, 14201.27040215, 0.0}; +Point(2817)={ 7893.91051148, 14554.23795653, 0.0}; +Point(2818)={ 7943.45238793, 14907.01628520, 0.0}; +Point(2819)={ 8047.97706558, 15243.83129012, 0.0}; +Point(2820)={ 8190.34277153, 15557.89004254, 0.0}; +Point(2821)={ 8351.90430917, 15847.95650291, 0.0}; +Point(2822)={ 8503.63335768, 16122.64279163, 0.0}; +Point(2823)={ 8630.99509072, 16382.41668406, 0.0}; +Point(2824)={ 8740.39732548, 16620.39984525, 0.0}; +Point(2825)={ 8833.20852035, 16838.37865601, 0.0}; +Point(2826)={ 8893.62852447, 17043.33801316, 0.0}; +Point(2827)={ 8924.55586043, 17231.84021840, 0.0}; +Point(2828)={ 8932.29717040, 17401.74610052, 0.0}; +Point(2829)={ 8924.43392150, 17552.95379891, 0.0}; +Point(2830)={ 8906.74004440, 17686.57966689, 0.0}; +Point(2831)={ 8878.61083955, 17802.63379258, 0.0}; +Point(2832)={ 8845.31259947, 17901.48316809, 0.0}; +Point(2833)={ 8811.89310607, 17985.23797349, 0.0}; +Point(2834)={ 8776.26480407, 18052.13337541, 0.0}; +Point(2835)={ 8744.10475860, 18104.98376349, 0.0}; +Point(2836)={ 8717.54557865, 18144.63673570, 0.0}; +Point(2837)={ 8698.79558312, 18172.40893863, 0.0}; +Point(2838)={ 8687.12793762, 18187.59057999, 0.0}; +Point(2839)={ 0.00000000, 0.00000000, 0.0}; +Point(2840)={ 8812.27762995, -18312.74027232, 0.0}; +Point(2841)={ 8825.05467483, -18298.19868791, 0.0}; +Point(2842)={ 8847.36940066, -18272.80218829, 0.0}; +Point(2843)={ 8878.90956543, -18236.43618027, 0.0}; +Point(2844)={ 8916.89251302, -18186.90400017, 0.0}; +Point(2845)={ 8954.39514856, -18120.14121295, 0.0}; +Point(2846)={ 8995.27769611, -18038.83311948, 0.0}; +Point(2847)={ 9031.46740689, -17939.95974796, 0.0}; +Point(2848)={ 9065.15643919, -17824.24117469, 0.0}; +Point(2849)={ 9088.42189689, -17689.64909986, 0.0}; +Point(2850)={ 9099.81481251, -17536.56168108, 0.0}; +Point(2851)={ 9097.37916813, -17363.89224169, 0.0}; +Point(2852)={ 9073.81586603, -17170.21463495, 0.0}; +Point(2853)={ 9014.70976610, -16958.39751085, 0.0}; +Point(2854)={ 8919.36968520, -16733.39080632, 0.0}; +Point(2855)={ 8797.53310781, -16493.16563389, 0.0}; +Point(2856)={ 8660.17894488, -16228.65629951, 0.0}; +Point(2857)={ 8501.71044446, -15944.19893188, 0.0}; +Point(2858)={ 8319.24700752, -15652.22757978, 0.0}; +Point(2859)={ 8151.21428362, -15339.15031329, 0.0}; +Point(2860)={ 8025.34373145, -14999.93061396, 0.0}; +Point(2861)={ 7960.00170414, -14642.06934189, 0.0}; +Point(2862)={ 7959.96370229, -14283.09426300, 0.0}; +Point(2863)={ 8016.28557900, -13940.38280085, 0.0}; +Point(2864)={ 8123.55863276, -13625.48644062, 0.0}; +Point(2865)={ 8269.02530931, -13346.18850980, 0.0}; +Point(2866)={ 8427.19723858, -13105.09203721, 0.0}; +Point(2867)={ 8575.65851972, -12906.69945859, 0.0}; +Point(2868)={ 8696.63819455, -12760.23415610, 0.0}; +Point(2869)={ 8781.94490542, -12663.79270713, 0.0}; +Point(2870)={ 8852.89416455, -12587.78058290, 0.0}; +Point(2871)={ 8920.07056469, -12518.64336562, 0.0}; +Point(2872)={ 8999.20696993, -12440.77649643, 0.0}; +Point(2873)={ 9181.56041697, -12262.20002197, 0.0}; +Point(2874)={ 9534.93267147, -11916.58288739, 0.0}; +Point(2875)={ 10042.45130354, -11355.62483856, 0.0}; +Point(2876)={ 10608.69582115, -10574.51188331, 0.0}; +Point(2877)={ 11185.49388361, -9670.12014127, 0.0}; +Point(2878)={ 11782.44703066, -8693.45945728, 0.0}; +Point(2879)={ 12372.39902233, -7616.79660969, 0.0}; +Point(2880)={ 12843.25644644, -6415.14048461, 0.0}; +Point(2881)={ 13131.89617238, -5152.77033078, 0.0}; +Point(2882)={ 13340.55365808, -3898.72591228, 0.0}; +Point(2883)={ 13596.99425933, -2652.43964993, 0.0}; +Point(2884)={ 13909.41795275, -1371.01156804, 0.0}; +Point(2885)={ 14077.43128395, 0.00107737, 0.0}; +Point(2886)={ 13909.41746304, 1371.01391867, 0.0}; +Point(2887)={ 13596.99376961, 2652.44160879, 0.0}; +Point(2888)={ 13340.55316837, 3898.72845879, 0.0}; +Point(2889)={ 13131.89568267, 5152.77346495, 0.0}; +Point(2890)={ 12843.25536907, 6415.14401055, 0.0}; +Point(2891)={ 12372.39755319, 7616.79954798, 0.0}; +Point(2892)={ 11782.44516974, 8693.46259146, 0.0}; +Point(2893)={ 11185.49143504, 9670.12415693, 0.0}; +Point(2894)={ 10608.69249109, 10574.51678045, 0.0}; +Point(2895)={ 10042.44621051, 11355.63100896, 0.0}; +Point(2896)={ 9534.92699078, 11916.58856808, 0.0}; +Point(2897)={ 9181.55405068, 12262.20648620, 0.0}; +Point(2898)={ 8999.19942832, 12440.78413598, 0.0}; +Point(2899)={ 8920.06253337, 12518.65149488, 0.0}; +Point(2900)={ 8852.88593734, 12587.78929982, 0.0}; +Point(2901)={ 8781.93609056, 12663.80230553, 0.0}; +Point(2902)={ 8696.62742083, 12760.24679073, 0.0}; +Point(2903)={ 8575.64539537, 12906.71630478, 0.0}; +Point(2904)={ 8427.18274303, 13105.11280111, 0.0}; +Point(2905)={ 8269.00836518, 13346.21848033, 0.0}; +Point(2906)={ 8123.54237423, 13625.52326716, 0.0}; +Point(2907)={ 8016.27265054, 13940.42854019, 0.0}; +Point(2908)={ 7959.95811954, 14283.14617275, 0.0}; +Point(2909)={ 7960.00444654, 14642.12977267, 0.0}; +Point(2910)={ 8025.36341797, 14999.99251388, 0.0}; +Point(2911)={ 8151.24464593, 15339.21299676, 0.0}; +Point(2912)={ 8319.28138548, 15652.28370107, 0.0}; +Point(2913)={ 8501.74384299, 15944.25103751, 0.0}; +Point(2914)={ 8660.20362649, 16228.70487920, 0.0}; +Point(2915)={ 8797.55406760, 16493.20510488, 0.0}; +Point(2916)={ 8919.38476841, 16733.42273571, 0.0}; +Point(2917)={ 9014.72034394, 16958.42444515, 0.0}; +Point(2918)={ 9073.82135083, 17170.23667211, 0.0}; +Point(2919)={ 9097.37975579, 17363.91134056, 0.0}; +Point(2920)={ 9099.81373514, 17536.57813549, 0.0}; +Point(2921)={ 9088.41925243, 17689.66447690, 0.0}; +Point(2922)={ 9065.15379473, 17824.25606201, 0.0}; +Point(2923)={ 9031.46280357, 17939.97424351, 0.0}; +Point(2924)={ 8995.27084011, 18038.84663560, 0.0}; +Point(2925)={ 8954.38839050, 18120.15482701, 0.0}; +Point(2926)={ 8916.88320844, 18186.91604715, 0.0}; +Point(2927)={ 8878.90035880, 18236.44812930, 0.0}; +Point(2928)={ 8847.43786276, 18272.88240354, 0.0}; +Point(2929)={ 8825.18415536, 18298.33237998, 0.0}; +Point(2930)={ 8812.44197816, 18312.90462053, 0.0}; +Point(2931)={ 0.00000000, 0.00000000, 0.0}; +Point(2932)={ 7220.28363582, -16720.74627820, 0.0}; +Point(2933)={ 7219.45298197, -16708.99831951, 0.0}; +Point(2934)={ 7218.01469028, -16688.65831871, 0.0}; +Point(2935)={ 7215.57121047, -16659.93136825, 0.0}; +Point(2936)={ 7210.29659278, -16623.23392141, 0.0}; +Point(2937)={ 7203.88897148, -16578.65344120, 0.0}; +Point(2938)={ 7196.42562350, -16526.49834987, 0.0}; +Point(2939)={ 7186.05699487, -16467.53240625, 0.0}; +Point(2940)={ 7172.43274378, -16402.13464942, 0.0}; +Point(2941)={ 7157.44238493, -16330.17951657, 0.0}; +Point(2942)={ 7136.97829046, -16252.57151050, 0.0}; +Point(2943)={ 7114.28168520, -16167.75030266, 0.0}; +Point(2944)={ 7085.46883881, -16075.18014530, 0.0}; +Point(2945)={ 7051.74454706, -15971.54459342, 0.0}; +Point(2946)={ 7009.62958382, -15854.03787637, 0.0}; +Point(2947)={ 6956.86283899, -15717.75334800, 0.0}; +Point(2948)={ 6891.22688500, -15558.52490851, 0.0}; +Point(2949)={ 6811.08832787, -15374.71152439, 0.0}; +Point(2950)={ 6715.82953958, -15167.92406275, 0.0}; +Point(2951)={ 6606.74033038, -14942.28503876, 0.0}; +Point(2952)={ 6484.19268744, -14704.54839988, 0.0}; +Point(2953)={ 6349.38190609, -14462.28581896, 0.0}; +Point(2954)={ 6202.58232442, -14223.95309951, 0.0}; +Point(2955)={ 6043.97817307, -14000.00486405, 0.0}; +Point(2956)={ 5877.15798244, -13800.83804670, 0.0}; +Point(2957)={ 5707.34015100, -13635.16721617, 0.0}; +Point(2958)={ 5546.07028736, -13507.07159687, 0.0}; +Point(2959)={ 5404.95844659, -13416.40016084, 0.0}; +Point(2960)={ 5294.12027077, -13358.00071904, 0.0}; +Point(2961)={ 5208.32296385, -13320.37918080, 0.0}; +Point(2962)={ 5127.82260559, -13289.83470369, 0.0}; +Point(2963)={ 5040.09827184, -13261.27876156, 0.0}; +Point(2964)={ 4923.96657536, -13231.83153892, 0.0}; +Point(2965)={ 4776.70822909, -13208.43503360, 0.0}; +Point(2966)={ 4621.29368666, -13198.12918638, 0.0}; +Point(2967)={ 4472.74073096, -13201.36933386, 0.0}; +Point(2968)={ 4332.38030822, -13216.29230798, 0.0}; +Point(2969)={ 4201.35080894, -13240.22994789, 0.0}; +Point(2970)={ 4084.51960417, -13269.41556502, 0.0}; +Point(2971)={ 3986.84378066, -13299.21988753, 0.0}; +Point(2972)={ 3912.13057535, -13323.65703630, 0.0}; +Point(2973)={ 3864.62933951, -13340.86070912, 0.0}; +Point(2974)={ 3847.07787141, -13347.54041584, 0.0}; +Point(2975)={ 7275.48759212, -16775.95023450, 0.0}; +Point(2976)={ 7274.60375527, -16763.56887899, 0.0}; +Point(2977)={ 7273.07134044, -16742.10184907, 0.0}; +Point(2978)={ 7270.90141518, -16711.70330691, 0.0}; +Point(2979)={ 7268.12816158, -16672.57648403, 0.0}; +Point(2980)={ 7261.93621056, -16625.29777449, 0.0}; +Point(2981)={ 7254.10381369, -16569.96394589, 0.0}; +Point(2982)={ 7245.16965697, -16506.84649598, 0.0}; +Point(2983)={ 7231.37332019, -16436.96070101, 0.0}; +Point(2984)={ 7215.47140664, -16359.89696371, 0.0}; +Point(2985)={ 7195.27254157, -16276.04813312, 0.0}; +Point(2986)={ 7171.30209078, -16184.59511264, 0.0}; +Point(2987)={ 7141.50824817, -16084.33751392, 0.0}; +Point(2988)={ 7105.92509785, -15972.61559919, 0.0}; +Point(2989)={ 7061.74696714, -15846.47208011, 0.0}; +Point(2990)={ 7006.86455742, -15701.45437388, 0.0}; +Point(2991)={ 6939.29501442, -15533.89539985, 0.0}; +Point(2992)={ 6857.78976187, -15342.54511263, 0.0}; +Point(2993)={ 6762.50462694, -15129.00938422, 0.0}; +Point(2994)={ 6654.81502198, -14897.10103432, 0.0}; +Point(2995)={ 6534.86306214, -14653.11407045, 0.0}; +Point(2996)={ 6403.97724512, -14403.60185299, 0.0}; +Point(2997)={ 6259.90390446, -14157.19746213, 0.0}; +Point(2998)={ 6103.97682677, -13922.68128420, 0.0}; +Point(2999)={ 5937.79042474, -13710.31440653, 0.0}; +Point(3000)={ 5764.58396436, -13530.98768935, 0.0}; +Point(3001)={ 5596.58855672, -13389.73882644, 0.0}; +Point(3002)={ 5445.63942762, -13290.54674868, 0.0}; +Point(3003)={ 5326.40764203, -13223.76300168, 0.0}; +Point(3004)={ 5234.20085289, -13182.65645868, 0.0}; +Point(3005)={ 5149.92215084, -13151.23715546, 0.0}; +Point(3006)={ 5057.33475553, -13122.30824672, 0.0}; +Point(3007)={ 4929.71327788, -13091.39305568, 0.0}; +Point(3008)={ 4765.34136628, -13068.55413937, 0.0}; +Point(3009)={ 4591.04362595, -13062.03789937, 0.0}; +Point(3010)={ 4425.61618356, -13073.03757420, 0.0}; +Point(3011)={ 4272.29340795, -13097.07658503, 0.0}; +Point(3012)={ 4132.03367053, -13130.48471705, 0.0}; +Point(3013)={ 4007.86242791, -13165.46287398, 0.0}; +Point(3014)={ 3905.03079147, -13200.64044269, 0.0}; +Point(3015)={ 3827.60985637, -13231.43682898, 0.0}; +Point(3016)={ 3778.61626435, -13252.71620026, 0.0}; +Point(3017)={ 3760.70054655, -13261.16318893, 0.0}; +Point(3018)={ 7326.93122613, -16827.39386850, 0.0}; +Point(3019)={ 7326.00145405, -16814.39508087, 0.0}; +Point(3020)={ 7324.38715894, -16791.82834792, 0.0}; +Point(3021)={ 7322.09911453, -16759.84313054, 0.0}; +Point(3022)={ 7319.15024928, -16718.61846839, 0.0}; +Point(3023)={ 7315.55780115, -16668.39882698, 0.0}; +Point(3024)={ 7307.44871554, -16609.89096237, 0.0}; +Point(3025)={ 7297.94913438, -16542.99252422, 0.0}; +Point(3026)={ 7285.52967908, -16468.30194372, 0.0}; +Point(3027)={ 7268.71787586, -16386.17867138, 0.0}; +Point(3028)={ 7248.55172373, -16296.26962300, 0.0}; +Point(3029)={ 7223.18783910, -16198.40623880, 0.0}; +Point(3030)={ 7192.14111073, -16090.90674103, 0.0}; +Point(3031)={ 7154.81438067, -15971.53783536, 0.0}; +Point(3032)={ 7108.51784267, -15837.44536734, 0.0}; +Point(3033)={ 7051.50899435, -15684.50329584, 0.0}; +Point(3034)={ 6982.12055350, -15509.45472513, 0.0}; +Point(3035)={ 6899.67397160, -15311.37507413, 0.0}; +Point(3036)={ 6805.13761025, -15091.69293816, 0.0}; +Point(3037)={ 6698.44016700, -14854.62975476, 0.0}; +Point(3038)={ 6581.57125421, -14605.17493185, 0.0}; +Point(3039)={ 6454.24771890, -14349.55626753, 0.0}; +Point(3040)={ 6314.26359284, -14095.34455318, 0.0}; +Point(3041)={ 6161.74179438, -13851.02311426, 0.0}; +Point(3042)={ 5996.48585003, -13626.47047308, 0.0}; +Point(3043)={ 5821.62346881, -13432.68885096, 0.0}; +Point(3044)={ 5647.39125230, -13277.94188744, 0.0}; +Point(3045)={ 5489.12852994, -13165.84935672, 0.0}; +Point(3046)={ 5359.96807529, -13092.91440296, 0.0}; +Point(3047)={ 5261.20048211, -13046.17222470, 0.0}; +Point(3048)={ 5172.83021485, -13013.03245626, 0.0}; +Point(3049)={ 5075.72745532, -12983.67592875, 0.0}; +Point(3050)={ 4936.81061319, -12953.09354774, 0.0}; +Point(3051)={ 4755.68938595, -12931.38038728, 0.0}; +Point(3052)={ 4562.14801780, -12930.71222072, 0.0}; +Point(3053)={ 4379.95451153, -12950.01353693, 0.0}; +Point(3054)={ 4214.31325976, -12982.29111390, 0.0}; +Point(3055)={ 4064.86804411, -13022.06533943, 0.0}; +Point(3056)={ 3934.84618153, -13066.37853343, 0.0}; +Point(3057)={ 3828.41073557, -13110.10377611, 0.0}; +Point(3058)={ 3748.27678176, -13146.16214544, 0.0}; +Point(3059)={ 3697.34470359, -13169.96560356, 0.0}; +Point(3060)={ 3678.67120147, -13179.13384384, 0.0}; +Point(3061)={ 7371.55871893, -16872.02136131, 0.0}; +Point(3062)={ 7371.60122616, -16858.39524931, 0.0}; +Point(3063)={ 7371.67497717, -16834.71559103, 0.0}; +Point(3064)={ 7369.27106630, -16801.21891861, 0.0}; +Point(3065)={ 7366.09438583, -16758.02384092, 0.0}; +Point(3066)={ 7362.21947033, -16705.33300185, 0.0}; +Point(3067)={ 7356.14955619, -16643.59184576, 0.0}; +Point(3068)={ 7346.08180819, -16573.24268287, 0.0}; +Point(3069)={ 7334.60642463, -16494.22351530, 0.0}; +Point(3070)={ 7316.99266483, -16407.45725913, 0.0}; +Point(3071)={ 7296.72328087, -16312.11090988, 0.0}; +Point(3072)={ 7270.03981137, -16208.39974607, 0.0}; +Point(3073)={ 7237.64421319, -16094.39154991, 0.0}; +Point(3074)={ 7198.54403078, -15968.13461293, 0.0}; +Point(3075)={ 7150.39666554, -15826.80974633, 0.0}; +Point(3076)={ 7091.34208358, -15666.78738158, 0.0}; +Point(3077)={ 7020.40017017, -15485.09563686, 0.0}; +Point(3078)={ 6937.55339353, -15281.00709015, 0.0}; +Point(3079)={ 6842.95493637, -15056.41458620, 0.0}; +Point(3080)={ 6738.33016106, -14814.61733206, 0.0}; +Point(3081)={ 6624.65751732, -14560.49121981, 0.0}; +Point(3082)={ 6500.75875188, -14299.74602750, 0.0}; +Point(3083)={ 6365.52867692, -14038.45803556, 0.0}; +Point(3084)={ 6217.22243941, -13784.94377270, 0.0}; +Point(3085)={ 6054.80086505, -13548.01976618, 0.0}; +Point(3086)={ 5879.32398998, -13339.76580528, 0.0}; +Point(3087)={ 5700.95153062, -13169.89371346, 0.0}; +Point(3088)={ 5534.54152491, -13044.13687301, 0.0}; +Point(3089)={ 5395.16542846, -12963.92525046, 0.0}; +Point(3090)={ 5289.50049941, -12913.00110567, 0.0}; +Point(3091)={ 5197.20232952, -12876.64254131, 0.0}; +Point(3092)={ 5095.39262945, -12846.08915140, 0.0}; +Point(3093)={ 4945.40921748, -12815.03762382, 0.0}; +Point(3094)={ 4747.74033906, -12797.03679363, 0.0}; +Point(3095)={ 4535.31978867, -12802.61709114, 0.0}; +Point(3096)={ 4336.25581138, -12829.45756314, 0.0}; +Point(3097)={ 4158.64750262, -12870.85323362, 0.0}; +Point(3098)={ 4001.52170161, -12921.16758583, 0.0}; +Point(3099)={ 3866.31052963, -12974.31934425, 0.0}; +Point(3100)={ 3755.34620334, -13022.76749218, 0.0}; +Point(3101)={ 3672.74967084, -13063.71027463, 0.0}; +Point(3102)={ 3621.00270763, -13091.84496428, 0.0}; +Point(3103)={ 3602.02558247, -13102.48822485, 0.0}; +Point(3104)={ 7412.17926919, -16912.64191157, 0.0}; +Point(3105)={ 7412.18671285, -16898.43999317, 0.0}; +Point(3106)={ 7412.19954337, -16873.74016150, 0.0}; +Point(3107)={ 7412.21785870, -16838.68570704, 0.0}; +Point(3108)={ 7409.15537967, -16793.57555156, 0.0}; +Point(3109)={ 7404.97556788, -16738.53163398, 0.0}; +Point(3110)={ 7400.13072370, -16673.77256289, 0.0}; +Point(3111)={ 7390.18138869, -16600.04162707, 0.0}; +Point(3112)={ 7378.36379259, -16517.13980651, 0.0}; +Point(3113)={ 7360.94954251, -16425.77444493, 0.0}; +Point(3114)={ 7340.27281397, -16325.34260577, 0.0}; +Point(3115)={ 7312.30648818, -16216.06818651, 0.0}; +Point(3116)={ 7278.70403741, -16095.93836234, 0.0}; +Point(3117)={ 7237.72638729, -15963.33619370, 0.0}; +Point(3118)={ 7187.63465932, -15815.43543986, 0.0}; +Point(3119)={ 7126.82611567, -15648.91583603, 0.0}; +Point(3120)={ 7054.41456883, -15461.31646858, 0.0}; +Point(3121)={ 6970.84918503, -15252.13586978, 0.0}; +Point(3122)={ 6877.23613153, -15022.97099884, 0.0}; +Point(3123)={ 6774.56090992, -14777.27551878, 0.0}; +Point(3124)={ 6664.43468115, -14519.01582380, 0.0}; +Point(3125)={ 6544.58027245, -14253.56584568, 0.0}; +Point(3126)={ 6413.53529819, -13986.48590159, 0.0}; +Point(3127)={ 6270.48320830, -13724.23993001, 0.0}; +Point(3128)={ 6110.48572105, -13476.65552292, 0.0}; +Point(3129)={ 5937.22715504, -13253.10434803, 0.0}; +Point(3130)={ 5755.84833794, -13067.34317319, 0.0}; +Point(3131)={ 5580.96117716, -12927.88118080, 0.0}; +Point(3132)={ 5432.41948488, -12836.14530118, 0.0}; +Point(3133)={ 5319.05359835, -12781.86288976, 0.0}; +Point(3134)={ 5223.34848420, -12743.72019728, 0.0}; +Point(3135)={ 5117.18238126, -12710.83214213, 0.0}; +Point(3136)={ 4955.89332081, -12678.81137148, 0.0}; +Point(3137)={ 4742.03898410, -12663.27997597, 0.0}; +Point(3138)={ 4511.10898597, -12676.42313147, 0.0}; +Point(3139)={ 4295.32497797, -12713.97101663, 0.0}; +Point(3140)={ 4106.18036517, -12766.74677221, 0.0}; +Point(3141)={ 3941.40522258, -12825.67461604, 0.0}; +Point(3142)={ 3800.65910065, -12885.41842228, 0.0}; +Point(3143)={ 3687.31192121, -12942.47359759, 0.0}; +Point(3144)={ 3602.38170291, -12988.05485849, 0.0}; +Point(3145)={ 3548.83925020, -13018.30864103, 0.0}; +Point(3146)={ 3529.20296923, -13029.66561160, 0.0}; +Point(3147)={ 7449.70736989, -16950.17001226, 0.0}; +Point(3148)={ 7449.67446107, -16935.41334520, 0.0}; +Point(3149)={ 7449.61716446, -16909.73212554, 0.0}; +Point(3150)={ 7449.53577390, -16873.26533426, 0.0}; +Point(3151)={ 7448.85232825, -16826.21032633, 0.0}; +Point(3152)={ 7444.43461312, -16768.89481876, 0.0}; +Point(3153)={ 7439.23178759, -16701.39354197, 0.0}; +Point(3154)={ 7430.48626893, -16624.25478040, 0.0}; +Point(3155)={ 7417.94350350, -16537.65561484, 0.0}; +Point(3156)={ 7400.74952703, -16441.83267537, 0.0}; +Point(3157)={ 7379.36232059, -16336.53885202, 0.0}; +Point(3158)={ 7350.38395068, -16221.86738644, 0.0}; +Point(3159)={ 7315.36230709, -16096.05393498, 0.0}; +Point(3160)={ 7272.73784482, -15957.50526027, 0.0}; +Point(3161)={ 7220.71957973, -15803.60089963, 0.0}; +Point(3162)={ 7158.16892547, -15631.23292854, 0.0}; +Point(3163)={ 7084.70312111, -15438.26217581, 0.0}; +Point(3164)={ 7001.09474037, -15224.40832881, 0.0}; +Point(3165)={ 6907.69814071, -14991.68587741, 0.0}; +Point(3166)={ 6807.71272534, -14742.41352215, 0.0}; +Point(3167)={ 6699.65887068, -14481.27675407, 0.0}; +Point(3168)={ 6584.37947343, -14211.62737558, 0.0}; +Point(3169)={ 6458.46700169, -13939.09681039, 0.0}; +Point(3170)={ 6319.86347894, -13669.62431680, 0.0}; +Point(3171)={ 6164.87880797, -13411.20115509, 0.0}; +Point(3172)={ 5994.32904913, -13173.46872776, 0.0}; +Point(3173)={ 5810.80714312, -12971.79075205, 0.0}; +Point(3174)={ 5629.83665002, -12816.39785501, 0.0}; +Point(3175)={ 5471.50595528, -12711.76504838, 0.0}; +Point(3176)={ 5349.48309048, -12651.91046871, 0.0}; +Point(3177)={ 5251.12578017, -12613.51469174, 0.0}; +Point(3178)={ 5141.40385974, -12579.26425065, 0.0}; +Point(3179)={ 4968.94499762, -12545.88716653, 0.0}; +Point(3180)={ 4739.18953091, -12533.65233362, 0.0}; +Point(3181)={ 4490.26311001, -12555.71436674, 0.0}; +Point(3182)={ 4258.27993173, -12605.00492167, 0.0}; +Point(3183)={ 4057.00734173, -12667.00562647, 0.0}; +Point(3184)={ 3885.16669529, -12735.31757676, 0.0}; +Point(3185)={ 3740.66074078, -12804.31405007, 0.0}; +Point(3186)={ 3623.21376891, -12865.41015412, 0.0}; +Point(3187)={ 3536.63027422, -12916.14889298, 0.0}; +Point(3188)={ 3482.67420858, -12950.53802123, 0.0}; +Point(3189)={ 3462.88219838, -12963.34484076, 0.0}; +Point(3190)={ 7483.92813427, -16984.39077664, 0.0}; +Point(3191)={ 7483.85203262, -16969.09924333, 0.0}; +Point(3192)={ 7483.71961380, -16942.47218895, 0.0}; +Point(3193)={ 7483.53156341, -16904.64546031, 0.0}; +Point(3194)={ 7483.28846910, -16855.78095705, 0.0}; +Point(3195)={ 7480.16448192, -16796.19444713, 0.0}; +Point(3196)={ 7474.56058016, -16726.04792812, 0.0}; +Point(3197)={ 7466.84356003, -16645.61142865, 0.0}; +Point(3198)={ 7453.76299006, -16555.39611277, 0.0}; +Point(3199)={ 7436.73032557, -16455.28709345, 0.0}; +Point(3200)={ 7414.20825459, -16345.44724975, 0.0}; +Point(3201)={ 7384.41245312, -16225.69842352, 0.0}; +Point(3202)={ 7348.07524031, -16094.65756286, 0.0}; +Point(3203)={ 7303.65646386, -15950.77393763, 0.0}; +Point(3204)={ 7249.83693064, -15791.44158071, 0.0}; +Point(3205)={ 7185.69029660, -15613.83307607, 0.0}; +Point(3206)={ 7111.14437779, -15416.17722405, 0.0}; +Point(3207)={ 7027.08634113, -15198.46961723, 0.0}; +Point(3208)={ 6935.25065768, -14962.26980061, 0.0}; +Point(3209)={ 6836.65240781, -14710.50381876, 0.0}; +Point(3210)={ 6732.56553498, -14446.23307333, 0.0}; +Point(3211)={ 6620.36536501, -14173.64481976, 0.0}; +Point(3212)={ 6499.32241905, -13896.54081021, 0.0}; +Point(3213)={ 6365.95600185, -13620.49066641, 0.0}; +Point(3214)={ 6216.72772975, -13352.17272389, 0.0}; +Point(3215)={ 6049.41645336, -13101.59870730, 0.0}; +Point(3216)={ 5867.90325857, -12881.64370238, 0.0}; +Point(3217)={ 5681.31152782, -12709.31471256, 0.0}; +Point(3218)={ 5511.93698600, -12592.84207680, 0.0}; +Point(3219)={ 5381.16057121, -12524.07508373, 0.0}; +Point(3220)={ 5280.03970365, -12484.62730193, 0.0}; +Point(3221)={ 5167.50104296, -12451.61260659, 0.0}; +Point(3222)={ 4984.81145584, -12416.81965970, 0.0}; +Point(3223)={ 4739.48982388, -12408.86483419, 0.0}; +Point(3224)={ 4473.87481196, -12440.91165765, 0.0}; +Point(3225)={ 4225.85318770, -12499.97319355, 0.0}; +Point(3226)={ 4012.43655787, -12573.77925159, 0.0}; +Point(3227)={ 3833.15979158, -12651.98960658, 0.0}; +Point(3228)={ 3683.50458632, -12726.86049998, 0.0}; +Point(3229)={ 3564.46222233, -12796.08782474, 0.0}; +Point(3230)={ 3475.22261375, -12849.91107978, 0.0}; +Point(3231)={ 3419.64715998, -12886.20147587, 0.0}; +Point(3232)={ 3399.36749202, -12899.83013439, 0.0}; +Point(3233)={ 7514.13382684, -17014.59646921, 0.0}; +Point(3234)={ 7514.97153258, -16998.82364443, 0.0}; +Point(3235)={ 7514.76252240, -16971.29208723, 0.0}; +Point(3236)={ 7514.46536360, -16932.16604790, 0.0}; +Point(3237)={ 7514.08132944, -16881.59430171, 0.0}; +Point(3238)={ 7512.56967850, -16819.80730834, 0.0}; +Point(3239)={ 7506.65608125, -16747.12592878, 0.0}; +Point(3240)={ 7499.72377975, -16663.56671538, 0.0}; +Point(3241)={ 7485.87543528, -16569.95816725, 0.0}; +Point(3242)={ 7468.64071456, -16465.94142156, 0.0}; +Point(3243)={ 7445.29053624, -16351.92480230, 0.0}; +Point(3244)={ 7414.57808704, -16227.69117004, 0.0}; +Point(3245)={ 7376.90591232, -16092.04738421, 0.0}; +Point(3246)={ 7330.93160650, -15943.38326329, 0.0}; +Point(3247)={ 7275.52079477, -15779.16600355, 0.0}; +Point(3248)={ 7209.98229397, -15596.85134190, 0.0}; +Point(3249)={ 7134.66311586, -15394.98492401, 0.0}; +Point(3250)={ 7050.31222989, -15173.96165573, 0.0}; +Point(3251)={ 6959.29691629, -14935.12492204, 0.0}; +Point(3252)={ 6863.12980542, -14680.92907444, 0.0}; +Point(3253)={ 6761.38396412, -14414.62425057, 0.0}; +Point(3254)={ 6653.35557462, -14139.17204826, 0.0}; +Point(3255)={ 6537.69410206, -13857.92456374, 0.0}; +Point(3256)={ 6409.56087269, -13576.10107695, 0.0}; +Point(3257)={ 6265.33738555, -13299.54936749, 0.0}; +Point(3258)={ 6103.36811156, -13036.45148845, 0.0}; +Point(3259)={ 5922.90506070, -12800.97439259, 0.0}; +Point(3260)={ 5733.04977411, -12609.86328197, 0.0}; +Point(3261)={ 5554.73392575, -12478.36669293, 0.0}; +Point(3262)={ 5414.25734271, -12400.96084104, 0.0}; +Point(3263)={ 5310.58760876, -12358.24999311, 0.0}; +Point(3264)={ 5196.06628967, -12323.96977739, 0.0}; +Point(3265)={ 5003.06527257, -12292.31178729, 0.0}; +Point(3266)={ 4743.98432626, -12289.63863134, 0.0}; +Point(3267)={ 4463.19423515, -12328.51932368, 0.0}; +Point(3268)={ 4200.55688368, -12399.81343980, 0.0}; +Point(3269)={ 3974.61639141, -12485.96108853, 0.0}; +Point(3270)={ 3786.14748677, -12572.85447460, 0.0}; +Point(3271)={ 3632.09239199, -12656.39194467, 0.0}; +Point(3272)={ 3509.28402501, -12729.62102100, 0.0}; +Point(3273)={ 3419.69583761, -12789.74797992, 0.0}; +Point(3274)={ 3362.69551033, -12828.02935957, 0.0}; +Point(3275)={ 3341.90810630, -12842.37074867, 0.0}; +Point(3276)={ 7540.01122616, -17040.47386854, 0.0}; +Point(3277)={ 7541.13159515, -17024.22151524, 0.0}; +Point(3278)={ 7542.57733050, -16995.88055781, 0.0}; +Point(3279)={ 7542.16645998, -16955.52327810, 0.0}; +Point(3280)={ 7541.63531556, -16903.34889201, 0.0}; +Point(3281)={ 7540.98566021, -16839.53594948, 0.0}; +Point(3282)={ 7535.08832148, -16764.51451782, 0.0}; +Point(3283)={ 7527.97178936, -16678.25384297, 0.0}; +Point(3284)={ 7514.44019227, -16581.53188550, 0.0}; +Point(3285)={ 7497.12408099, -16474.14423853, 0.0}; +Point(3286)={ 7472.72797030, -16356.64163509, 0.0}; +Point(3287)={ 7441.25871620, -16228.56149077, 0.0}; +Point(3288)={ 7402.35128544, -16088.90498376, 0.0}; +Point(3289)={ 7354.90107786, -15935.97084563, 0.0}; +Point(3290)={ 7297.86607879, -15767.36035648, 0.0}; +Point(3291)={ 7230.93600507, -15580.82523673, 0.0}; +Point(3292)={ 7154.69312734, -15375.30613582, 0.0}; +Point(3293)={ 7070.53695188, -15151.26475665, 0.0}; +Point(3294)={ 6980.54896151, -14910.15418027, 0.0}; +Point(3295)={ 6885.91622433, -14654.26627089, 0.0}; +Point(3296)={ 6787.72864909, -14385.84666363, 0.0}; +Point(3297)={ 6683.36978879, -14108.13384092, 0.0}; +Point(3298)={ 6571.41721850, -13823.99439599, 0.0}; +Point(3299)={ 6448.83118194, -13537.07768179, 0.0}; +Point(3300)={ 6310.54891195, -13252.99347665, 0.0}; +Point(3301)={ 6154.11458791, -12978.97388535, 0.0}; +Point(3302)={ 5978.29099493, -12727.15041100, 0.0}; +Point(3303)={ 5786.97528155, -12516.70370415, 0.0}; +Point(3304)={ 5600.54662575, -12367.11343505, 0.0}; +Point(3305)={ 5448.58672579, -12282.83287209, 0.0}; +Point(3306)={ 5343.38222637, -12236.93094609, 0.0}; +Point(3307)={ 5226.76727955, -12201.16846230, 0.0}; +Point(3308)={ 5024.26491833, -12168.75210022, 0.0}; +Point(3309)={ 4753.12798286, -12171.47510911, 0.0}; +Point(3310)={ 4460.18160906, -12221.12687751, 0.0}; +Point(3311)={ 4185.75898266, -12304.68099788, 0.0}; +Point(3312)={ 3947.28620485, -12400.46025481, 0.0}; +Point(3313)={ 3748.69793629, -12498.35331570, 0.0}; +Point(3314)={ 3587.16764244, -12589.58332017, 0.0}; +Point(3315)={ 3460.50894364, -12669.52256347, 0.0}; +Point(3316)={ 3367.92869816, -12732.67164894, 0.0}; +Point(3317)={ 3310.59095754, -12774.53764129, 0.0}; +Point(3318)={ 3289.90316145, -12790.36580382, 0.0}; +Point(3319)={ 7563.40361787, -17063.86626025, 0.0}; +Point(3320)={ 7564.50665097, -17047.20088169, 0.0}; +Point(3321)={ 7566.42966214, -17018.14552864, 0.0}; +Point(3322)={ 7567.15884713, -16976.78168961, 0.0}; +Point(3323)={ 7566.48881966, -16923.25549542, 0.0}; +Point(3324)={ 7565.66903747, -16857.76743523, 0.0}; +Point(3325)={ 7560.80176437, -16780.70399176, 0.0}; +Point(3326)={ 7553.20354900, -16692.17642817, 0.0}; +Point(3327)={ 7539.84491909, -16592.79884653, 0.0}; +Point(3328)={ 7522.49247099, -16482.45880837, 0.0}; +Point(3329)={ 7497.40733190, -16361.77159108, 0.0}; +Point(3330)={ 7465.03749270, -16230.18185834, 0.0}; +Point(3331)={ 7425.04279767, -16086.66326635, 0.0}; +Point(3332)={ 7376.08994990, -15929.59681874, 0.0}; +Point(3333)={ 7317.54349578, -15756.71092552, 0.0}; +Point(3334)={ 7249.35906717, -15566.14104743, 0.0}; +Point(3335)={ 7172.34322396, -15357.23204433, 0.0}; +Point(3336)={ 7088.27539301, -15130.56883129, 0.0}; +Point(3337)={ 6999.59748705, -14887.37471532, 0.0}; +Point(3338)={ 6906.45867313, -14630.09405770, 0.0}; +Point(3339)={ 6810.73896549, -14360.25917533, 0.0}; +Point(3340)={ 6709.58342614, -14080.76006976, 0.0}; +Point(3341)={ 6602.38951026, -13793.73503070, 0.0}; +Point(3342)={ 6484.15096376, -13502.94614340, 0.0}; +Point(3343)={ 6352.43517848, -13212.11788305, 0.0}; +Point(3344)={ 6202.74177549, -12927.93593089, 0.0}; +Point(3345)={ 6030.91875877, -12662.27018453, 0.0}; +Point(3346)={ 5839.96680537, -12433.13391292, 0.0}; +Point(3347)={ 5646.70271361, -12264.50765496, 0.0}; +Point(3348)={ 5485.43294792, -12166.07767102, 0.0}; +Point(3349)={ 5377.62972917, -12121.20424355, 0.0}; +Point(3350)={ 5260.81811298, -12083.21032636, 0.0}; +Point(3351)={ 5048.99188019, -12050.57594335, 0.0}; +Point(3352)={ 4767.81824463, -12059.87043205, 0.0}; +Point(3353)={ 4467.62233222, -12120.32393264, 0.0}; +Point(3354)={ 4185.68905142, -12209.20810638, 0.0}; +Point(3355)={ 3940.78446040, -12314.25775805, 0.0}; +Point(3356)={ 3734.82765260, -12418.70349371, 0.0}; +Point(3357)={ 3567.24468257, -12516.01683050, 0.0}; +Point(3358)={ 3437.01047975, -12601.23265034, 0.0}; +Point(3359)={ 3341.98038817, -12667.31747671, 0.0}; +Point(3360)={ 3282.92678564, -12710.22705081, 0.0}; +Point(3361)={ 3261.49903084, -12726.18968896, 0.0}; +Point(3362)={ 7583.98935745, -17084.45199982, 0.0}; +Point(3363)={ 7585.07299784, -17067.45821867, 0.0}; +Point(3364)={ 7586.96270842, -17037.82284769, 0.0}; +Point(3365)={ 7589.13106659, -16995.66567105, 0.0}; +Point(3366)={ 7588.33567219, -16941.05681590, 0.0}; +Point(3367)={ 7587.36221757, -16874.21782909, 0.0}; +Point(3368)={ 7583.42226798, -16795.47123665, 0.0}; +Point(3369)={ 7575.53815724, -16705.02722407, 0.0}; +Point(3370)={ 7562.59950655, -16603.31105948, 0.0}; +Point(3371)={ 7544.96077131, -16490.35555375, 0.0}; +Point(3372)={ 7519.10971863, -16366.72456424, 0.0}; +Point(3373)={ 7486.05604201, -16231.72935638, 0.0}; +Point(3374)={ 7444.85194788, -16084.48658303, 0.0}; +Point(3375)={ 7394.47314923, -15923.38038200, 0.0}; +Point(3376)={ 7334.50221337, -15746.39361898, 0.0}; +Point(3377)={ 7265.11906143, -15552.08467221, 0.0}; +Point(3378)={ 7187.37040934, -15340.16715662, 0.0}; +Point(3379)={ 7103.40052131, -15111.28573247, 0.0}; +Point(3380)={ 7015.29019453, -14866.64029840, 0.0}; +Point(3381)={ 6924.46968939, -14607.95700031, 0.0}; +Point(3382)={ 6830.72382529, -14337.17207168, 0.0}; +Point(3383)={ 6733.93996789, -14055.76278547, 0.0}; +Point(3384)={ 6629.49903144, -13766.93647827, 0.0}; +Point(3385)={ 6516.31639609, -13472.60382046, 0.0}; +Point(3386)={ 6390.53291516, -13176.21935655, 0.0}; +Point(3387)={ 6246.38239549, -12883.87944527, 0.0}; +Point(3388)={ 6081.15083893, -12604.78768428, 0.0}; +Point(3389)={ 5893.71914975, -12356.33971452, 0.0}; +Point(3390)={ 5695.66584538, -12167.12546431, 0.0}; +Point(3391)={ 5523.14469157, -12053.93528736, 0.0}; +Point(3392)={ 5413.12159669, -12005.29223303, 0.0}; +Point(3393)={ 5295.31311752, -11970.20819980, 0.0}; +Point(3394)={ 5074.43451092, -11939.37557464, 0.0}; +Point(3395)={ 4785.15306300, -11955.75760435, 0.0}; +Point(3396)={ 4479.75638188, -12021.02911277, 0.0}; +Point(3397)={ 4196.75229120, -12120.00571612, 0.0}; +Point(3398)={ 3949.13164523, -12227.09483308, 0.0}; +Point(3399)={ 3741.43693837, -12335.12028430, 0.0}; +Point(3400)={ 3572.21871344, -12435.57631536, 0.0}; +Point(3401)={ 3439.26346060, -12521.62122197, 0.0}; +Point(3402)={ 3343.14277467, -12589.90339761, 0.0}; +Point(3403)={ 3283.55126966, -12634.47388764, 0.0}; +Point(3404)={ 3261.49903084, -12650.46669221, 0.0}; +Point(3405)={ 7601.94572155, -17102.40836393, 0.0}; +Point(3406)={ 7603.02142858, -17085.09901071, 0.0}; +Point(3407)={ 7604.90771116, -17054.90751986, 0.0}; +Point(3408)={ 7607.60476517, -17011.96513489, 0.0}; +Point(3409)={ 7607.44286554, -16956.33365777, 0.0}; +Point(3410)={ 7606.30339768, -16888.20417513, 0.0}; +Point(3411)={ 7603.05012585, -16807.86111320, 0.0}; +Point(3412)={ 7594.90764171, -16715.59487270, 0.0}; +Point(3413)={ 7582.23030271, -16611.67988969, 0.0}; +Point(3414)={ 7564.46923678, -16496.21459679, 0.0}; +Point(3415)={ 7537.71926403, -16369.83248878, 0.0}; +Point(3416)={ 7503.96108403, -16231.62837723, 0.0}; +Point(3417)={ 7461.54112656, -16080.87856197, 0.0}; +Point(3418)={ 7409.79788518, -15916.00018756, 0.0}; +Point(3419)={ 7348.39757044, -15735.31216182, 0.0}; +Point(3420)={ 7277.89209066, -15537.74573168, 0.0}; +Point(3421)={ 7199.65235279, -15323.28424685, 0.0}; +Point(3422)={ 7115.92017221, -15092.63975231, 0.0}; +Point(3423)={ 7028.58976486, -14846.91959064, 0.0}; +Point(3424)={ 6939.98698111, -14587.21611916, 0.0}; +Point(3425)={ 6848.03964274, -14315.80739211, 0.0}; +Point(3426)={ 6753.31572071, -14033.60564978, 0.0}; +Point(3427)={ 6653.42942357, -13742.67778149, 0.0}; +Point(3428)={ 6544.65314198, -13445.51183107, 0.0}; +Point(3429)={ 6423.16151954, -13145.00955323, 0.0}; +Point(3430)={ 6285.61000163, -12845.36045612, 0.0}; +Point(3431)={ 6128.36598352, -12553.89556683, 0.0}; +Point(3432)={ 5944.05309054, -12288.89749731, 0.0}; +Point(3433)={ 5744.63387430, -12076.66911092, 0.0}; +Point(3434)={ 5559.94644762, -11949.56251917, 0.0}; +Point(3435)={ 5447.77037160, -11894.73182331, 0.0}; +Point(3436)={ 5328.77825232, -11857.13545641, 0.0}; +Point(3437)={ 5097.24042046, -11829.89841355, 0.0}; +Point(3438)={ 4799.57643032, -11854.60823540, 0.0}; +Point(3439)={ 4491.17241203, -11932.34395903, 0.0}; +Point(3440)={ 4205.66852436, -12035.19684908, 0.0}; +Point(3441)={ 3957.68118012, -12148.73962052, 0.0}; +Point(3442)={ 3748.36659541, -12259.56574936, 0.0}; +Point(3443)={ 3576.62810343, -12361.21257037, 0.0}; +Point(3444)={ 3442.94239232, -12450.73827020, 0.0}; +Point(3445)={ 3344.44952902, -12519.22622390, 0.0}; +Point(3446)={ 3283.58016282, -12564.34979756, 0.0}; +Point(3447)={ 3261.49903084, -12581.14455871, 0.0}; +Point(3448)={ 7617.75390373, -17118.21654611, 0.0}; +Point(3449)={ 7618.82990459, -17100.60611637, 0.0}; +Point(3450)={ 7620.70727436, -17069.88289344, 0.0}; +Point(3451)={ 7623.37807968, -17026.17557432, 0.0}; +Point(3452)={ 7624.23351309, -16969.57083846, 0.0}; +Point(3453)={ 7622.95496629, -16900.20443477, 0.0}; +Point(3454)={ 7620.30884258, -16818.32739091, 0.0}; +Point(3455)={ 7611.73012070, -16724.32266370, 0.0}; +Point(3456)={ 7599.03760056, -16618.32286782, 0.0}; +Point(3457)={ 7580.90572275, -16500.48108806, 0.0}; +Point(3458)={ 7553.73332222, -16371.35726406, 0.0}; +Point(3459)={ 7518.99835754, -16230.14366060, 0.0}; +Point(3460)={ 7475.42747289, -16076.03890877, 0.0}; +Point(3461)={ 7422.32928924, -15907.64428580, 0.0}; +Point(3462)={ 7359.59048663, -15723.61288076, 0.0}; +Point(3463)={ 7288.07492158, -15523.25400021, 0.0}; +Point(3464)={ 7209.52254994, -15306.72014126, 0.0}; +Point(3465)={ 7126.27361969, -15074.69239895, 0.0}; +Point(3466)={ 7039.61627604, -14828.32023130, 0.0}; +Point(3467)={ 6952.41769985, -14568.17347020, 0.0}; +Point(3468)={ 6862.81325392, -14296.16689960, 0.0}; +Point(3469)={ 6770.72056827, -14013.22529650, 0.0}; +Point(3470)={ 6674.28538765, -13720.85570851, 0.0}; +Point(3471)={ 6568.65875427, -13421.65567966, 0.0}; +Point(3472)={ 6452.29855697, -13117.33401995, 0.0}; +Point(3473)={ 6320.98923479, -12811.55976889, 0.0}; +Point(3474)={ 6169.27429006, -12510.94701145, 0.0}; +Point(3475)={ 5993.88977516, -12227.91863093, 0.0}; +Point(3476)={ 5793.75890571, -11993.40039620, 0.0}; +Point(3477)={ 5599.67209347, -11844.71747025, 0.0}; +Point(3478)={ 5480.80612467, -11790.38971126, 0.0}; +Point(3479)={ 5360.42948435, -11751.91548201, 0.0}; +Point(3480)={ 5116.95985496, -11726.70585748, 0.0}; +Point(3481)={ 4811.84564120, -11764.57577894, 0.0}; +Point(3482)={ 4500.33536339, -11849.57250049, 0.0}; +Point(3483)={ 4214.88142660, -11961.52810701, 0.0}; +Point(3484)={ 3965.19340161, -12077.63188976, 0.0}; +Point(3485)={ 3754.27725438, -12191.05585645, 0.0}; +Point(3486)={ 3581.78949910, -12296.42803413, 0.0}; +Point(3487)={ 3445.15668572, -12385.76646710, 0.0}; +Point(3488)={ 3346.59614387, -12457.50152223, 0.0}; +Point(3489)={ 3284.18300145, -12502.70913091, 0.0}; +Point(3490)={ 3261.49903084, -12519.49801548, 0.0}; +Point(3491)={ 7631.30734209, -17131.76998447, 0.0}; +Point(3492)={ 7632.37139391, -17113.86778279, 0.0}; +Point(3493)={ 7634.22799978, -17082.62996780, 0.0}; +Point(3494)={ 7636.86961811, -17038.18386527, 0.0}; +Point(3495)={ 7638.57127830, -16980.63368647, 0.0}; +Point(3496)={ 7637.16795223, -16910.07463191, 0.0}; +Point(3497)={ 7634.98813474, -16826.72658343, 0.0}; +Point(3498)={ 7626.15495717, -16731.03772781, 0.0}; +Point(3499)={ 7613.40004739, -16623.05429410, 0.0}; +Point(3500)={ 7594.68717221, -16502.98588014, 0.0}; +Point(3501)={ 7567.05639884, -16371.26578538, 0.0}; +Point(3502)={ 7531.36854756, -16227.19871307, 0.0}; +Point(3503)={ 7486.71588342, -16069.92374500, 0.0}; +Point(3504)={ 7432.26971145, -15898.31179526, 0.0}; +Point(3505)={ 7368.32777809, -15711.33142702, 0.0}; +Point(3506)={ 7295.97950238, -15508.65413976, 0.0}; +Point(3507)={ 7217.22301771, -15290.54927647, 0.0}; +Point(3508)={ 7134.44391962, -15057.59146825, 0.0}; +Point(3509)={ 7048.52114782, -14810.88404201, 0.0}; +Point(3510)={ 6962.65870886, -14550.58850562, 0.0}; +Point(3511)={ 6875.43476546, -14278.17517810, 0.0}; +Point(3512)={ 6785.44207382, -13994.81770939, 0.0}; +Point(3513)={ 6690.96183376, -13701.73529287, 0.0}; +Point(3514)={ 6590.00218023, -13400.30236147, 0.0}; +Point(3515)={ 6477.91131454, -13092.94447143, 0.0}; +Point(3516)={ 6351.25712111, -12782.51479779, 0.0}; +Point(3517)={ 6206.22922882, -12473.75416935, 0.0}; +Point(3518)={ 6037.57192296, -12176.93288004, 0.0}; +Point(3519)={ 5840.70793940, -11919.96955747, 0.0}; +Point(3520)={ 5637.80792995, -11748.91460908, 0.0}; +Point(3521)={ 5514.38389382, -11684.66621234, 0.0}; +Point(3522)={ 5390.16554065, -11648.14849075, 0.0}; +Point(3523)={ 5133.31671334, -11631.82630415, 0.0}; +Point(3524)={ 4821.07587934, -11679.91529542, 0.0}; +Point(3525)={ 4509.16129318, -11777.94116691, 0.0}; +Point(3526)={ 4222.34908407, -11893.48187585, 0.0}; +Point(3527)={ 3972.08623212, -12014.58975795, 0.0}; +Point(3528)={ 3760.38438682, -12132.13810074, 0.0}; +Point(3529)={ 3585.08664935, -12237.92565432, 0.0}; +Point(3530)={ 3447.42670864, -12330.12108209, 0.0}; +Point(3531)={ 3346.69682918, -12402.12890823, 0.0}; +Point(3532)={ 3284.41169816, -12449.61809709, 0.0}; +Point(3533)={ 3261.49903084, -12466.87103519, 0.0}; +Point(3534)={ 7642.76284324, -17143.22548561, 0.0}; +Point(3535)={ 7643.81768842, -17125.04493018, 0.0}; +Point(3536)={ 7645.65862343, -17093.31651912, 0.0}; +Point(3537)={ 7648.27830255, -17048.16620705, 0.0}; +Point(3538)={ 7650.67359445, -16989.71103572, 0.0}; +Point(3539)={ 7649.15988671, -16918.01643102, 0.0}; +Point(3540)={ 7647.32277148, -16833.27475282, 0.0}; +Point(3541)={ 7638.25551034, -16735.98433468, 0.0}; +Point(3542)={ 7625.46181517, -16626.11314925, 0.0}; +Point(3543)={ 7606.16755086, -16503.93494698, 0.0}; +Point(3544)={ 7577.97967820, -16369.76549583, 0.0}; +Point(3545)={ 7541.40025256, -16222.96199645, 0.0}; +Point(3546)={ 7495.59959954, -16062.72180666, 0.0}; +Point(3547)={ 7439.88310797, -15888.17822962, 0.0}; +Point(3548)={ 7374.88211789, -15698.66035637, 0.0}; +Point(3549)={ 7301.84814384, -15494.15241810, 0.0}; +Point(3550)={ 7223.01271717, -15274.94481555, 0.0}; +Point(3551)={ 7140.53694829, -15041.53206250, 0.0}; +Point(3552)={ 7055.82553445, -14794.62209031, 0.0}; +Point(3553)={ 6971.20951701, -14534.41969763, 0.0}; +Point(3554)={ 6885.49996694, -14262.02870110, 0.0}; +Point(3555)={ 6797.54429203, -13978.39150742, 0.0}; +Point(3556)={ 6705.75660061, -13684.53113034, 0.0}; +Point(3557)={ 6607.74062136, -13381.69418727, 0.0}; +Point(3558)={ 6498.68980577, -13072.13032899, 0.0}; +Point(3559)={ 6377.21228711, -12757.55482975, 0.0}; +Point(3560)={ 6238.67712852, -12441.96033243, 0.0}; +Point(3561)={ 6077.31588414, -12133.38138809, 0.0}; +Point(3562)={ 5887.63816805, -11853.92096997, 0.0}; +Point(3563)={ 5678.49880322, -11657.32603560, 0.0}; +Point(3564)={ 5545.90486178, -11587.10361084, 0.0}; +Point(3565)={ 5417.15576736, -11548.17619973, 0.0}; +Point(3566)={ 5145.72275047, -11540.67573139, 0.0}; +Point(3567)={ 4828.98241900, -11607.13381820, 0.0}; +Point(3568)={ 4516.11396681, -11711.29414821, 0.0}; +Point(3569)={ 4230.24808213, -11834.55726414, 0.0}; +Point(3570)={ 3979.86309536, -11960.46679759, 0.0}; +Point(3571)={ 3766.08153024, -12078.91484399, 0.0}; +Point(3572)={ 3589.47782195, -12187.15851202, 0.0}; +Point(3573)={ 3450.77018588, -12281.72739042, 0.0}; +Point(3574)={ 3348.17811781, -12354.22561673, 0.0}; +Point(3575)={ 3284.57585048, -12401.94986858, 0.0}; +Point(3576)={ 3261.49903084, -12419.72170824, 0.0}; +Point(3577)={ 7652.32667495, -17152.78931732, 0.0}; +Point(3578)={ 7653.37515384, -17134.34451190, 0.0}; +Point(3579)={ 7655.20511924, -17102.15048024, 0.0}; +Point(3580)={ 7657.80951926, -17056.33249132, 0.0}; +Point(3581)={ 7660.76377137, -16997.01503058, 0.0}; +Point(3582)={ 7659.15290427, -16924.24178057, 0.0}; +Point(3583)={ 7657.24830637, -16838.19746162, 0.0}; +Point(3584)={ 7648.26987946, -16739.36238577, 0.0}; +Point(3585)={ 7635.33651768, -16627.70031416, 0.0}; +Point(3586)={ 7615.64901257, -16503.46746545, 0.0}; +Point(3587)={ 7586.73528498, -16366.96511203, 0.0}; +Point(3588)={ 7549.31492149, -16217.50481317, 0.0}; +Point(3589)={ 7502.30761176, -16054.49401424, 0.0}; +Point(3590)={ 7445.42266123, -15877.33271694, 0.0}; +Point(3591)={ 7379.50913702, -15685.72973700, 0.0}; +Point(3592)={ 7305.96703514, -15479.88399647, 0.0}; +Point(3593)={ 7227.15560449, -15260.03153778, 0.0}; +Point(3594)={ 7145.02263580, -15026.53592502, 0.0}; +Point(3595)={ 7061.61562569, -14779.65259330, 0.0}; +Point(3596)={ 6978.05621640, -14519.75617429, 0.0}; +Point(3597)={ 6893.58221619, -14247.58789994, 0.0}; +Point(3598)={ 6807.49695710, -13963.82768996, 0.0}; +Point(3599)={ 6718.03815229, -13669.40551233, 0.0}; +Point(3600)={ 6621.58524400, -13365.80187213, 0.0}; +Point(3601)={ 6516.87976373, -13053.92714873, 0.0}; +Point(3602)={ 6400.46197600, -12735.75910341, 0.0}; +Point(3603)={ 6267.52161047, -12414.60311362, 0.0}; +Point(3604)={ 6112.82920115, -12096.60519514, 0.0}; +Point(3605)={ 5930.98495932, -11798.02612436, 0.0}; +Point(3606)={ 5720.17997729, -11572.09748318, 0.0}; +Point(3607)={ 5577.29174589, -11490.39360240, 0.0}; +Point(3608)={ 5440.15531005, -11455.91133044, 0.0}; +Point(3609)={ 5154.82360602, -11461.62580974, 0.0}; +Point(3610)={ 4833.94851651, -11539.32118089, 0.0}; +Point(3611)={ 4523.12481852, -11655.18059607, 0.0}; +Point(3612)={ 4238.45109499, -11784.70481071, 0.0}; +Point(3613)={ 3986.44848306, -11911.93578996, 0.0}; +Point(3614)={ 3771.62784156, -12033.29528741, 0.0}; +Point(3615)={ 3594.09455708, -12144.38047526, 0.0}; +Point(3616)={ 3452.95558612, -12239.07922596, 0.0}; +Point(3617)={ 3349.96283359, -12313.96363548, 0.0}; +Point(3618)={ 3285.05390984, -12361.83078604, 0.0}; +Point(3619)={ 3261.49903084, -12379.66814951, 0.0}; +Point(3620)={ 7660.20990420, -17160.67254657, 0.0}; +Point(3621)={ 7661.25495509, -17141.96691917, 0.0}; +Point(3622)={ 7663.07933774, -17109.31363318, 0.0}; +Point(3623)={ 7665.67600027, -17062.83766377, 0.0}; +Point(3624)={ 7669.03759696, -17002.66849145, 0.0}; +Point(3625)={ 7667.37021680, -16928.83618471, 0.0}; +Point(3626)={ 7665.36415004, -16841.52115440, 0.0}; +Point(3627)={ 7656.42059080, -16741.18451574, 0.0}; +Point(3628)={ 7643.26705336, -16627.78944222, 0.0}; +Point(3629)={ 7623.20334952, -16501.54523782, 0.0}; +Point(3630)={ 7593.53232731, -16362.75689680, 0.0}; +Point(3631)={ 7555.20462067, -16210.73891668, 0.0}; +Point(3632)={ 7507.04334753, -16045.17200359, 0.0}; +Point(3633)={ 7449.11305228, -15865.79180958, 0.0}; +Point(3634)={ 7382.45271335, -15672.62683605, 0.0}; +Point(3635)={ 7308.59141551, -15465.96513310, 0.0}; +Point(3636)={ 7229.90926951, -15245.91571121, 0.0}; +Point(3637)={ 7148.20773936, -15012.65878533, 0.0}; +Point(3638)={ 7066.09191068, -14766.02677513, 0.0}; +Point(3639)={ 6983.34346872, -14506.62859171, 0.0}; +Point(3640)={ 6900.04380405, -14234.78274544, 0.0}; +Point(3641)={ 6815.60398591, -13951.03634541, 0.0}; +Point(3642)={ 6727.92333470, -13656.28889937, 0.0}; +Point(3643)={ 6633.63094914, -13351.87615275, 0.0}; +Point(3644)={ 6532.38128665, -13038.23395154, 0.0}; +Point(3645)={ 6417.98993780, -12718.01684252, 0.0}; +Point(3646)={ 6290.01988132, -12392.52286313, 0.0}; +Point(3647)={ 6144.35114854, -12065.67521472, 0.0}; +Point(3648)={ 5970.49630607, -11751.37160501, 0.0}; +Point(3649)={ 5762.64077695, -11495.14638023, 0.0}; +Point(3650)={ 5608.11682945, -11397.26977375, 0.0}; +Point(3651)={ 5459.52596983, -11360.36155375, 0.0}; +Point(3652)={ 5159.66884197, -11387.16392596, 0.0}; +Point(3653)={ 4838.25751500, -11483.28813783, 0.0}; +Point(3654)={ 4530.01118479, -11607.74840999, 0.0}; +Point(3655)={ 4245.44451287, -11739.38025819, 0.0}; +Point(3656)={ 3993.23759202, -11870.72826782, 0.0}; +Point(3657)={ 3777.31205651, -11995.13398578, 0.0}; +Point(3658)={ 3598.24273331, -12108.09673928, 0.0}; +Point(3659)={ 3455.22237692, -12203.75924826, 0.0}; +Point(3660)={ 3351.26909823, -12280.19154759, 0.0}; +Point(3661)={ 3285.50630816, -12328.79542475, 0.0}; +Point(3662)={ 3261.49903084, -12346.72162244, 0.0}; +Point(3663)={ 7666.62712391, -17167.08976629, 0.0}; +Point(3664)={ 7667.68245881, -17148.13653920, 0.0}; +Point(3665)={ 7669.52496090, -17115.04721136, 0.0}; +Point(3666)={ 7672.14943922, -17067.94607232, 0.0}; +Point(3667)={ 7675.55050691, -17006.95995816, 0.0}; +Point(3668)={ 7674.11231316, -16932.11854558, 0.0}; +Point(3669)={ 7671.97039958, -16843.57913090, 0.0}; +Point(3670)={ 7662.95749676, -16741.78333872, 0.0}; +Point(3671)={ 7649.52217755, -16626.67083620, 0.0}; +Point(3672)={ 7629.08589887, -16498.38031051, 0.0}; +Point(3673)={ 7598.61634808, -16357.27013476, 0.0}; +Point(3674)={ 7559.32860500, -16202.77126064, 0.0}; +Point(3675)={ 7510.08094906, -16034.92521594, 0.0}; +Point(3676)={ 7451.25251729, -15853.81358710, 0.0}; +Point(3677)={ 7384.03468730, -15659.66095723, 0.0}; +Point(3678)={ 7310.02765040, -15452.70650291, 0.0}; +Point(3679)={ 7231.58771722, -15232.86070434, 0.0}; +Point(3680)={ 7150.41978007, -15000.09486422, 0.0}; +Point(3681)={ 7069.34498662, -14753.95315625, 0.0}; +Point(3682)={ 6987.37215460, -14495.13087717, 0.0}; +Point(3683)={ 6905.23487642, -14223.64722379, 0.0}; +Point(3684)={ 6822.02864929, -13940.06125426, 0.0}; +Point(3685)={ 6735.61204932, -13645.19461169, 0.0}; +Point(3686)={ 6643.57489730, -13340.04288579, 0.0}; +Point(3687)={ 6543.63786573, -13025.50901228, 0.0}; +Point(3688)={ 6432.37021024, -12703.20640480, 0.0}; +Point(3689)={ 6309.17555641, -12374.11380687, 0.0}; +Point(3690)={ 6169.11523076, -12041.46842768, 0.0}; +Point(3691)={ 6007.75183164, -11712.14595773, 0.0}; +Point(3692)={ 5806.29393365, -11426.17654740, 0.0}; +Point(3693)={ 5638.46571456, -11308.19059567, 0.0}; +Point(3694)={ 5473.29106283, -11279.16237281, 0.0}; +Point(3695)={ 5161.53641745, -11324.67820784, 0.0}; +Point(3696)={ 4841.55662411, -11436.36858495, 0.0}; +Point(3697)={ 4535.61988576, -11565.27027443, 0.0}; +Point(3698)={ 4252.98611723, -11701.48683042, 0.0}; +Point(3699)={ 4000.51328137, -11836.32836585, 0.0}; +Point(3700)={ 3783.13603600, -11963.43339051, 0.0}; +Point(3701)={ 3601.59414393, -12077.03003055, 0.0}; +Point(3702)={ 3457.47751251, -12174.79997721, 0.0}; +Point(3703)={ 3351.86625618, -12251.73178540, 0.0}; +Point(3704)={ 3285.88035215, -12301.82654960, 0.0}; +Point(3705)={ 3261.49903084, -12319.91239424, 0.0}; +Point(3706)={ 7671.69508204, -17172.15772442, 0.0}; +Point(3707)={ 7672.89243417, -17152.95650588, 0.0}; +Point(3708)={ 7674.75903022, -17119.40851137, 0.0}; +Point(3709)={ 7677.41631941, -17071.65056715, 0.0}; +Point(3710)={ 7680.85734781, -17009.80696278, 0.0}; +Point(3711)={ 7679.57899689, -16933.90424079, 0.0}; +Point(3712)={ 7677.35187298, -16844.07648502, 0.0}; +Point(3713)={ 7668.04543525, -16740.75053069, 0.0}; +Point(3714)={ 7654.23910828, -16623.80355739, 0.0}; +Point(3715)={ 7633.20077450, -16493.36788600, 0.0}; +Point(3716)={ 7602.07138231, -16349.87338797, 0.0}; +Point(3717)={ 7561.79177134, -16193.13514707, 0.0}; +Point(3718)={ 7511.57438261, -16023.54042958, 0.0}; +Point(3719)={ 7452.05535536, -15841.40216312, 0.0}; +Point(3720)={ 7384.45456857, -15646.97362805, 0.0}; +Point(3721)={ 7310.54518076, -15440.25874211, 0.0}; +Point(3722)={ 7232.47841008, -15220.98806432, 0.0}; +Point(3723)={ 7151.85395815, -14988.95013594, 0.0}; +Point(3724)={ 7071.62607708, -14743.47287270, 0.0}; +Point(3725)={ 6990.41338002, -14485.26616483, 0.0}; +Point(3726)={ 6909.36483527, -14214.16958185, 0.0}; +Point(3727)={ 6827.08240570, -13930.82905726, 0.0}; +Point(3728)={ 6741.81252137, -13635.90531397, 0.0}; +Point(3729)={ 6651.48241639, -13330.23782068, 0.0}; +Point(3730)={ 6552.74920118, -13014.98641739, 0.0}; +Point(3731)={ 6445.06037976, -12690.72289483, 0.0}; +Point(3732)={ 6325.84632183, -12358.76742553, 0.0}; +Point(3733)={ 6191.93132637, -12021.04360832, 0.0}; +Point(3734)={ 6037.77084502, -11682.53301568, 0.0}; +Point(3735)={ 5853.00290926, -11364.42246285, 0.0}; +Point(3736)={ 5671.86473789, -11213.29909331, 0.0}; +Point(3737)={ 5480.36714453, -11191.29171234, 0.0}; +Point(3738)={ 5161.29733880, -11274.17658878, 0.0}; +Point(3739)={ 4843.04565023, -11394.63119165, 0.0}; +Point(3740)={ 4541.43054501, -11530.39672053, 0.0}; +Point(3741)={ 4261.22977641, -11669.93119067, 0.0}; +Point(3742)={ 4008.80346343, -11807.33589215, 0.0}; +Point(3743)={ 3789.19400110, -11935.89742589, 0.0}; +Point(3744)={ 3605.49236985, -12051.27153393, 0.0}; +Point(3745)={ 3459.97202058, -12151.05087740, 0.0}; +Point(3746)={ 3352.59896711, -12228.53498568, 0.0}; +Point(3747)={ 3285.97192877, -12279.65756282, 0.0}; +Point(3748)={ 3261.49903084, -12298.31039899, 0.0}; +Point(3749)={ 7675.61103563, -17176.07367800, 0.0}; +Point(3750)={ 7677.14922909, -17156.63700469, 0.0}; +Point(3751)={ 7679.02268114, -17122.61614180, 0.0}; +Point(3752)={ 7681.68996052, -17074.17729844, 0.0}; +Point(3753)={ 7685.14519063, -17011.43075835, 0.0}; +Point(3754)={ 7683.93099233, -16934.37515032, 0.0}; +Point(3755)={ 7681.62365316, -16843.08873073, 0.0}; +Point(3756)={ 7671.96560037, -16737.96562188, 0.0}; +Point(3757)={ 7657.59502428, -16618.89798861, 0.0}; +Point(3758)={ 7635.74836764, -16486.17564401, 0.0}; +Point(3759)={ 7604.09145491, -16340.43933062, 0.0}; +Point(3760)={ 7562.87178785, -16182.05760762, 0.0}; +Point(3761)={ 7511.90474406, -16011.56916105, 0.0}; +Point(3762)={ 7451.97229977, -15829.27604684, 0.0}; +Point(3763)={ 7384.21715495, -15635.28130094, 0.0}; +Point(3764)={ 7310.59376044, -15429.26925335, 0.0}; +Point(3765)={ 7232.97243414, -15210.83755456, 0.0}; +Point(3766)={ 7152.92555157, -14979.63233684, 0.0}; +Point(3767)={ 7073.38758039, -14734.87994910, 0.0}; +Point(3768)={ 6992.81817238, -14477.28283793, 0.0}; +Point(3769)={ 6912.73877277, -14206.55079847, 0.0}; +Point(3770)={ 6831.13685056, -13923.47785392, 0.0}; +Point(3771)={ 6746.97881418, -13628.49603048, 0.0}; +Point(3772)={ 6657.84380864, -13322.49719632, 0.0}; +Point(3773)={ 6560.55485964, -13006.56499183, 0.0}; +Point(3774)={ 6455.32401358, -12680.93849568, 0.0}; +Point(3775)={ 6338.40270133, -12347.14003457, 0.0}; +Point(3776)={ 6208.74694936, -12006.01465996, 0.0}; +Point(3777)={ 6065.68643638, -11658.90272063, 0.0}; +Point(3778)={ 5895.35411081, -11317.22827804, 0.0}; +Point(3779)={ 5706.17227969, -11120.20934880, 0.0}; +Point(3780)={ 5480.61102238, -11120.39495062, 0.0}; +Point(3781)={ 5156.67120115, -11227.40522353, 0.0}; +Point(3782)={ 4843.79021226, -11361.46468479, 0.0}; +Point(3783)={ 4546.54962934, -11502.18779014, 0.0}; +Point(3784)={ 4269.43798024, -11643.88102005, 0.0}; +Point(3785)={ 4017.93331008, -11782.70148635, 0.0}; +Point(3786)={ 3796.21308002, -11911.86008009, 0.0}; +Point(3787)={ 3610.29451091, -12029.57727646, 0.0}; +Point(3788)={ 3462.92166938, -12131.39079631, 0.0}; +Point(3789)={ 3353.70866033, -12209.58890843, 0.0}; +Point(3790)={ 3286.05018516, -12261.30374637, 0.0}; +Point(3791)={ 3261.49903084, -12280.56138003, 0.0}; +Point(3792)={ 3261.49903084, 12265.55515443, 0.0}; +Point(3793)={ 3286.73823413, 12245.87048966, 0.0}; +Point(3794)={ 3356.43862316, 12192.95310863, 0.0}; +Point(3795)={ 3468.47473876, 12112.92336607, 0.0}; +Point(3796)={ 3618.63190145, 12009.18654122, 0.0}; +Point(3797)={ 3805.94194554, 11889.98120022, 0.0}; +Point(3798)={ 4026.77902435, 11760.13044391, 0.0}; +Point(3799)={ 4276.43492406, 11622.68587966, 0.0}; +Point(3800)={ 4549.83022724, 11479.78765809, 0.0}; +Point(3801)={ 4842.85270269, 11335.41852983, 0.0}; +Point(3802)={ 5150.24046531, 11191.39954749, 0.0}; +Point(3803)={ 5466.38834009, 11048.90671163, 0.0}; +Point(3804)={ 5788.21690387, 10913.58221970, 0.0}; +Point(3805)={ 5692.75537376, 10682.98904724, 0.0}; +Point(3806)={ 5550.14412492, 10358.00819078, 0.0}; +Point(3807)={ 5371.13474278, 9942.05041434, 0.0}; +Point(3808)={ 5156.36796989, 9442.78082830, 0.0}; +Point(3809)={ 4911.77855916, 8865.95269736, 0.0}; +Point(3810)={ 4643.38990185, 8217.27873787, 0.0}; +Point(3811)={ 4357.35957102, 7502.51965817, 0.0}; +Point(3812)={ 4064.74297101, 6725.61824822, 0.0}; +Point(3813)={ 3780.08677926, 5889.82758395, 0.0}; +Point(3814)={ 3518.08762382, 4999.42444064, 0.0}; +Point(3815)={ 3291.43665365, 4060.56306127, 0.0}; +Point(3816)={ 3108.96616483, 3081.44009243, 0.0}; +Point(3817)={ 2976.69553294, 2071.47333294, 0.0}; +Point(3818)={ 2896.79674006, 1040.88224436, 0.0}; +Point(3819)={ 2869.84226252, 0.00048971, 0.0}; +Point(3820)={ 2896.79674006, -1040.88126493, 0.0}; +Point(3821)={ 2976.69543500, -2071.47235351, 0.0}; +Point(3822)={ 3108.96606688, -3081.43911300, 0.0}; +Point(3823)={ 3291.43645777, -4060.56208185, 0.0}; +Point(3824)={ 3518.08733000, -4999.42355915, 0.0}; +Point(3825)={ 3780.08648543, -5889.82660452, 0.0}; +Point(3826)={ 4064.74267718, -6725.61726879, 0.0}; +Point(3827)={ 4357.35908131, -7502.51877669, 0.0}; +Point(3828)={ 4643.38951008, -8217.27766049, 0.0}; +Point(3829)={ 4911.77806944, -8865.95161999, 0.0}; +Point(3830)={ 5156.36748017, -9442.77975093, 0.0}; +Point(3831)={ 5371.13425307, -9942.04933697, 0.0}; +Point(3832)={ 5550.14353726, -10358.00701547, 0.0}; +Point(3833)={ 5692.75488404, -10682.98777399, 0.0}; +Point(3834)={ 5788.21690387, -10913.58221970, 0.0}; +Point(3835)={ 5466.38834009, -11048.90671163, 0.0}; +Point(3836)={ 5150.24046531, -11191.39954749, 0.0}; +Point(3837)={ 4842.85270269, -11335.41852983, 0.0}; +Point(3838)={ 4549.83022724, -11479.78765809, 0.0}; +Point(3839)={ 4276.43492406, -11622.68587966, 0.0}; +Point(3840)={ 4026.77902435, -11760.13044391, 0.0}; +Point(3841)={ 3805.94194554, -11889.98120022, 0.0}; +Point(3842)={ 3618.63190145, -12009.18654122, 0.0}; +Point(3843)={ 3468.47473876, -12112.92336607, 0.0}; +Point(3844)={ 3356.43862316, -12192.95310863, 0.0}; +Point(3845)={ 3286.73823413, -12245.87048966, 0.0}; +Point(3846)={ 3261.49903084, -12265.55515443, 0.0}; +Point(3847)={ 3261.49903084, 12244.86108999, 0.0}; +Point(3848)={ 3286.35899917, 12225.67936209, 0.0}; +Point(3849)={ 3354.75772688, 12174.17882325, 0.0}; +Point(3850)={ 3463.88817005, 12095.24956727, 0.0}; +Point(3851)={ 3610.83544963, 11993.77081630, 0.0}; +Point(3852)={ 3793.69300885, 11875.70984030, 0.0}; +Point(3853)={ 4010.20277384, 11746.24987622, 0.0}; +Point(3854)={ 4256.47474588, 11607.84184753, 0.0}; +Point(3855)={ 4527.70776335, 11462.14226273, 0.0}; +Point(3856)={ 4818.35306634, 11311.12290857, 0.0}; +Point(3857)={ 5120.18678014, 11153.56008627, 0.0}; +Point(3858)={ 5411.90524364, 10977.43277232, 0.0}; +Point(3859)={ 5552.89338251, 10805.60299754, 0.0}; +Point(3860)={ 5566.78864164, 10682.97259284, 0.0}; +Point(3861)={ 5493.44213175, 10360.00534474, 0.0}; +Point(3862)={ 5336.98214667, 9943.45589515, 0.0}; +Point(3863)={ 5133.46049354, 9444.31432050, 0.0}; +Point(3864)={ 4895.37792029, 8867.74622800, 0.0}; +Point(3865)={ 4630.58876302, 8219.37667508, 0.0}; +Point(3866)={ 4346.90612383, 7504.66578330, 0.0}; +Point(3867)={ 4056.04319169, 6727.55418785, 0.0}; +Point(3868)={ 3772.32382391, 5891.55294632, 0.0}; +Point(3869)={ 3511.15160049, 5000.81728682, 0.0}; +Point(3870)={ 3284.90670164, 4061.66658408, 0.0}; +Point(3871)={ 3102.77558501, 3082.24048193, 0.0}; +Point(3872)={ 2970.76019236, 2071.98635792, 0.0}; +Point(3873)={ 2891.02388678, 1041.13199879, 0.0}; +Point(3874)={ 2864.17038838, 0.00039177, 0.0}; +Point(3875)={ 2891.02388678, -1041.13131319, 0.0}; +Point(3876)={ 2970.76019236, -2071.98567232, 0.0}; +Point(3877)={ 3102.77548707, -3082.23969838, 0.0}; +Point(3878)={ 3284.90650576, -4061.66589848, 0.0}; +Point(3879)={ 3511.15150255, -5000.81660121, 0.0}; +Point(3880)={ 3772.32362802, -5891.55235866, 0.0}; +Point(3881)={ 4056.04309374, -6727.55379608, 0.0}; +Point(3882)={ 4346.90592794, -7504.66558741, 0.0}; +Point(3883)={ 4630.58886096, -8219.37677302, 0.0}; +Point(3884)={ 4895.37821412, -8867.74681566, 0.0}; +Point(3885)={ 5133.46098326, -9444.31559376, 0.0}; +Point(3886)={ 5336.98332198, -9943.45883344, 0.0}; +Point(3887)={ 5493.44369884, -10360.00985011, 0.0}; +Point(3888)={ 5566.78883752, -10682.97797970, 0.0}; +Point(3889)={ 5552.88966068, -10805.60995148, 0.0}; +Point(3890)={ 5411.89427403, -10977.44031392, 0.0}; +Point(3891)={ 5120.16934630, -11153.56909702, 0.0}; +Point(3892)={ 4818.32799295, -11311.13524937, 0.0}; +Point(3893)={ 4527.67289567, -11462.15930480, 0.0}; +Point(3894)={ 4256.43067157, -11607.86682297, 0.0}; +Point(3895)={ 4010.14959083, -11746.28141384, 0.0}; +Point(3896)={ 3793.63326367, -11875.74637301, 0.0}; +Point(3897)={ 3610.77276616, -11993.81156055, 0.0}; +Point(3898)={ 3463.82568247, -12095.29442513, 0.0}; +Point(3899)={ 3354.69523930, -12174.22495436, 0.0}; +Point(3900)={ 3286.33235870, -12225.77211403, 0.0}; +Point(3901)={ 3261.49903084, -12244.98841578, 0.0}; +Point(3902)={ 3261.49903084, 12216.06538361, 0.0}; +Point(3903)={ 3286.14538567, 12197.25887501, 0.0}; +Point(3904)={ 3353.91541782, 12146.76019423, 0.0}; +Point(3905)={ 3460.91354581, 12067.93446392, 0.0}; +Point(3906)={ 3605.97033127, 11968.16677565, 0.0}; +Point(3907)={ 3785.02261240, 11850.56348689, 0.0}; +Point(3908)={ 3996.52073643, 11721.21077030, 0.0}; +Point(3909)={ 4236.97725002, 11581.92860110, 0.0}; +Point(3910)={ 4502.78413212, 11433.95517361, 0.0}; +Point(3911)={ 4787.59781607, 11276.56316376, 0.0}; +Point(3912)={ 5078.00345275, 11104.66463305, 0.0}; +Point(3913)={ 5327.95700099, 10902.00957883, 0.0}; +Point(3914)={ 5424.02469980, 10741.83657788, 0.0}; +Point(3915)={ 5442.98693763, 10643.35458624, 0.0}; +Point(3916)={ 5414.41816498, 10352.73905790, 0.0}; +Point(3917)={ 5288.76700493, 9942.11407723, 0.0}; +Point(3918)={ 5100.71416179, 9444.98248706, 0.0}; +Point(3919)={ 4871.38278789, 8869.65327448, 0.0}; +Point(3920)={ 4612.44542588, 8221.77725590, 0.0}; +Point(3921)={ 4332.13750774, 7507.33325856, 0.0}; +Point(3922)={ 4043.73402010, 6730.06799068, 0.0}; +Point(3923)={ 3761.41474628, 5893.82923758, 0.0}; +Point(3924)={ 3501.29864131, 5002.70846654, 0.0}; +Point(3925)={ 3275.72700204, 4063.15894026, 0.0}; +Point(3926)={ 3094.06787232, 3083.32892153, 0.0}; +Point(3927)={ 2962.41888411, 2072.68537650, 0.0}; +Point(3928)={ 2882.94007044, 1041.47117510, 0.0}; +Point(3929)={ 2856.22878515, 0.00029383, 0.0}; +Point(3930)={ 2882.93997250, -1041.47058745, 0.0}; +Point(3931)={ 2962.41878616, -2072.68478884, 0.0}; +Point(3932)={ 3094.06777437, -3083.32833387, 0.0}; +Point(3933)={ 3275.72690410, -4063.15845055, 0.0}; +Point(3934)={ 3501.29854336, -5002.70817271, 0.0}; +Point(3935)={ 3761.41464834, -5893.82904169, 0.0}; +Point(3936)={ 4043.73411805, -6730.06828451, 0.0}; +Point(3937)={ 4332.13770362, -7507.33374827, 0.0}; +Point(3938)={ 4612.44591560, -8221.77843121, 0.0}; +Point(3939)={ 4871.38376732, -8869.65552716, 0.0}; +Point(3940)={ 5100.71543504, -9444.98591506, 0.0}; +Point(3941)={ 5288.76896379, -9942.12024764, 0.0}; +Point(3942)={ 5414.42022178, -10352.74767688, 0.0}; +Point(3943)={ 5442.98468494, -10643.36624145, 0.0}; +Point(3944)={ 5424.02195740, -10741.85038783, 0.0}; +Point(3945)={ 5327.94338692, -10902.02848181, 0.0}; +Point(3946)={ 5077.97602874, -11104.68451547, 0.0}; +Point(3947)={ 4787.55932451, -11276.58725772, 0.0}; +Point(3948)={ 4502.73457301, -11433.98426266, 0.0}; +Point(3949)={ 4236.91907193, -11581.96288112, 0.0}; +Point(3950)={ 3996.45766119, -11721.24838037, 0.0}; +Point(3951)={ 3784.95865568, -11850.60423114, 0.0}; +Point(3952)={ 3605.90617866, -11968.20820550, 0.0}; +Point(3953)={ 3460.85125412, -12067.97883206, 0.0}; +Point(3954)={ 3353.85361584, -12146.80524797, 0.0}; +Point(3955)={ 3286.11933286, -12197.35064752, 0.0}; +Point(3956)={ 3261.49903084, -12216.19124025, 0.0}; +Point(3957)={ 3261.49903084, 12179.87635843, 0.0}; +Point(3958)={ 3285.98044981, 12161.45838937, 0.0}; +Point(3959)={ 3352.87996533, 12111.48693530, 0.0}; +Point(3960)={ 3458.05508187, 12032.93848137, 0.0}; +Point(3961)={ 3600.95310756, 11933.96324922, 0.0}; +Point(3962)={ 3777.06249797, 11817.24683355, 0.0}; +Point(3963)={ 3983.68668877, 11687.30205204, 0.0}; +Point(3964)={ 4217.74273089, 11546.54084690, 0.0}; +Point(3965)={ 4475.50007667, 11394.68065282, 0.0}; +Point(3966)={ 4749.95414274, 11228.91530738, 0.0}; +Point(3967)={ 5021.43828584, 11041.90173649, 0.0}; +Point(3968)={ 5232.72426552, 10828.76816169, 0.0}; +Point(3969)={ 5305.01015159, 10678.83597387, 0.0}; +Point(3970)={ 5330.16443838, 10587.76052332, 0.0}; +Point(3971)={ 5322.43419596, 10334.45478092, 0.0}; +Point(3972)={ 5228.88000615, 9936.71781445, 0.0}; +Point(3973)={ 5059.29194878, 9444.31559376, 0.0}; +Point(3974)={ 4842.00765123, 8870.84367265, 0.0}; +Point(3975)={ 4589.52991822, 8224.31015759, 0.0}; +Point(3976)={ 4313.79867655, 7510.27477809, 0.0}; +Point(3977)={ 4028.08950053, 6733.08659129, 0.0}; +Point(3978)={ 3747.66943775, 5896.57310831, 0.0}; +Point(3979)={ 3488.77379943, 5005.04117292, 0.0}; +Point(3980)={ 3264.17365593, 4064.98557561, 0.0}; +Point(3981)={ 3083.09013670, 3084.66936825, 0.0}; +Point(3982)={ 2951.93252809, 2073.54433585, 0.0}; +Point(3983)={ 2872.77986433, 1041.88811809, 0.0}; +Point(3984)={ 2846.12773656, 0.00019589, 0.0}; +Point(3985)={ 2872.77976639, -1041.88762837, 0.0}; +Point(3986)={ 2951.93243015, -2073.54394408, 0.0}; +Point(3987)={ 3083.09013670, -3084.66907442, 0.0}; +Point(3988)={ 3264.17355798, -4064.98537972, 0.0}; +Point(3989)={ 3488.77379943, -5005.04107497, 0.0}; +Point(3990)={ 3747.66943775, -5896.57330420, 0.0}; +Point(3991)={ 4028.08979436, -6733.08747277, 0.0}; +Point(3992)={ 4313.79916626, -7510.27595340, 0.0}; +Point(3993)={ 4589.53079971, -8224.31231234, 0.0}; +Point(3994)={ 4842.00931626, -8870.84798214, 0.0}; +Point(3995)={ 5059.29380969, -9444.32117650, 0.0}; +Point(3996)={ 5228.88255266, -9936.72741286, 0.0}; +Point(3997)={ 5322.43576305, -10334.46751350, 0.0}; +Point(3998)={ 5330.16365483, -10587.77727156, 0.0}; +Point(3999)={ 5305.00437296, -10678.85301594, 0.0}; +Point(4000)={ 5232.70692962, -10828.79137416, 0.0}; +Point(4001)={ 5021.40439759, -11041.92886668, 0.0}; +Point(4002)={ 4749.90742397, -11228.94557174, 0.0}; +Point(4003)={ 4475.44356361, -11394.71463901, 0.0}; +Point(4004)={ 4217.68073303, -11546.57786932, 0.0}; +Point(4005)={ 3983.62331971, -11687.34113126, 0.0}; +Point(4006)={ 3776.99932479, -11817.28699014, 0.0}; +Point(4007)={ 3600.89159941, -11934.00575645, 0.0}; +Point(4008)={ 3457.99406344, -12032.98157626, 0.0}; +Point(4009)={ 3352.82070987, -12111.53247876, 0.0}; +Point(4010)={ 3285.95508259, -12161.54879068, 0.0}; +Point(4011)={ 3261.49903084, -12180.00045210, 0.0}; +Point(4012)={ 3261.49903084, 12137.00233761, 0.0}; +Point(4013)={ 3285.71482863, 12118.81717886, 0.0}; +Point(4014)={ 3350.91503460, 12068.21918397, 0.0}; +Point(4015)={ 3455.18476684, 11991.06377211, 0.0}; +Point(4016)={ 3595.20522972, 11891.69040201, 0.0}; +Point(4017)={ 3768.90649770, 11776.31276802, 0.0}; +Point(4018)={ 3970.96684255, 11645.83458941, 0.0}; +Point(4019)={ 4198.30821233, 11502.94988395, 0.0}; +Point(4020)={ 4447.04168568, 11347.20742865, 0.0}; +Point(4021)={ 4708.80342749, 11173.93436709, 0.0}; +Point(4022)={ 4959.40183187, 10976.19927926, 0.0}; +Point(4023)={ 5138.86018432, 10760.70263577, 0.0}; +Point(4024)={ 5200.82151608, 10618.55455897, 0.0}; +Point(4025)={ 5218.21617757, 10524.97549166, 0.0}; +Point(4026)={ 5226.73495839, 10304.96514899, 0.0}; +Point(4027)={ 5159.39136969, 9926.27435744, 0.0}; +Point(4028)={ 5011.06221355, 9441.42098888, 0.0}; +Point(4029)={ 4806.01059416, 8871.73622643, 0.0}; +Point(4030)={ 4562.45790918, 8226.70564538, 0.0}; +Point(4031)={ 4292.06935551, 7513.41512174, 0.0}; +Point(4032)={ 4009.48230576, 6736.47414285, 0.0}; +Point(4033)={ 3731.33775070, 5899.70248235, 0.0}; +Point(4034)={ 3473.81703500, 5007.74860888, 0.0}; +Point(4035)={ 3250.31963076, 4067.12807685, 0.0}; +Point(4036)={ 3070.07460083, 3086.22313463, 0.0}; +Point(4037)={ 2939.50494353, 2074.54051323, 0.0}; +Point(4038)={ 2860.74179874, 1042.37264168, 0.0}; +Point(4039)={ 2833.95157146, 0.00019589, 0.0}; +Point(4040)={ 2860.74179874, -1042.37224991, 0.0}; +Point(4041)={ 2939.50494353, -2074.54021940, 0.0}; +Point(4042)={ 3070.07460083, -3086.22284080, 0.0}; +Point(4043)={ 3250.31953282, -4067.12788096, 0.0}; +Point(4044)={ 3473.81703500, -5007.74870683, 0.0}; +Point(4045)={ 3731.33775070, -5899.70258029, 0.0}; +Point(4046)={ 4009.48269753, -6736.47522022, 0.0}; +Point(4047)={ 4292.06994317, -7513.41659088, 0.0}; +Point(4048)={ 4562.45888861, -8226.70828984, 0.0}; +Point(4049)={ 4806.01235713, -8871.74092768, 0.0}; +Point(4050)={ 5011.06427035, -9441.42725723, 0.0}; +Point(4051)={ 5159.39440592, -9926.28522910, 0.0}; +Point(4052)={ 5226.73544811, -10304.97837128, 0.0}; +Point(4053)={ 5218.21412077, -10524.98949750, 0.0}; +Point(4054)={ 5200.81622716, -10618.56807510, 0.0}; +Point(4055)={ 5138.85048798, -10760.72467293, 0.0}; +Point(4056)={ 4959.37342842, -10976.22415676, 0.0}; +Point(4057)={ 4708.76611124, -11173.96012608, 0.0}; +Point(4058)={ 4447.00172497, -11347.23259998, 0.0}; +Point(4059)={ 4198.27079813, -11502.97250876, 0.0}; +Point(4060)={ 3970.93461933, -11645.85456976, 0.0}; +Point(4061)={ 3768.87907369, -11776.33147512, 0.0}; +Point(4062)={ 3595.18025428, -11891.70763996, 0.0}; +Point(4063)={ 3455.16096671, -11991.08042240, 0.0}; +Point(4064)={ 3350.89231184, -12068.23651986, 0.0}; +Point(4065)={ 3285.69249764, -12118.83480858, 0.0}; +Point(4066)={ 3261.49903084, -12137.04993787, 0.0}; +Point(4067)={ 3261.49903084, 12085.83255199, 0.0}; +Point(4068)={ 3285.10376279, 12067.41918625, 0.0}; +Point(4069)={ 3349.86018941, 12017.82549800, 0.0}; +Point(4070)={ 3453.04422446, 11941.80837868, 0.0}; +Point(4071)={ 3590.33668336, 11842.30729102, 0.0}; +Point(4072)={ 3760.17694373, 11726.12691691, 0.0}; +Point(4073)={ 3958.18813264, 11595.94197938, 0.0}; +Point(4074)={ 4179.26115593, 11451.94620951, 0.0}; +Point(4075)={ 4418.18662589, 11292.43138495, 0.0}; +Point(4076)={ 4665.55751743, 11112.96480529, 0.0}; +Point(4077)={ 4890.63797298, 10905.00633816, 0.0}; +Point(4078)={ 5040.03715546, 10689.83986024, 0.0}; +Point(4079)={ 5093.72182128, 10553.79059074, 0.0}; +Point(4080)={ 5116.22469545, 10459.03434755, 0.0}; +Point(4081)={ 5129.26442323, 10265.83117628, 0.0}; +Point(4082)={ 5082.35260784, 9910.17313006, 0.0}; +Point(4083)={ 4955.76452588, 9436.09730180, 0.0}; +Point(4084)={ 4765.71227609, 8871.30606115, 0.0}; +Point(4085)={ 4530.95075117, 8228.98800910, 0.0}; +Point(4086)={ 4266.43818468, 7516.89268283, 0.0}; +Point(4087)={ 3988.10518745, 6740.13064565, 0.0}; +Point(4088)={ 3712.45249599, 5903.18729123, 0.0}; +Point(4089)={ 3456.71835699, 5010.74135256, 0.0}; +Point(4090)={ 3234.40018543, 4069.52709058, 0.0}; +Point(4091)={ 3055.16847288, 3087.95966249, 0.0}; +Point(4092)={ 2925.33985167, 2075.64912907, 0.0}; +Point(4093)={ 2846.91970296, 1042.91916314, 0.0}; +Point(4094)={ 2820.07795771, 0.00009794, 0.0}; +Point(4095)={ 2846.91970296, -1042.91896726, 0.0}; +Point(4096)={ 2925.33985167, -2075.64893318, 0.0}; +Point(4097)={ 3055.16847288, -3087.95946661, 0.0}; +Point(4098)={ 3234.40018543, -4069.52718852, 0.0}; +Point(4099)={ 3456.71835699, -5010.74154845, 0.0}; +Point(4100)={ 3712.45269188, -5903.18778094, 0.0}; +Point(4101)={ 3988.10577510, -6740.13221274, 0.0}; +Point(4102)={ 4266.43896822, -7516.89483758, 0.0}; +Point(4103)={ 4530.95202443, -8228.99124122, 0.0}; +Point(4104)={ 4765.71433289, -8871.31174184, 0.0}; +Point(4105)={ 4955.76687651, -9436.10562695, 0.0}; +Point(4106)={ 5082.35583996, -9910.18674412, 0.0}; +Point(4107)={ 5129.26599031, -10265.84792452, 0.0}; +Point(4108)={ 5116.22058185, -10459.05178139, 0.0}; +Point(4109)={ 5093.71721796, -10553.80988550, 0.0}; +Point(4110)={ 5040.02383522, -10689.86561923, 0.0}; +Point(4111)={ 4890.60976542, -10905.03934493, 0.0}; +Point(4112)={ 4665.51432460, -11112.99575525, 0.0}; +Point(4113)={ 4418.13794826, -11292.46311845, 0.0}; +Point(4114)={ 4179.20993178, -11451.97853067, 0.0}; +Point(4115)={ 3958.13592907, -11595.97733677, 0.0}; +Point(4116)={ 3760.12248747, -11726.16413522, 0.0}; +Point(4117)={ 3590.28056207, -11842.34558670, 0.0}; +Point(4118)={ 3452.98878877, -11941.84951470, 0.0}; +Point(4119)={ 3349.80455784, -12017.86712374, 0.0}; +Point(4120)={ 3285.08123592, -12067.50341715, 0.0}; +Point(4121)={ 3261.49903084, -12085.94557812, 0.0}; +Point(4122)={ 3261.49903084, 12027.82674276, 0.0}; +Point(4123)={ 3285.00454661, 12009.84667646, 0.0}; +Point(4124)={ 3349.38457862, 11961.32898906, 0.0}; +Point(4125)={ 3450.05814090, 11884.50109831, 0.0}; +Point(4126)={ 3586.06216077, 11786.79736106, 0.0}; +Point(4127)={ 3751.84670303, 11669.56312120, 0.0}; +Point(4128)={ 3944.41040501, 11537.50659253, 0.0}; +Point(4129)={ 4158.11714175, 11390.91131978, 0.0}; +Point(4130)={ 4386.29180983, 11227.47917043, 0.0}; +Point(4131)={ 4616.18694314, 11041.29987729, 0.0}; +Point(4132)={ 4818.32407523, 10829.99910823, 0.0}; +Point(4133)={ 4948.57424274, 10621.53143590, 0.0}; +Point(4134)={ 4994.73757838, 10486.79940065, 0.0}; +Point(4135)={ 5015.18815673, 10389.25051115, 0.0}; +Point(4136)={ 5029.22611869, 10218.97440481, 0.0}; +Point(4137)={ 5000.19162748, 9887.95654303, 0.0}; +Point(4138)={ 4895.04785267, 9427.61368249, 0.0}; +Point(4139)={ 4719.80496323, 8869.88804364, 0.0}; +Point(4140)={ 4496.11980243, 8230.66792596, 0.0}; +Point(4141)={ 4238.49223102, 7520.08346708, 0.0}; +Point(4142)={ 3964.16049564, 6743.96256421, 0.0}; +Point(4143)={ 3691.42092028, 5906.88502799, 0.0}; +Point(4144)={ 3437.78099665, 5013.92968823, 0.0}; +Point(4145)={ 3216.71864914, 4072.11307733, 0.0}; +Point(4146)={ 3038.48801111, 3089.85613113, 0.0}; +Point(4147)={ 2909.43676281, 2076.86812658, 0.0}; +Point(4148)={ 2831.26773973, 1043.52836807, 0.0}; +Point(4149)={ 2804.70826596, 0.00000000, 0.0}; +Point(4150)={ 2831.26773973, -1043.52817218, 0.0}; +Point(4151)={ 2909.43676281, -2076.86802863, 0.0}; +Point(4152)={ 3038.48810906, -3089.85613113, 0.0}; +Point(4153)={ 3216.71864914, -4072.11337116, 0.0}; +Point(4154)={ 3437.78109459, -5013.93017795, 0.0}; +Point(4155)={ 3691.42111616, -5906.88581154, 0.0}; +Point(4156)={ 3964.16118124, -6743.96462101, 0.0}; +Point(4157)={ 4238.49321044, -7520.08620948, 0.0}; +Point(4158)={ 4496.12136952, -8230.67213750, 0.0}; +Point(4159)={ 4719.80731386, -8869.89509553, 0.0}; +Point(4160)={ 4895.05049713, -9427.62396650, 0.0}; +Point(4161)={ 5000.19466371, -9887.97270361, 0.0}; +Point(4162)={ 5029.22641252, -10218.99320985, 0.0}; +Point(4163)={ 5015.18561022, -10389.27088328, 0.0}; +Point(4164)={ 4994.73111415, -10486.82153575, 0.0}; +Point(4165)={ 4948.55945336, -10621.55974140, 0.0}; +Point(4166)={ 4818.29479030, -10830.03554299, 0.0}; +Point(4167)={ 4616.14492563, -11041.33797708, 0.0}; +Point(4168)={ 4386.24225071, -11227.51707434, 0.0}; +Point(4169)={ 4158.06405669, -11390.94883192, 0.0}; +Point(4170)={ 3944.35545903, -11537.54400672, 0.0}; +Point(4171)={ 3751.79107145, -11669.60092716, 0.0}; +Point(4172)={ 3586.00701891, -11786.83614646, 0.0}; +Point(4173)={ 3450.00446818, -11884.54184256, 0.0}; +Point(4174)={ 3349.33041619, -11961.36914566, 0.0}; +Point(4175)={ 3284.98260740, -12009.92894851, 0.0}; +Point(4176)={ 3261.49903084, -12027.93751619, 0.0}; +Point(4177)={ 3261.49903084, 11964.93289652, 0.0}; +Point(4178)={ 3284.70738781, 11947.12618919, 0.0}; +Point(4179)={ 3347.31661194, 11897.84817095, 0.0}; +Point(4180)={ 3446.98527992, 11822.17551686, 0.0}; +Point(4181)={ 3579.80213943, 11723.56757063, 0.0}; +Point(4182)={ 3743.09991111, 11607.38308292, 0.0}; +Point(4183)={ 3930.38684066, 11473.69874302, 0.0}; +Point(4184)={ 4136.39536231, 11324.06988440, 0.0}; +Point(4185)={ 4353.17486209, 11156.46977436, 0.0}; +Point(4186)={ 4566.40187443, 10966.15376430, 0.0}; +Point(4187)={ 4745.98931565, 10753.13546831, 0.0}; +Point(4188)={ 4855.34590901, 10549.49079888, 0.0}; +Point(4189)={ 4899.60905417, 10418.02506187, 0.0}; +Point(4190)={ 4918.12614146, 10318.47461098, 0.0}; +Point(4191)={ 4932.16008776, 10165.49796563, 0.0}; +Point(4192)={ 4916.02604950, 9859.45016001, 0.0}; +Point(4193)={ 4829.63334761, 9415.72772224, 0.0}; +Point(4194)={ 4670.47513319, 8866.63359650, 0.0}; +Point(4195)={ 4457.66878566, 8231.78623815, 0.0}; +Point(4196)={ 4207.32297606, 7523.28198882, 0.0}; +Point(4197)={ 3938.08995289, 6747.79928197, 0.0}; +Point(4198)={ 3668.53224897, 5910.69539911, 0.0}; +Point(4199)={ 3416.88605130, 5017.33663249, 0.0}; +Point(4200)={ 3197.45660805, 4074.84294223, 0.0}; +Point(4201)={ 3020.28757326, 3091.87052304, 0.0}; +Point(4202)={ 2892.00527478, 2078.17399945, 0.0}; +Point(4203)={ 2814.28904179, 1044.17224478, 0.0}; +Point(4204)={ 2788.04357300, -0.00000000, 0.0}; +Point(4205)={ 2814.28904179, -1044.17214684, 0.0}; +Point(4206)={ 2892.00527478, -2078.17399945, 0.0}; +Point(4207)={ 3020.28757326, -3091.87071893, 0.0}; +Point(4208)={ 3197.45670599, -4074.84333400, 0.0}; +Point(4209)={ 3416.88624718, -5017.33722015, 0.0}; +Point(4210)={ 3668.53254280, -5910.69618266, 0.0}; +Point(4211)={ 3938.09063849, -6747.80133877, 0.0}; +Point(4212)={ 4207.32405343, -7523.28492711, 0.0}; +Point(4213)={ 4457.67035275, -8231.79064558, 0.0}; +Point(4214)={ 4670.47748382, -8866.64064839, 0.0}; +Point(4215)={ 4829.63618795, -9415.73830007, 0.0}; +Point(4216)={ 4916.02810630, -9859.46583088, 0.0}; +Point(4217)={ 4932.15920627, -10165.51500770, 0.0}; +Point(4218)={ 4918.12271346, -10318.49322014, 0.0}; +Point(4219)={ 4899.60533234, -10418.04484633, 0.0}; +Point(4220)={ 4855.33650649, -10549.51499078, 0.0}; +Point(4221)={ 4745.96933529, -10753.16808330, 0.0}; +Point(4222)={ 4566.37200184, -10966.18226569, 0.0}; +Point(4223)={ 4353.14312858, -11156.49504363, 0.0}; +Point(4224)={ 4136.36686093, -11324.09055036, 0.0}; +Point(4225)={ 3930.36274671, -11473.71529537, 0.0}; +Point(4226)={ 3743.08032252, -11607.39748053, 0.0}; +Point(4227)={ 3579.78490148, -11723.58040115, 0.0}; +Point(4228)={ 3446.96911934, -11822.18766178, 0.0}; +Point(4229)={ 3347.30103902, -11897.86021792, 0.0}; +Point(4230)={ 3284.69201078, -11947.13843205, 0.0}; +Point(4231)={ 3261.49903084, -11964.96531563, 0.0}; +Point(4232)={ 3261.49903084, 11894.30400867, 0.0}; +Point(4233)={ 3284.25332446, 11876.46409868, 0.0}; +Point(4234)={ 3346.51152119, 11828.27216941, 0.0}; +Point(4235)={ 3444.58714768, 11753.01988631, 0.0}; +Point(4236)={ 3574.88589487, 11654.55405525, 0.0}; +Point(4237)={ 3733.59288629, 11536.70992487, 0.0}; +Point(4238)={ 3915.82331703, 11402.15232595, 0.0}; +Point(4239)={ 4114.21560182, 11250.39389455, 0.0}; +Point(4240)={ 4318.86545937, 11078.94746834, 0.0}; +Point(4241)={ 4513.35511081, 10884.26036398, 0.0}; +Point(4242)={ 4671.16455336, 10671.96968589, 0.0}; +Point(4243)={ 4766.49023666, 10475.77572981, 0.0}; +Point(4244)={ 4805.29335820, 10345.30989200, 0.0}; +Point(4245)={ 4826.08801001, 10245.64582734, 0.0}; +Point(4246)={ 4840.33243563, 10106.49470576, 0.0}; +Point(4247)={ 4830.78878016, 9825.26220651, 0.0}; +Point(4248)={ 4760.88506164, 9400.05421157, 0.0}; +Point(4249)={ 4618.04550787, 8861.32371937, 0.0}; +Point(4250)={ 4416.66155678, 8231.89044941, 0.0}; +Point(4251)={ 4174.22718399, 7525.96738763, 0.0}; +Point(4252)={ 3909.82774156, 6751.62189596, 0.0}; +Point(4253)={ 3643.69862728, 5914.61860047, 0.0}; +Point(4254)={ 3394.46309855, 5020.83280274, 0.0}; +Point(4255)={ 3176.61690250, 4077.70209177, 0.0}; +Point(4256)={ 3000.83993035, 3093.95200585, 0.0}; +Point(4257)={ 2873.40415247, 2079.52502400, 0.0}; +Point(4258)={ 2796.19399051, 1044.83894220, 0.0}; +Point(4259)={ 2769.83784623, -0.00009794, 0.0}; +Point(4260)={ 2796.19399051, -1044.83894220, 0.0}; +Point(4261)={ 2873.40425041, -2079.52512194, 0.0}; +Point(4262)={ 3000.84002829, -3093.95229968, 0.0}; +Point(4263)={ 3176.61709839, -4077.70267942, 0.0}; +Point(4264)={ 3394.46329443, -5020.83358629, 0.0}; +Point(4265)={ 3643.69892111, -5914.61977579, 0.0}; +Point(4266)={ 3909.82852510, -6751.62434453, 0.0}; +Point(4267)={ 4174.22835930, -7525.97091358, 0.0}; +Point(4268)={ 4416.66341770, -8231.89593421, 0.0}; +Point(4269)={ 4618.04795644, -8861.33194657, 0.0}; +Point(4270)={ 4760.88790198, -9400.06655237, 0.0}; +Point(4271)={ 4830.79034725, -9825.28022800, 0.0}; +Point(4272)={ 4840.33057471, -10106.51360874, 0.0}; +Point(4273)={ 4826.08575733, -10245.66757066, 0.0}; +Point(4274)={ 4805.28787340, -10345.33281064, 0.0}; +Point(4275)={ 4766.47897322, -10475.80266411, 0.0}; +Point(4276)={ 4671.14329975, -10672.00455357, 0.0}; +Point(4277)={ 4513.32514028, -10884.29464400, 0.0}; +Point(4278)={ 4318.82951432, -11078.98096482, 0.0}; +Point(4279)={ 4114.17671848, -11250.42592189, 0.0}; +Point(4280)={ 3915.78129952, -11402.18425534, 0.0}; +Point(4281)={ 3733.54822432, -11536.74263780, 0.0}; +Point(4282)={ 3574.83976376, -11654.58813939, 0.0}; +Point(4283)={ 3444.54121245, -11753.05592930, 0.0}; +Point(4284)={ 3346.46480242, -11828.30772269, 0.0}; +Point(4285)={ 3284.23500914, -11876.53598878, 0.0}; +Point(4286)={ 3261.49903084, -11894.39930712, 0.0}; +Point(4287)={ 3261.49903084, 11819.22586806, 0.0}; +Point(4288)={ 3284.14735023, 11801.79908129, 0.0}; +Point(4289)={ 3345.24032011, 11753.63330278, 0.0}; +Point(4290)={ 3441.28911594, 11678.19267545, 0.0}; +Point(4291)={ 3569.22773274, 11579.99168203, 0.0}; +Point(4292)={ 3724.44384282, 11461.89858076, 0.0}; +Point(4293)={ 3900.57791484, 11324.99054779, 0.0}; +Point(4294)={ 4090.21988176, 11169.87845309, 0.0}; +Point(4295)={ 4282.29925603, 10994.87650322, 0.0}; +Point(4296)={ 4460.25300944, 10798.97422113, 0.0}; +Point(4297)={ 4599.22656052, 10589.49528821, 0.0}; +Point(4298)={ 4681.02603358, 10399.66879684, 0.0}; +Point(4299)={ 4718.65256691, 10271.41294294, 0.0}; +Point(4300)={ 4734.68190419, 10170.95299416, 0.0}; +Point(4301)={ 4747.90880087, 10042.67441750, 0.0}; +Point(4302)={ 4746.28480942, 9785.75565895, 0.0}; +Point(4303)={ 4689.90240398, 9380.53007524, 0.0}; +Point(4304)={ 4562.66956381, 8853.89807941, 0.0}; +Point(4305)={ 4373.21476580, 8230.92150016, 0.0}; +Point(4306)={ 4138.67439598, 7528.30988830, 0.0}; +Point(4307)={ 3880.04398706, 6755.19828146, 0.0}; +Point(4308)={ 3617.54924049, 5918.45874624, 0.0}; +Point(4309)={ 3370.81301903, 5024.33768992, 0.0}; +Point(4310)={ 3154.62548623, 4080.60051642, 0.0}; +Point(4311)={ 2980.22608116, 3096.08471280, 0.0}; +Point(4312)={ 2853.83878217, 2080.89975074, 0.0}; +Point(4313)={ 2776.96632738, 1045.53130065, 0.0}; +Point(4314)={ 2750.54808729, -0.00009794, 0.0}; +Point(4315)={ 2776.96632738, -1045.53149654, 0.0}; +Point(4316)={ 2853.83878217, -2080.89994662, 0.0}; +Point(4317)={ 2980.22617910, -3096.08520251, 0.0}; +Point(4318)={ 3154.62568211, -4080.60120202, 0.0}; +Point(4319)={ 3370.81331286, -5024.33876729, 0.0}; +Point(4320)={ 3617.54963226, -5918.46011744, 0.0}; +Point(4321)={ 3880.04496649, -6755.20131769, 0.0}; +Point(4322)={ 4138.67576718, -7528.31380602, 0.0}; +Point(4323)={ 4373.21682260, -8230.92776851, 0.0}; +Point(4324)={ 4562.67211033, -8853.90709016, 0.0}; +Point(4325)={ 4689.90514638, -9380.54378724, 0.0}; +Point(4326)={ 4746.28569090, -9785.77485576, 0.0}; +Point(4327)={ 4747.90791939, -10042.69449580, 0.0}; +Point(4328)={ 4734.67847618, -10170.97542309, 0.0}; +Point(4329)={ 4718.64561296, -10271.43674307, 0.0}; +Point(4330)={ 4681.01721872, -10399.69866943, 0.0}; +Point(4331)={ 4599.20951845, -10589.53142915, 0.0}; +Point(4332)={ 4460.22480188, -10799.00801143, 0.0}; +Point(4333)={ 4282.26575955, -10994.90892232, 0.0}; +Point(4334)={ 4090.18374082, -11169.90881539, 0.0}; +Point(4335)={ 3900.54050064, -11325.01914712, 0.0}; +Point(4336)={ 3724.40613480, -11461.92629860, 0.0}; +Point(4337)={ 3569.19129798, -11580.02028137, 0.0}; +Point(4338)={ 3441.25277912, -11678.22088301, 0.0}; +Point(4339)={ 3345.20447300, -11753.66190211, 0.0}; +Point(4340)={ 3284.12962256, -11801.85099103, 0.0}; +Point(4341)={ 3261.49903084, -11819.30099028, 0.0}; +Point(4342)={ 3261.49903084, 11738.79916288, 0.0}; +Point(4343)={ 3283.55097583, 11721.15592226, 0.0}; +Point(4344)={ 3343.76275331, 11673.37123963, 0.0}; +Point(4345)={ 3438.63868275, 11598.85343044, 0.0}; +Point(4346)={ 3563.32040384, 11499.80346784, 0.0}; +Point(4347)={ 3714.17834808, 11380.45650139, 0.0}; +Point(4348)={ 3884.87609866, 11242.35346693, 0.0}; +Point(4349)={ 4066.02053838, 11084.67497405, 0.0}; +Point(4350)={ 4245.17801020, 10906.41044778, 0.0}; +Point(4351)={ 4404.92907307, 10708.56203999, 0.0}; +Point(4352)={ 4526.83900970, 10503.31717924, 0.0}; +Point(4353)={ 4598.84928441, 10321.04208653, 0.0}; +Point(4354)={ 4630.78915422, 10194.28152709, 0.0}; +Point(4355)={ 4649.96990269, 10095.42705855, 0.0}; +Point(4356)={ 4660.62090074, 9975.30036856, 0.0}; +Point(4357)={ 4662.23362876, 9741.39927213, 0.0}; +Point(4358)={ 4617.77557720, 9357.12926043, 0.0}; +Point(4359)={ 4505.11487964, 8844.13591331, 0.0}; +Point(4360)={ 4327.46651223, 8228.78565904, 0.0}; +Point(4361)={ 4101.88253216, 7529.86149994, 0.0}; +Point(4362)={ 3848.60832738, 6758.54743940, 0.0}; +Point(4363)={ 3590.06890743, 5922.20496475, 0.0}; +Point(4364)={ 3345.87636139, 5027.85530967, 0.0}; +Point(4365)={ 3131.66463099, 4083.49326038, 0.0}; +Point(4366)={ 2958.65239141, 3098.23348238, 0.0}; +Point(4367)={ 2833.09143679, 2082.31825796, 0.0}; +Point(4368)={ 2756.55002905, 1046.24961398, 0.0}; +Point(4369)={ 2730.54324714, -0.00019589, 0.0}; +Point(4370)={ 2756.55002905, -1046.25000576, 0.0}; +Point(4371)={ 2833.09143679, -2082.31864973, 0.0}; +Point(4372)={ 2958.65248936, -3098.23407004, 0.0}; +Point(4373)={ 3131.66472894, -4083.49414186, 0.0}; +Point(4374)={ 3345.87665522, -5027.85658292, 0.0}; +Point(4375)={ 3590.06939715, -5922.20653184, 0.0}; +Point(4376)={ 3848.60940475, -6758.55076945, 0.0}; +Point(4377)={ 4101.88400131, -7529.86590737, 0.0}; +Point(4378)={ 4327.46876492, -8228.79261299, 0.0}; +Point(4379)={ 4505.11752410, -8844.14580554, 0.0}; +Point(4380)={ 4617.77822166, -9357.14395187, 0.0}; +Point(4381)={ 4662.23509791, -9741.41846894, 0.0}; +Point(4382)={ 4660.61913777, -9975.32093657, 0.0}; +Point(4383)={ 4649.96784589, -10095.45036897, 0.0}; +Point(4384)={ 4630.78425707, -10194.30620870, 0.0}; +Point(4385)={ 4598.83958807, -10321.07166529, 0.0}; +Point(4386)={ 4526.82216352, -10503.35175309, 0.0}; +Point(4387)={ 4404.90390175, -10708.59916036, 0.0}; +Point(4388)={ 4245.14706024, -10906.44511957, 0.0}; +Point(4389)={ 4065.98635630, -11084.70768699, 0.0}; +Point(4390)={ 3884.83888035, -11242.38343746, 0.0}; +Point(4391)={ 3714.14103183, -11380.48656986, 0.0}; +Point(4392)={ 3563.28259787, -11499.83294866, 0.0}; +Point(4393)={ 3438.60136650, -11598.88369480, 0.0}; +Point(4394)={ 3343.72484941, -11673.40091633, 0.0}; +Point(4395)={ 3283.53657822, -11721.21478596, 0.0}; +Point(4396)={ 3261.49903084, -11738.87604806, 0.0}; +Point(4397)={ 3261.49903084, 11654.12790564, 0.0}; +Point(4398)={ 3283.43599085, 11636.87526136, 0.0}; +Point(4399)={ 3342.59938738, 11589.26070557, 0.0}; +Point(4400)={ 3435.07845783, 11514.09608138, 0.0}; +Point(4401)={ 3557.47262422, 11415.42829203, 0.0}; +Point(4402)={ 3704.39718104, 11295.37662631, 0.0}; +Point(4403)={ 3868.36341310, 11154.60611659, 0.0}; +Point(4404)={ 4040.16282558, 10993.80970900, 0.0}; +Point(4405)={ 4206.67527957, 10813.18612970, 0.0}; +Point(4406)={ 4351.87016453, 10616.50794385, 0.0}; +Point(4407)={ 4458.14165405, 10415.59539200, 0.0}; +Point(4408)={ 4520.62188736, 10240.30490230, 0.0}; +Point(4409)={ 4550.52121450, 10116.13708768, 0.0}; +Point(4410)={ 4564.95682468, 10017.72865118, 0.0}; +Point(4411)={ 4577.02535052, 9904.77735699, 0.0}; +Point(4412)={ 4579.60056356, 9692.84828414, 0.0}; +Point(4413)={ 4545.51231594, 9329.90397073, 0.0}; +Point(4414)={ 4446.03228601, 8831.93007150, 0.0}; +Point(4415)={ 4280.52394277, 8225.13464104, 0.0}; +Point(4416)={ 4063.19576680, 7530.82898004, 0.0}; +Point(4417)={ 3816.24456065, 6761.42901786, 0.0}; +Point(4418)={ 3561.57878294, 5925.75764806, 0.0}; +Point(4419)={ 3320.17956880, 5031.24883575, 0.0}; +Point(4420)={ 3107.77527694, 4086.36817873, 0.0}; +Point(4421)={ 2936.41464871, 3100.35277115, 0.0}; +Point(4422)={ 2811.67925491, 2083.72932152, 0.0}; +Point(4423)={ 2735.61267442, 1046.95872068, 0.0}; +Point(4424)={ 2709.78238564, -0.00019589, 0.0}; +Point(4425)={ 2735.61267442, -1046.95921039, 0.0}; +Point(4426)={ 2811.67925491, -2083.72981123, 0.0}; +Point(4427)={ 2936.41474665, -3100.35345675, 0.0}; +Point(4428)={ 3107.77547282, -4086.36915816, 0.0}; +Point(4429)={ 3320.17996058, -5031.25040283, 0.0}; +Point(4430)={ 3561.57937060, -5925.75941103, 0.0}; +Point(4431)={ 3816.24563802, -6761.43254381, 0.0}; +Point(4432)={ 4063.19733389, -7530.83377925, 0.0}; +Point(4433)={ 4280.52619546, -8225.14208470, 0.0}; +Point(4434)={ 4446.03483253, -8831.94055139, 0.0}; +Point(4435)={ 4545.51456863, -9329.91944571, 0.0}; +Point(4436)={ 4579.60124916, -9692.86806861, 0.0}; +Point(4437)={ 4577.02456698, -9904.79861060, 0.0}; +Point(4438)={ 4564.95388639, -10017.75166776, 0.0}; +Point(4439)={ 4550.51543586, -10116.16118164, 0.0}; +Point(4440)={ 4520.61434576, -10240.33448106, 0.0}; +Point(4441)={ 4458.12882353, -10415.62947614, 0.0}; +Point(4442)={ 4351.84616852, -10616.54310535, 0.0}; +Point(4443)={ 4206.64765967, -10813.21835292, 0.0}; +Point(4444)={ 4040.13275711, -10993.83889599, 0.0}; +Point(4445)={ 3868.33128783, -11154.63236529, 0.0}; +Point(4446)={ 3704.36544754, -11295.40238529, 0.0}; +Point(4447)={ 3557.44147838, -11415.45405102, 0.0}; +Point(4448)={ 3435.04721404, -11514.12125270, 0.0}; +Point(4449)={ 3342.56833948, -11589.28617073, 0.0}; +Point(4450)={ 3283.42188707, -11636.92207808, 0.0}; +Point(4451)={ 3261.49903084, -11654.19254796, 0.0}; +Point(4452)={ 3261.49903084, 11565.61924503, 0.0}; +Point(4453)={ 3282.85019428, 11548.16297744, 0.0}; +Point(4454)={ 3341.02573859, 11500.77310269, 0.0}; +Point(4455)={ 3432.17072860, 11426.28771260, 0.0}; +Point(4456)={ 3551.23552153, 11326.70758502, 0.0}; +Point(4457)={ 3693.45029745, 11205.12595304, 0.0}; +Point(4458)={ 3851.39627242, 11062.77709326, 0.0}; +Point(4459)={ 4013.92391896, 10899.30419966, 0.0}; +Point(4460)={ 4167.41290370, 10716.33537729, 0.0}; +Point(4461)={ 4296.48011670, 10519.94925721, 0.0}; +Point(4462)={ 4390.28053499, 10325.06509171, 0.0}; +Point(4463)={ 4444.32445542, 10156.78163395, 0.0}; +Point(4464)={ 4470.96580947, 10035.64319366, 0.0}; +Point(4465)={ 4487.21698745, 9939.33269437, 0.0}; +Point(4466)={ 4495.85437714, 9831.68314805, 0.0}; +Point(4467)={ 4500.45612700, 9640.36527993, 0.0}; +Point(4468)={ 4474.06442944, 9299.03207046, 0.0}; +Point(4469)={ 4386.39504166, 8817.14607837, 0.0}; +Point(4470)={ 4232.55679249, 8219.94033655, 0.0}; +Point(4471)={ 4024.07707318, 7530.74709977, 0.0}; +Point(4472)={ 3782.77394104, 6763.89384923, 0.0}; +Point(4473)={ 3532.50824874, 5928.98868685, 0.0}; +Point(4474)={ 3293.73361087, 5034.51395866, 0.0}; +Point(4475)={ 3083.40394580, 4089.13271541, 0.0}; +Point(4476)={ 2913.65673120, 3102.41809338, 0.0}; +Point(4477)={ 2789.94376347, 2085.09758403, 0.0}; +Point(4478)={ 2714.27561475, 1047.65587834, 0.0}; +Point(4479)={ 2688.15619849, -0.00029383, 0.0}; +Point(4480)={ 2714.27561475, -1047.65627011, 0.0}; +Point(4481)={ 2789.94376347, -2085.09817168, 0.0}; +Point(4482)={ 2913.65682914, -3102.41887692, 0.0}; +Point(4483)={ 3083.40414169, -4089.13379278, 0.0}; +Point(4484)={ 3293.73400264, -5034.51562369, 0.0}; +Point(4485)={ 3532.50883640, -5928.99074365, 0.0}; +Point(4486)={ 3782.77511636, -6763.89776695, 0.0}; +Point(4487)={ 4024.07854233, -7530.75189897, 0.0}; +Point(4488)={ 4232.55914312, -8219.94826993, 0.0}; +Point(4489)={ 4386.39739229, -8817.15704797, 0.0}; +Point(4490)={ 4474.06629035, -9299.04803515, 0.0}; +Point(4491)={ 4500.45622494, -9640.38496646, 0.0}; +Point(4492)={ 4495.85281005, -9831.70440166, 0.0}; +Point(4493)={ 4487.21306973, -9939.35571095, 0.0}; +Point(4494)={ 4470.96169587, -10035.66748350, 0.0}; +Point(4495)={ 4444.31642410, -10156.81003740, 0.0}; +Point(4496)={ 4390.26780242, -10325.09702110, 0.0}; +Point(4497)={ 4296.46111577, -10519.98255780, 0.0}; +Point(4498)={ 4167.39008300, -10716.36583754, 0.0}; +Point(4499)={ 4013.89884558, -10899.33201545, 0.0}; +Point(4500)={ 3851.36972989, -11062.80246048, 0.0}; +Point(4501)={ 3693.42297138, -11205.14975316, 0.0}; +Point(4502)={ 3551.20790162, -11326.73050366, 0.0}; +Point(4503)={ 3432.14340253, -11426.31072919, 0.0}; +Point(4504)={ 3340.99792280, -11500.79562956, 0.0}; +Point(4505)={ 3282.83991028, -11548.20685586, 0.0}; +Point(4506)={ 3261.49903084, -11565.67566015, 0.0}; +Point(4507)={ 3261.49903084, 11474.58346136, 0.0}; +Point(4508)={ 3282.69270208, 11457.44756504, 0.0}; +Point(4509)={ 3339.57951352, 11409.90969855, 0.0}; +Point(4510)={ 3428.49542076, 11334.96760065, 0.0}; +Point(4511)={ 3544.84543200, 11235.22194954, 0.0}; +Point(4512)={ 3683.20037563, 11113.04149459, 0.0}; +Point(4513)={ 3834.03628272, 10967.92437630, 0.0}; +Point(4514)={ 3987.37776542, 10801.97842412, 0.0}; +Point(4515)={ 4129.34082806, 10618.00196505, 0.0}; +Point(4516)={ 4245.26116373, 10423.38880760, 0.0}; +Point(4517)={ 4326.05985611, 10233.22460906, 0.0}; +Point(4518)={ 4373.78430385, 10071.92173866, 0.0}; +Point(4519)={ 4397.84544977, 9954.07310290, 0.0}; +Point(4520)={ 4410.08194771, 9859.25398035, 0.0}; +Point(4521)={ 4420.67182939, 9756.62048243, 0.0}; +Point(4522)={ 4424.91461847, 9584.43017978, 0.0}; +Point(4523)={ 4404.30165077, 9264.80063030, 0.0}; +Point(4524)={ 4327.09844276, 8799.76659802, 0.0}; +Point(4525)={ 4183.78660826, 8213.20313734, 0.0}; +Point(4526)={ 3983.90676650, 7529.82937467, 0.0}; +Point(4527)={ 3749.03554551, 6765.69511736, 0.0}; +Point(4528)={ 3502.68600268, 5931.95322296, 0.0}; +Point(4529)={ 3266.89646893, 5037.56321540, 0.0}; +Point(4530)={ 3058.73202786, 4091.75288424, 0.0}; +Point(4531)={ 2890.50380991, 3104.41358230, 0.0}; +Point(4532)={ 2767.57938058, 2086.45605224, 0.0}; +Point(4533)={ 2692.05138817, 1048.36518092, 0.0}; +Point(4534)={ 2666.43588820, -0.00029383, 0.0}; +Point(4535)={ 2692.05138817, -1048.36557269, 0.0}; +Point(4536)={ 2767.57947852, -2086.45654196, 0.0}; +Point(4537)={ 2890.50390785, -3104.41436585, 0.0}; +Point(4538)={ 3058.73222375, -4091.75396162, 0.0}; +Point(4539)={ 3266.89695865, -5037.56507632, 0.0}; +Point(4540)={ 3502.68659034, -5931.95527976, 0.0}; +Point(4541)={ 3749.03681877, -6765.69913302, 0.0}; +Point(4542)={ 3983.90833359, -7529.83446770, 0.0}; +Point(4543)={ 4183.78886095, -8213.21116865, 0.0}; +Point(4544)={ 4327.10069545, -8799.77756763, 0.0}; +Point(4545)={ 4404.30311991, -9264.81688882, 0.0}; +Point(4546)={ 4424.91530407, -9584.44957248, 0.0}; +Point(4547)={ 4420.67124173, -9756.64095250, 0.0}; +Point(4548)={ 4410.07949914, -9859.27582162, 0.0}; +Point(4549)={ 4397.84094440, -9954.09602154, 0.0}; +Point(4550)={ 4373.77891699, -10071.94759559, 0.0}; +Point(4551)={ 4326.05094330, -10233.25291456, 0.0}; +Point(4552)={ 4245.24754967, -10423.41770076, 0.0}; +Point(4553)={ 4129.32417776, -10618.02498164, 0.0}; +Point(4554)={ 3987.36023364, -10801.99811065, 0.0}; +Point(4555)={ 3834.01924065, -10967.94112454, 0.0}; +Point(4556)={ 3683.18372534, -11113.05628397, 0.0}; +Point(4557)={ 3544.82936936, -11235.23605332, 0.0}; +Point(4558)={ 3428.47935812, -11334.98111678, 0.0}; +Point(4559)={ 3339.56364677, -11409.92311673, 0.0}; +Point(4560)={ 3282.68271190, -11457.46813305, 0.0}; +Point(4561)={ 3261.49903084, -11474.61646812, 0.0}; +Point(4562)={ 3261.49903084, 11381.10654851, 0.0}; +Point(4563)={ 3282.14294850, 11363.80434512, 0.0}; +Point(4564)={ 3338.27373859, 11316.73366633, 0.0}; +Point(4565)={ 3425.36947472, 11241.83662217, 0.0}; +Point(4566)={ 3538.62635080, 11141.45169766, 0.0}; +Point(4567)={ 3671.51372921, 11017.02404049, 0.0}; +Point(4568)={ 3815.84035024, 10870.07666297, 0.0}; +Point(4569)={ 3959.72436725, 10701.72562461, 0.0}; +Point(4570)={ 4089.40186254, 10516.38854258, 0.0}; +Point(4571)={ 4193.26131192, 10324.22131351, 0.0}; +Point(4572)={ 4264.61703414, 10140.01899808, 0.0}; +Point(4573)={ 4305.35531178, 9985.08897925, 0.0}; +Point(4574)={ 4326.73027535, 9871.04513186, 0.0}; +Point(4575)={ 4339.60839732, 9778.60690361, 0.0}; +Point(4576)={ 4346.64970928, 9679.92853643, 0.0}; +Point(4577)={ 4351.03157730, 9525.45855547, 0.0}; +Point(4578)={ 4335.50791929, 9227.55862086, 0.0}; +Point(4579)={ 4268.51065673, 8779.87409839, 0.0}; +Point(4580)={ 4135.01985203, 8204.78102617, 0.0}; +Point(4581)={ 3943.76574475, 7527.77002696, 0.0}; +Point(4582)={ 3714.77579985, 6766.91910996, 0.0}; +Point(4583)={ 3472.96933908, 5934.41433250, 0.0}; +Point(4584)={ 3239.97245163, 5040.32569529, 0.0}; +Point(4585)={ 3033.86980684, 4094.20821515, 0.0}; +Point(4586)={ 2867.36342531, 3106.28233310, 0.0}; +Point(4587)={ 2745.10089420, 2087.75712591, 0.0}; +Point(4588)={ 2669.94214657, 1049.03501251, 0.0}; +Point(4589)={ 2644.66102371, -0.00029383, 0.0}; +Point(4590)={ 2669.94214657, -1049.03540428, 0.0}; +Point(4591)={ 2745.10099214, -2087.75771357, 0.0}; +Point(4592)={ 2867.36352325, -3106.28321459, 0.0}; +Point(4593)={ 3033.87000273, -4094.20939047, 0.0}; +Point(4594)={ 3239.97294135, -5040.32755620, 0.0}; +Point(4595)={ 3472.97002468, -5934.41648725, 0.0}; +Point(4596)={ 3714.77697517, -6766.92322356, 0.0}; +Point(4597)={ 3943.76731184, -7527.77531588, 0.0}; +Point(4598)={ 4135.02210472, -8204.78935132, 0.0}; +Point(4599)={ 4268.51271354, -8779.88526388, 0.0}; +Point(4600)={ 4335.50978020, -9227.57468349, 0.0}; +Point(4601)={ 4351.03167525, -9525.47687080, 0.0}; +Point(4602)={ 4346.64863191, -9679.94763530, 0.0}; +Point(4603)={ 4339.60555697, -9778.62756957, 0.0}; +Point(4604)={ 4326.72723912, -9871.06726696, 0.0}; +Point(4605)={ 4305.34953315, -9985.11326910, 0.0}; +Point(4606)={ 4264.60890488, -10140.04299409, 0.0}; +Point(4607)={ 4193.24975465, -10324.24619101, 0.0}; +Point(4608)={ 4089.38932585, -10516.40862087, 0.0}; +Point(4609)={ 3959.71134084, -10701.74227490, 0.0}; +Point(4610)={ 3815.82565880, -10870.09262767, 0.0}; +Point(4611)={ 3671.49835217, -11017.03892782, 0.0}; +Point(4612)={ 3538.61048405, -11141.46580144, 0.0}; +Point(4613)={ 3425.35351003, -11241.85072595, 0.0}; +Point(4614)={ 3338.25738213, -11316.74737834, 0.0}; +Point(4615)={ 3282.13707193, -11363.83049588, 0.0}; +Point(4616)={ 3261.49903084, -11381.13965321, 0.0}; +Point(4617)={ 3261.49903084, 11287.82493382, 0.0}; +Point(4618)={ 3281.79505527, 11270.59119253, 0.0}; +Point(4619)={ 3336.41977718, 11223.07027017, 0.0}; +Point(4620)={ 3421.61032775, 11148.02787873, 0.0}; +Point(4621)={ 3531.56731117, 11046.74344650, 0.0}; +Point(4622)={ 3660.34069543, 10921.38748639, 0.0}; +Point(4623)={ 3798.49005688, 10772.61993776, 0.0}; +Point(4624)={ 3933.64598906, 10602.21297969, 0.0}; +Point(4625)={ 4052.34271252, 10415.96120879, 0.0}; +Point(4626)={ 4143.58114007, 10225.03707118, 0.0}; +Point(4627)={ 4205.78164842, 10045.92700373, 0.0}; +Point(4628)={ 4242.41151466, 9897.64672109, 0.0}; +Point(4629)={ 4261.28295941, 9787.40776002, 0.0}; +Point(4630)={ 4271.02955259, 9697.11918284, 0.0}; +Point(4631)={ 4279.33844175, 9602.58389886, 0.0}; +Point(4632)={ 4282.25067635, 9463.87097388, 0.0}; +Point(4633)={ 4269.35580614, 9187.51583585, 0.0}; +Point(4634)={ 4211.02972357, 8757.60325099, 0.0}; +Point(4635)={ 4086.99922492, 8194.60524714, 0.0}; +Point(4636)={ 3903.86458520, 7524.58178923, 0.0}; +Point(4637)={ 3680.94661124, 6767.32488745, 0.0}; +Point(4638)={ 3443.07735766, 5936.47554112, 0.0}; +Point(4639)={ 3213.02698483, 5042.80090860, 0.0}; +Point(4640)={ 3009.23696812, 4096.42681803, 0.0}; +Point(4641)={ 2844.32862318, 3108.01680416, 0.0}; +Point(4642)={ 2722.96226972, 2088.95976695, 0.0}; +Point(4643)={ 2648.11674354, 1049.66214099, 0.0}; +Point(4644)={ 2622.58567036, -0.00039177, 0.0}; +Point(4645)={ 2648.11684148, -1049.66263070, 0.0}; +Point(4646)={ 2722.96226972, -2088.96035460, 0.0}; +Point(4647)={ 2844.32881906, -3108.01768565, 0.0}; +Point(4648)={ 3009.23716401, -4096.42799335, 0.0}; +Point(4649)={ 3213.02737661, -5042.80276952, 0.0}; +Point(4650)={ 3443.07794532, -5936.47779381, 0.0}; +Point(4651)={ 3680.94778656, -6767.32890311, 0.0}; +Point(4652)={ 3903.86605434, -7524.58707815, 0.0}; +Point(4653)={ 4087.00128172, -8194.61347435, 0.0}; +Point(4654)={ 4211.03158449, -8757.61422059, 0.0}; +Point(4655)={ 4269.35717734, -9187.53091906, 0.0}; +Point(4656)={ 4282.25038252, -9463.88782006, 0.0}; +Point(4657)={ 4279.33697260, -9602.60113681, 0.0}; +Point(4658)={ 4271.02798551, -9697.13720434, 0.0}; +Point(4659)={ 4261.27982523, -9787.42705478, 0.0}; +Point(4660)={ 4242.40828254, -9897.66542819, 0.0}; +Point(4661)={ 4205.77694716, -10045.94443757, 0.0}; +Point(4662)={ 4143.57438201, -10225.05479885, 0.0}; +Point(4663)={ 4052.33634623, -10415.97315782, 0.0}; +Point(4664)={ 3933.64021043, -10602.22159866, 0.0}; +Point(4665)={ 3798.48525768, -10772.62581433, 0.0}; +Point(4666)={ 3660.33667977, -10921.39159999, 0.0}; +Point(4667)={ 3531.56388317, -11046.74667861, 0.0}; +Point(4668)={ 3421.60719357, -11148.03062113, 0.0}; +Point(4669)={ 3336.41674095, -11223.07291463, 0.0}; +Point(4670)={ 3281.79201904, -11270.59383699, 0.0}; +Point(4671)={ 3261.49903084, -11287.83120217, 0.0}; +Point(4672)={ 3261.49903084, 11193.80140157, 0.0}; +Point(4673)={ 3281.39681938, 11176.56227342, 0.0}; +Point(4674)={ 3335.39274778, 11129.58268154, 0.0}; +Point(4675)={ 3418.26675256, 11053.94136918, 0.0}; +Point(4676)={ 3525.53579065, 10952.37877907, 0.0}; +Point(4677)={ 3648.83044419, 10824.80166956, 0.0}; +Point(4678)={ 3779.73075677, 10673.53432394, 0.0}; +Point(4679)={ 3905.84802714, 10501.12649008, 0.0}; +Point(4680)={ 4014.67425963, 10314.73652173, 0.0}; +Point(4681)={ 4097.37392601, 10126.55116183, 0.0}; +Point(4682)={ 4152.19267283, 9952.28202083, 0.0}; +Point(4683)={ 4182.53999085, 9809.60985150, 0.0}; +Point(4684)={ 4198.50331461, 9703.17401378, 0.0}; +Point(4685)={ 4208.55999506, 9615.43077704, 0.0}; +Point(4686)={ 4213.83461274, 9524.54239746, 0.0}; +Point(4687)={ 4217.40482784, 9399.86165580, 0.0}; +Point(4688)={ 4206.64570081, 9144.99313626, 0.0}; +Point(4689)={ 4154.85701392, 8733.13858025, 0.0}; +Point(4690)={ 4039.70288566, 8182.78089298, 0.0}; +Point(4691)={ 3864.15999707, 7520.32607168, 0.0}; +Point(4692)={ 3647.25366122, 6767.01950144, 0.0}; +Point(4693)={ 3413.88175036, 5937.91079658, 0.0}; +Point(4694)={ 3186.67054672, 5044.85055996, 0.0}; +Point(4695)={ 2984.99031832, 4098.38430511, 0.0}; +Point(4696)={ 2821.51703294, 3109.60396908, 0.0}; +Point(4697)={ 2700.79083437, 2090.10217309, 0.0}; +Point(4698)={ 2626.05911786, 1050.27203151, 0.0}; +Point(4699)={ 2601.08573163, -0.00039177, 0.0}; +Point(4700)={ 2626.05911786, -1050.27252123, 0.0}; +Point(4701)={ 2700.79093232, -2090.10285869, 0.0}; +Point(4702)={ 2821.51713089, -3109.60485057, 0.0}; +Point(4703)={ 2984.99051420, -4098.38557837, 0.0}; +Point(4704)={ 3186.67093849, -5044.85242088, 0.0}; +Point(4705)={ 3413.88233802, -5937.91304927, 0.0}; +Point(4706)={ 3647.25473859, -6767.02361504, 0.0}; +Point(4707)={ 3864.16136827, -7520.33087088, 0.0}; +Point(4708)={ 4039.70484451, -8182.78902224, 0.0}; +Point(4709)={ 4154.85887483, -8733.14915809, 0.0}; +Point(4710)={ 4206.64677818, -9145.00763181, 0.0}; +Point(4711)={ 4217.40512167, -9399.87713078, 0.0}; +Point(4712)={ 4213.83402508, -9524.55806832, 0.0}; +Point(4713)={ 4208.55823209, -9615.44625202, 0.0}; +Point(4714)={ 4198.50145369, -9703.19056613, 0.0}; +Point(4715)={ 4182.53705257, -9809.62434705, 0.0}; +Point(4716)={ 4152.18875511, -9952.29514518, 0.0}; +Point(4717)={ 4097.36961652, -10126.56183760, 0.0}; +Point(4718)={ 4014.67073368, -10314.74337774, 0.0}; +Point(4719)={ 3905.84597034, -10501.12952632, 0.0}; +Point(4720)={ 3779.72958145, -10673.53579309, 0.0}; +Point(4721)={ 3648.82975859, -10824.80235516, 0.0}; +Point(4722)={ 3525.53539888, -10952.37917084, 0.0}; +Point(4723)={ 3418.26636078, -11053.94166301, 0.0}; +Point(4724)={ 3335.39245395, -11129.58307331, 0.0}; +Point(4725)={ 3281.39662350, -11176.56286107, 0.0}; +Point(4726)={ 3261.49903084, -11193.80208717, 0.0}; +Point(4727)={ 3261.49903084, 11102.71674438, 0.0}; +Point(4728)={ 3280.88183554, 11085.32453146, 0.0}; +Point(4729)={ 3333.39138228, 11037.85209084, 0.0}; +Point(4730)={ 3414.68468637, 10962.30313865, 0.0}; +Point(4731)={ 3518.16372547, 10859.21587120, 0.0}; +Point(4732)={ 3637.16328841, 10730.43847128, 0.0}; +Point(4733)={ 3761.91827080, 10577.31118973, 0.0}; +Point(4734)={ 3879.68326331, 10402.86389058, 0.0}; +Point(4735)={ 3979.17210810, 10215.74865495, 0.0}; +Point(4736)={ 4052.79785324, 10029.17337860, 0.0}; +Point(4737)={ 4100.04913876, 9859.03625326, 0.0}; +Point(4738)={ 4127.32006986, 9722.01029702, 0.0}; +Point(4739)={ 4141.60788419, 9619.22175546, 0.0}; +Point(4740)={ 4148.91844122, 9533.83757175, 0.0}; +Point(4741)={ 4154.57200004, 9446.72969070, 0.0}; +Point(4742)={ 4156.00363161, 9333.84000261, 0.0}; +Point(4743)={ 4147.96996204, 9100.29747519, 0.0}; +Point(4744)={ 4100.94482671, 8706.66461064, 0.0}; +Point(4745)={ 3993.59694457, 8169.36917802, 0.0}; +Point(4746)={ 3825.93385723, 7514.74871245, 0.0}; +Point(4747)={ 3614.69038477, 6765.78728164, 0.0}; +Point(4748)={ 3385.13765989, 5938.83057849, 0.0}; +Point(4749)={ 3160.79442066, 5046.52861590, 0.0}; +Point(4750)={ 2961.49028734, 4100.03209669, 0.0}; +Point(4751)={ 2799.46440235, 3110.98310325, 0.0}; +Point(4752)={ 2679.17522506, 2091.13733175, 0.0}; +Point(4753)={ 2604.81216567, 1050.81394965, 0.0}; +Point(4754)={ 2580.33427265, -0.00029383, 0.0}; +Point(4755)={ 2604.81216567, -1050.81434143, 0.0}; +Point(4756)={ 2679.17522506, -2091.13791941, 0.0}; +Point(4757)={ 2799.46450029, -3110.98388679, 0.0}; +Point(4758)={ 2961.49048323, -4100.03336995, 0.0}; +Point(4759)={ 3160.79481243, -5046.53037888, 0.0}; +Point(4760)={ 3385.13824755, -5938.83263529, 0.0}; +Point(4761)={ 3614.69156009, -6765.79119936, 0.0}; +Point(4762)={ 3825.93513048, -7514.75321782, 0.0}; +Point(4763)={ 3993.59870754, -8169.37662168, 0.0}; +Point(4764)={ 4100.94639379, -8706.67420905, 0.0}; +Point(4765)={ 4147.97064764, -9100.31059954, 0.0}; +Point(4766)={ 4156.00363161, -9333.85293107, 0.0}; +Point(4767)={ 4154.57121649, -9446.74163973, 0.0}; +Point(4768)={ 4148.91775562, -9533.84805164, 0.0}; +Point(4769)={ 4141.60651299, -9619.23213741, 0.0}; +Point(4770)={ 4127.31899249, -9722.01823040, 0.0}; +Point(4771)={ 4100.04825727, -9859.04017097, 0.0}; +Point(4772)={ 4052.79834295, -10029.17181151, 0.0}; +Point(4773)={ 3979.17631965, -10215.73925243, 0.0}; +Point(4774)={ 3879.69139257, -10402.84988474, 0.0}; +Point(4775)={ 3761.93051366, -10577.29424560, 0.0}; +Point(4776)={ 3637.17895928, -10730.42035184, 0.0}; +Point(4777)={ 3518.18184491, -10859.19755588, 0.0}; +Point(4778)={ 3414.70398112, -10962.28501921, 0.0}; +Point(4779)={ 3333.41106881, -11037.83397140, 0.0}; +Point(4780)={ 3280.88859360, -11085.29181853, 0.0}; +Point(4781)={ 3261.49903084, -11102.67658779, 0.0}; +Point(4782)={ 0.00000000, 0.00000000, 0.0}; +Point(4783)={ 3261.49903084, 11013.79897623, 0.0}; +Point(4784)={ 3280.60269824, 10996.50157204, 0.0}; +Point(4785)={ 3332.37992581, 10949.33197091, 0.0}; +Point(4786)={ 3411.05550964, 10872.74188554, 0.0}; +Point(4787)={ 3512.05385062, 10769.38880103, 0.0}; +Point(4788)={ 3625.99427029, 10638.63932054, 0.0}; +Point(4789)={ 3744.14868383, 10483.28021381, 0.0}; +Point(4790)={ 3854.64562653, 10307.35946146, 0.0}; +Point(4791)={ 3946.02137006, 10119.66136755, 0.0}; +Point(4792)={ 4012.71432398, 9934.59147379, 0.0}; +Point(4793)={ 4054.39393096, 9768.04983282, 0.0}; +Point(4794)={ 4076.28005860, 9635.32915324, 0.0}; +Point(4795)={ 4087.87747903, 9535.80220866, 0.0}; +Point(4796)={ 4095.00488281, 9452.87776329, 0.0}; +Point(4797)={ 4098.44072023, 9369.21453451, 0.0}; +Point(4798)={ 4100.60232034, 9266.15508286, 0.0}; +Point(4799)={ 4092.14103201, 9053.87762706, 0.0}; +Point(4800)={ 4049.80648076, 8678.31816840, 0.0}; +Point(4801)={ 3949.98698069, 8154.21427507, 0.0}; +Point(4802)={ 3788.60066293, 7508.09525443, 0.0}; +Point(4803)={ 3583.03690005, 6763.73635703, 0.0}; +Point(4804)={ 3357.69092126, 5939.03743392, 0.0}; +Point(4805)={ 3136.02181740, 5047.70588973, 0.0}; +Point(4806)={ 2938.92776594, 4101.34394408, 0.0}; +Point(4807)={ 2778.23938938, 3112.15028895, 0.0}; +Point(4808)={ 2658.61632185, 2092.01911180, 0.0}; +Point(4809)={ 2584.61359444, 1051.27927644, 0.0}; +Point(4810)={ 2560.17624978, -0.00029383, 0.0}; +Point(4811)={ 2584.61359444, -1051.27966821, 0.0}; +Point(4812)={ 2658.61641979, -2092.01960152, 0.0}; +Point(4813)={ 2778.23948732, -3112.15107250, 0.0}; +Point(4814)={ 2938.92796182, -4101.34502145, 0.0}; +Point(4815)={ 3136.02220917, -5047.70755476, 0.0}; +Point(4816)={ 3357.69141098, -5939.03929484, 0.0}; +Point(4817)={ 3583.03787948, -6763.74007886, 0.0}; +Point(4818)={ 3788.60174030, -7508.09946597, 0.0}; +Point(4819)={ 3949.98844984, -8154.22073931, 0.0}; +Point(4820)={ 4049.80785196, -8678.32717915, 0.0}; +Point(4821)={ 4092.14201144, -9053.88869461, 0.0}; +Point(4822)={ 4100.60202651, -9266.16536686, 0.0}; +Point(4823)={ 4098.44062229, -9369.22266378, 0.0}; +Point(4824)={ 4095.00439310, -9452.88344398, 0.0}; +Point(4825)={ 4087.87708726, -9535.80710581, 0.0}; +Point(4826)={ 4076.27996066, -9635.33023062, 0.0}; +Point(4827)={ 4054.39530216, -9768.04434801, 0.0}; +Point(4828)={ 4012.71833964, -9934.57991653, 0.0}; +Point(4829)={ 3946.02969520, -10119.64295428, 0.0}; +Point(4830)={ 3854.65777145, -10307.33801196, 0.0}; +Point(4831)={ 3744.16513824, -10483.25690340, 0.0}; +Point(4832)={ 3626.01327121, -10638.61679367, 0.0}; +Point(4833)={ 3512.07392891, -10769.36666593, 0.0}; +Point(4834)={ 3411.07686119, -10872.72063193, 0.0}; +Point(4835)={ 3332.40206091, -10949.31150084, 0.0}; +Point(4836)={ 3280.61014190, -10996.46484345, 0.0}; +Point(4837)={ 3261.49903084, -11013.75402043, 0.0}; +Point(4838)={ 0.00000000, 0.00000000, 0.0}; +Point(4839)={ 3847.07787141, 13347.54051378, 0.0}; +Point(4840)={ 3864.62933951, 13340.86070912, 0.0}; +Point(4841)={ 3912.13057535, 13323.65703630, 0.0}; +Point(4842)={ 3986.84368272, 13299.21988753, 0.0}; +Point(4843)={ 4084.51950623, 13269.41566296, 0.0}; +Point(4844)={ 4201.35051511, 13240.23004584, 0.0}; +Point(4845)={ 4332.37962262, 13216.29240592, 0.0}; +Point(4846)={ 4472.73965358, 13201.36933386, 0.0}; +Point(4847)={ 4621.29241341, 13198.12918638, 0.0}; +Point(4848)={ 4776.70715171, 13208.43493566, 0.0}; +Point(4849)={ 4923.96549799, 13231.83134303, 0.0}; +Point(4850)={ 5040.09680270, 13261.27836979, 0.0}; +Point(4851)={ 5127.82054879, 13289.83392015, 0.0}; +Point(4852)={ 5208.32051528, 13320.37810343, 0.0}; +Point(4853)={ 5294.11703865, 13357.99915195, 0.0}; +Point(4854)={ 5404.95570419, 13416.39859376, 0.0}; +Point(4855)={ 5546.06744701, 13507.06963802, 0.0}; +Point(4856)={ 5707.33780037, 13635.16506142, 0.0}; +Point(4857)={ 5877.15602359, 13800.83579401, 0.0}; +Point(4858)={ 6043.97621421, 14000.00251342, 0.0}; +Point(4859)={ 6202.58075734, 14223.95065094, 0.0}; +Point(4860)={ 6349.38043694, 14462.28327244, 0.0}; +Point(4861)={ 6484.19151212, 14704.54604925, 0.0}; +Point(4862)={ 6606.73935095, 14942.28288402, 0.0}; +Point(4863)={ 6715.82865810, 15167.92229977, 0.0}; +Point(4864)={ 6811.08774021, 15374.71034908, 0.0}; +Point(4865)={ 6891.22698294, 15558.52412497, 0.0}; +Point(4866)={ 6956.86342665, 15717.75285828, 0.0}; +Point(4867)={ 7009.62968177, 15854.03807226, 0.0}; +Point(4868)={ 7051.74484089, 15971.54527902, 0.0}; +Point(4869)={ 7085.46903470, 16075.18092884, 0.0}; +Point(4870)={ 7114.28188109, 16167.75108620, 0.0}; +Point(4871)={ 7136.97838840, 16252.57209816, 0.0}; +Point(4872)={ 7157.44248287, 16330.18000628, 0.0}; +Point(4873)={ 7172.43274378, 16402.13494325, 0.0}; +Point(4874)={ 7186.05709281, 16467.53260213, 0.0}; +Point(4875)={ 7196.42572144, 16526.49844781, 0.0}; +Point(4876)={ 7203.88897148, 16578.65353914, 0.0}; +Point(4877)={ 7210.29659278, 16623.23392141, 0.0}; +Point(4878)={ 7215.57121047, 16659.93136825, 0.0}; +Point(4879)={ 7218.01469028, 16688.65831871, 0.0}; +Point(4880)={ 7219.45298197, 16708.99831951, 0.0}; +Point(4881)={ 7220.28363582, 16720.74627820, 0.0}; +Point(4882)={ 3760.69760826, 13261.16025064, 0.0}; +Point(4883)={ 3778.61332606, 13252.71326198, 0.0}; +Point(4884)={ 3827.60691808, 13231.43379274, 0.0}; +Point(4885)={ 3905.02804907, 13200.63730852, 0.0}; +Point(4886)={ 4007.85968551, 13165.45954393, 0.0}; +Point(4887)={ 4132.03102607, 13130.48109316, 0.0}; +Point(4888)={ 4272.29076349, 13097.07247142, 0.0}; +Point(4889)={ 4425.61373499, 13073.03316677, 0.0}; +Point(4890)={ 4591.04176504, 13062.03319811, 0.0}; +Point(4891)={ 4765.34038685, 13068.54924223, 0.0}; +Point(4892)={ 4929.71288611, 13091.38796265, 0.0}; +Point(4893)={ 5057.33387405, 13122.30285986, 0.0}; +Point(4894)={ 5149.92136730, 13151.23206243, 0.0}; +Point(4895)={ 5234.19938374, 13182.65087593, 0.0}; +Point(4896)={ 5326.40578112, 13223.75692922, 0.0}; +Point(4897)={ 5445.63874202, 13290.54097005, 0.0}; +Point(4898)={ 5596.58816495, 13389.73324369, 0.0}; +Point(4899)={ 5764.58357259, 13530.98308603, 0.0}; +Point(4900)={ 5937.79091446, 13710.30970527, 0.0}; +Point(4901)={ 6103.97751237, 13922.67677883, 0.0}; +Point(4902)={ 6259.90459006, 14157.19334852, 0.0}; +Point(4903)={ 6403.97793072, 14403.59793527, 0.0}; +Point(4904)={ 6534.86374774, 14653.11054451, 0.0}; +Point(4905)={ 6654.81580552, 14897.09770426, 0.0}; +Point(4906)={ 6762.50541049, 15129.00664182, 0.0}; +Point(4907)={ 6857.79083924, 15342.54285994, 0.0}; +Point(4908)={ 6939.29658151, 15533.89383277, 0.0}; +Point(4909)={ 7006.86602657, 15701.45349239, 0.0}; +Point(4910)={ 7061.74873011, 15846.47188422, 0.0}; +Point(4911)={ 7105.92705671, 15972.61608890, 0.0}; +Point(4912)={ 7141.51030497, 16084.33839540, 0.0}; +Point(4913)={ 7171.30414758, 16184.59628795, 0.0}; +Point(4914)={ 7195.27469632, 16276.04940638, 0.0}; +Point(4915)={ 7215.47346344, 16359.89833491, 0.0}; +Point(4916)={ 7231.37537699, 16436.96217015, 0.0}; +Point(4917)={ 7245.17161583, 16506.84796512, 0.0}; +Point(4918)={ 7254.10577254, 16569.96551297, 0.0}; +Point(4919)={ 7261.93816942, 16625.29943952, 0.0}; +Point(4920)={ 7268.12992455, 16672.57824700, 0.0}; +Point(4921)={ 7270.90317815, 16711.70506988, 0.0}; +Point(4922)={ 7273.07320135, 16742.10361205, 0.0}; +Point(4923)={ 7274.60561618, 16763.57064196, 0.0}; +Point(4924)={ 7275.48945304, 16775.95209541, 0.0}; +Point(4925)={ 3678.66591255, 13179.12855492, 0.0}; +Point(4926)={ 3697.33951262, 13169.96031465, 0.0}; +Point(4927)={ 3748.27168873, 13146.15666064, 0.0}; +Point(4928)={ 3828.40564254, 13110.09760571, 0.0}; +Point(4929)={ 3934.84128438, 13066.37197125, 0.0}; +Point(4930)={ 4064.86344079, 13022.05838549, 0.0}; +Point(4931)={ 4214.30904822, 12982.28386612, 0.0}; +Point(4932)={ 4379.95088764, 12950.00501589, 0.0}; +Point(4933)={ 4562.14556922, 12930.70311203, 0.0}; +Point(4934)={ 4755.68850446, 12931.37088682, 0.0}; +Point(4935)={ 4936.81100496, 12953.08375345, 0.0}; +Point(4936)={ 5075.72814092, 12983.66682006, 0.0}; +Point(4937)={ 5172.83090045, 13013.02315169, 0.0}; +Point(4938)={ 5261.20048211, 13046.16233247, 0.0}; +Point(4939)={ 5359.96817323, 13092.90421690, 0.0}; +Point(4940)={ 5489.12990114, 13165.84034597, 0.0}; +Point(4941)={ 5647.39340704, 13277.93297463, 0.0}; +Point(4942)={ 5821.62611327, 13432.68111347, 0.0}; +Point(4943)={ 5996.48888626, 13626.46332324, 0.0}; +Point(4944)={ 6161.74463473, 13851.01704180, 0.0}; +Point(4945)={ 6314.26653113, 14095.33916632, 0.0}; +Point(4946)={ 6454.25016748, 14349.55127244, 0.0}; +Point(4947)={ 6581.57370278, 14605.17042647, 0.0}; +Point(4948)={ 6698.44232175, 14854.62573910, 0.0}; +Point(4949)={ 6805.13976499, 15091.68941222, 0.0}; +Point(4950)={ 6899.67622429, 15311.37213584, 0.0}; +Point(4951)={ 6982.12310002, 15509.45257039, 0.0}; +Point(4952)={ 7051.51173675, 15684.50172875, 0.0}; +Point(4953)={ 7108.52078096, 15837.44458380, 0.0}; +Point(4954)={ 7154.81761278, 15971.53803125, 0.0}; +Point(4955)={ 7192.14453873, 16090.90752458, 0.0}; +Point(4956)={ 7223.19136505, 16198.40751206, 0.0}; +Point(4957)={ 7248.55524967, 16296.27128803, 0.0}; +Point(4958)={ 7268.72130386, 16386.18063024, 0.0}; +Point(4959)={ 7285.53330297, 16468.30409847, 0.0}; +Point(4960)={ 7297.95256238, 16542.99497279, 0.0}; +Point(4961)={ 7307.45214354, 16609.89350889, 0.0}; +Point(4962)={ 7315.56113120, 16668.40166733, 0.0}; +Point(4963)={ 7319.15348140, 16718.62140668, 0.0}; +Point(4964)={ 7322.10244459, 16759.84616677, 0.0}; +Point(4965)={ 7324.39048900, 16791.83158003, 0.0}; +Point(4966)={ 7326.00468616, 16814.39831298, 0.0}; +Point(4967)={ 7326.93455619, 16827.39719856, 0.0}; +Point(4968)={ 3602.01804087, 13102.48068324, 0.0}; +Point(4969)={ 3620.99526397, 13091.83742268, 0.0}; +Point(4970)={ 3672.74232512, 13063.70243919, 0.0}; +Point(4971)={ 3755.33915145, 13022.75936292, 0.0}; +Point(4972)={ 3866.30386951, 12974.31072528, 0.0}; +Point(4973)={ 4001.51533532, 12921.15759565, 0.0}; +Point(4974)={ 4158.64182193, 12870.84275372, 0.0}; +Point(4975)={ 4336.25130600, 12829.44629970, 0.0}; +Point(4976)={ 4535.31714421, 12802.60514211, 0.0}; +Point(4977)={ 4747.73955552, 12797.02425694, 0.0}; +Point(4978)={ 4945.41039280, 12815.02469536, 0.0}; +Point(4979)={ 5095.39449036, 12846.07592910, 0.0}; +Point(4980)={ 5197.20419044, 12876.62902519, 0.0}; +Point(4981)={ 5289.50196855, 12912.98709983, 0.0}; +Point(4982)={ 5395.16709349, 12963.91232200, 0.0}; +Point(4983)={ 5534.54495292, 13044.12463015, 0.0}; +Point(4984)={ 5700.95564422, 13169.88254797, 0.0}; +Point(4985)={ 5879.32869124, 13339.75630482, 0.0}; +Point(4986)={ 6054.80595808, 13548.01134309, 0.0}; +Point(4987)={ 6217.22723861, 13784.93662286, 0.0}; +Point(4988)={ 6365.53308435, 14038.45186516, 0.0}; +Point(4989)={ 6500.76276754, 14299.74034681, 0.0}; +Point(4990)={ 6624.66114121, 14560.48612678, 0.0}; +Point(4991)={ 6738.33349112, 14814.61272874, 0.0}; +Point(4992)={ 6842.95816849, 15056.41037465, 0.0}; +Point(4993)={ 6937.55662565, 15281.00356420, 0.0}; +Point(4994)={ 7020.40359818, 15485.09289446, 0.0}; +Point(4995)={ 7091.34560953, 15666.78532478, 0.0}; +Point(4996)={ 7150.40048531, 15826.80837513, 0.0}; +Point(4997)={ 7198.54824233, 15968.13441705, 0.0}; +Point(4998)={ 7237.64852267, 16094.39203962, 0.0}; +Point(4999)={ 7270.04431674, 16208.40101933, 0.0}; +Point(5000)={ 7296.72788419, 16312.11267285, 0.0}; +Point(5001)={ 7316.99726815, 16407.45951182, 0.0}; +Point(5002)={ 7334.61102795, 16494.22615976, 0.0}; +Point(5003)={ 7346.08641150, 16573.24562116, 0.0}; +Point(5004)={ 7356.15415950, 16643.59507788, 0.0}; +Point(5005)={ 7362.22387776, 16705.33642985, 0.0}; +Point(5006)={ 7366.09889120, 16758.02756275, 0.0}; +Point(5007)={ 7369.27557167, 16801.22273838, 0.0}; +Point(5008)={ 7371.67909078, 16834.71960669, 0.0}; +Point(5009)={ 7371.60533976, 16858.39936291, 0.0}; +Point(5010)={ 7371.56293048, 16872.02557285, 0.0}; +Point(5011)={ 3529.19395848, 13029.65669880, 0.0}; +Point(5012)={ 3548.83043533, 13018.29963028, 0.0}; +Point(5013)={ 3602.37308393, 12988.04555391, 0.0}; +Point(5014)={ 3687.30330223, 12942.46331358, 0.0}; +Point(5015)={ 3800.65087345, 12885.40745267, 0.0}; +Point(5016)={ 3941.39777892, 12825.66305877, 0.0}; +Point(5017)={ 4106.17370505, 12766.73345197, 0.0}; +Point(5018)={ 4295.31998288, 12713.95661902, 0.0}; +Point(5019)={ 4511.10614562, 12676.40775443, 0.0}; +Point(5020)={ 4742.03859233, 12663.26381539, 0.0}; +Point(5021)={ 4955.89508378, 12678.79462324, 0.0}; +Point(5022)={ 5117.18512366, 12710.81500212, 0.0}; +Point(5023)={ 5223.35152043, 12743.70286138, 0.0}; +Point(5024)={ 5319.05692841, 12781.84516209, 0.0}; +Point(5025)={ 5432.42330466, 12836.12904266, 0.0}; +Point(5026)={ 5580.96695579, 12927.86570582, 0.0}; +Point(5027)={ 5755.85490011, 13067.33004884, 0.0}; +Point(5028)={ 5937.23410899, 13253.09347637, 0.0}; +Point(5029)={ 6110.49238117, 13476.64631629, 0.0}; +Point(5030)={ 6270.48928076, 13724.23229047, 0.0}; +Point(5031)={ 6413.54097888, 13986.47914353, 0.0}; +Point(5032)={ 6544.58526754, 14253.55977322, 0.0}; +Point(5033)={ 6664.43938240, 14519.01033900, 0.0}; +Point(5034)={ 6774.56512147, 14777.27052370, 0.0}; +Point(5035)={ 6877.23995130, 15022.96659141, 0.0}; +Point(5036)={ 6970.85300481, 15252.13195206, 0.0}; +Point(5037)={ 7054.41858449, 15461.31313852, 0.0}; +Point(5038)={ 7126.83032721, 15648.91338746, 0.0}; +Point(5039)={ 7187.63916470, 15815.43387277, 0.0}; +Point(5040)={ 7237.73118649, 15963.33570399, 0.0}; +Point(5041)={ 7278.70903250, 16095.93865617, 0.0}; +Point(5042)={ 7312.31177709, 16216.06936183, 0.0}; +Point(5043)={ 7340.27820083, 16325.34436874, 0.0}; +Point(5044)={ 7360.95492937, 16425.77689351, 0.0}; +Point(5045)={ 7378.36908150, 16517.14274480, 0.0}; +Point(5046)={ 7390.18677555, 16600.04495713, 0.0}; +Point(5047)={ 7400.13591468, 16673.77638267, 0.0}; +Point(5048)={ 7404.98085680, 16738.53574758, 0.0}; +Point(5049)={ 7409.16066859, 16793.57986104, 0.0}; +Point(5050)={ 7412.22285379, 16838.69040830, 0.0}; +Point(5051)={ 7412.20453846, 16873.74496071, 0.0}; +Point(5052)={ 7412.19170794, 16898.44498826, 0.0}; +Point(5053)={ 7412.18436222, 16912.64700460, 0.0}; +Point(5054)={ 3462.87240409, 12963.33504647, 0.0}; +Point(5055)={ 3482.66421840, 12950.52763928, 0.0}; +Point(5056)={ 3536.62038198, 12916.13802132, 0.0}; +Point(5057)={ 3623.20436639, 12865.39889069, 0.0}; +Point(5058)={ 3740.65192592, 12804.30210103, 0.0}; +Point(5059)={ 3885.15827220, 12735.30396269, 0.0}; +Point(5060)={ 4057.00019190, 12666.99103298, 0.0}; +Point(5061)={ 4258.27474075, 12604.98768372, 0.0}; +Point(5062)={ 4490.26046556, 12555.69595347, 0.0}; +Point(5063)={ 4739.18943297, 12533.63274504, 0.0}; +Point(5064)={ 4968.94744620, 12545.86689235, 0.0}; +Point(5065)={ 5141.40748363, 12579.24368264, 0.0}; +Point(5066)={ 5251.13038348, 12613.49373195, 0.0}; +Point(5067)={ 5349.48779174, 12651.89146778, 0.0}; +Point(5068)={ 5471.51173391, 12711.74624334, 0.0}; +Point(5069)={ 5629.84399574, 12816.38100883, 0.0}; +Point(5070)={ 5810.81556621, 12971.77655032, 0.0}; +Point(5071)={ 5994.33786399, 13173.45697461, 0.0}; +Point(5072)={ 6164.88703517, 13411.19145874, 0.0}; +Point(5073)={ 6319.87102055, 13669.61638342, 0.0}; +Point(5074)={ 6458.47405358, 13939.08975850, 0.0}; +Point(5075)={ 6584.38554589, 14211.62110723, 0.0}; +Point(5076)={ 6699.66415960, 14481.27126926, 0.0}; +Point(5077)={ 6807.71742660, 14742.40842911, 0.0}; +Point(5078)={ 6907.70254814, 14991.68127410, 0.0}; +Point(5079)={ 7001.09904986, 15224.40411727, 0.0}; +Point(5080)={ 7084.70733266, 15438.25864986, 0.0}; +Point(5081)={ 7158.17343084, 15631.23018614, 0.0}; +Point(5082)={ 7220.72428099, 15803.59903872, 0.0}; +Point(5083)={ 7272.74293785, 15957.50437878, 0.0}; +Point(5084)={ 7315.36769395, 16096.05403293, 0.0}; +Point(5085)={ 7350.38953342, 16221.86836587, 0.0}; +Point(5086)={ 7379.36809923, 16336.54051705, 0.0}; +Point(5087)={ 7400.75530566, 16441.83502600, 0.0}; +Point(5088)={ 7417.94928213, 16537.65865107, 0.0}; +Point(5089)={ 7430.49224345, 16624.25830634, 0.0}; +Point(5090)={ 7439.23746828, 16701.39755763, 0.0}; +Point(5091)={ 7444.44039175, 16768.89922619, 0.0}; +Point(5092)={ 7448.85810688, 16826.21512554, 0.0}; +Point(5093)={ 7449.54125870, 16873.27042729, 0.0}; +Point(5094)={ 7449.62264927, 16909.73741446, 0.0}; +Point(5095)={ 7449.67994587, 16935.41873206, 0.0}; +Point(5096)={ 7449.71285469, 16950.17549706, 0.0}; +Point(5097)={ 3399.35662035, 12899.81926273, 0.0}; +Point(5098)={ 3419.63648421, 12886.19060421, 0.0}; +Point(5099)={ 3475.21223180, 12849.89991429, 0.0}; +Point(5100)={ 3564.45223215, 12796.07607159, 0.0}; +Point(5101)={ 3683.49479203, 12726.84737563, 0.0}; +Point(5102)={ 3833.15107466, 12651.97560074, 0.0}; +Point(5103)={ 4012.42911421, 12573.76279718, 0.0}; +Point(5104)={ 4225.84848644, 12499.95527000, 0.0}; +Point(5105)={ 4473.87255927, 12440.89059992, 0.0}; +Point(5106)={ 4739.49021566, 12408.84250320, 0.0}; +Point(5107)={ 4984.81459001, 12416.79625135, 0.0}; +Point(5108)={ 5167.50594011, 12451.58910029, 0.0}; +Point(5109)={ 5280.04548228, 12484.60585243, 0.0}; +Point(5110)={ 5381.16703544, 12524.05324246, 0.0}; +Point(5111)={ 5511.94482143, 12592.82052936, 0.0}; +Point(5112)={ 5681.32102828, 12709.29688695, 0.0}; +Point(5113)={ 5867.91315081, 12881.62910888, 0.0}; +Point(5114)={ 6049.42693325, 13101.58656238, 0.0}; +Point(5115)={ 6216.73664256, 13352.16341932, 0.0}; +Point(5116)={ 6365.96422906, 13620.48292892, 0.0}; +Point(5117)={ 6499.32976477, 13896.53415009, 0.0}; +Point(5118)={ 6620.37173130, 14173.63874730, 0.0}; +Point(5119)={ 6732.57150950, 14446.22758852, 0.0}; +Point(5120)={ 6836.65759878, 14710.49872573, 0.0}; +Point(5121)={ 6935.25535894, 14962.26519730, 0.0}; +Point(5122)={ 7027.09084650, 15198.46540568, 0.0}; +Point(5123)={ 7111.14888316, 15416.17360016, 0.0}; +Point(5124)={ 7185.69489991, 15613.83013778, 0.0}; +Point(5125)={ 7249.84182779, 15791.43952391, 0.0}; +Point(5126)={ 7303.66165483, 15950.77276231, 0.0}; +Point(5127)={ 7348.08072511, 16094.65726903, 0.0}; +Point(5128)={ 7384.41813381, 16225.69901117, 0.0}; +Point(5129)={ 7414.21413117, 16345.44871889, 0.0}; +Point(5130)={ 7436.73639803, 16455.28934613, 0.0}; +Point(5131)={ 7453.76906252, 16555.39914900, 0.0}; +Point(5132)={ 7466.84973044, 16645.61505254, 0.0}; +Point(5133)={ 7474.56665262, 16726.05213967, 0.0}; +Point(5134)={ 7480.17065232, 16796.19905045, 0.0}; +Point(5135)={ 7483.29424773, 16855.78595214, 0.0}; +Point(5136)={ 7483.53734204, 16904.65074923, 0.0}; +Point(5137)={ 7483.72549038, 16942.47777169, 0.0}; +Point(5138)={ 7483.85790920, 16969.10502196, 0.0}; +Point(5139)={ 7483.93401084, 16984.39665322, 0.0}; +Point(5140)={ 3341.89723463, 12842.35987701, 0.0}; +Point(5141)={ 3362.68493249, 12828.01858585, 0.0}; +Point(5142)={ 3419.68496595, 12789.73622677, 0.0}; +Point(5143)={ 3509.27374101, 12729.60868020, 0.0}; +Point(5144)={ 3632.08279358, 12656.37872238, 0.0}; +Point(5145)={ 3786.13886779, 12572.83929345, 0.0}; +Point(5146)={ 3974.61012306, 12485.94443823, 0.0}; +Point(5147)={ 4200.55316185, 12399.79365533, 0.0}; +Point(5148)={ 4463.19305983, 12328.49816801, 0.0}; +Point(5149)={ 4743.98550157, 12289.61639830, 0.0}; +Point(5150)={ 5003.06879852, 12292.28847687, 0.0}; +Point(5151)={ 5196.07197036, 12323.94607520, 0.0}; +Point(5152)={ 5310.59485654, 12358.22599710, 0.0}; +Point(5153)={ 5414.26517815, 12400.93694297, 0.0}; +Point(5154)={ 5554.74254472, 12478.34543932, 0.0}; +Point(5155)={ 5733.06133137, 12609.84467281, 0.0}; +Point(5156)={ 5922.91652002, 12800.95989704, 0.0}; +Point(5157)={ 6103.37908117, 13036.44002913, 0.0}; +Point(5158)={ 6265.34708190, 13299.54045468, 0.0}; +Point(5159)={ 6409.56929578, 13576.09382917, 0.0}; +Point(5160)={ 6537.70125190, 13857.91849128, 0.0}; +Point(5161)={ 6653.36213679, 14139.16636757, 0.0}; +Point(5162)={ 6761.38964481, 14414.61915754, 0.0}; +Point(5163)={ 6863.13499639, 14680.92427524, 0.0}; +Point(5164)={ 6959.30171549, 14935.12041667, 0.0}; +Point(5165)={ 7050.31673526, 15173.95754212, 0.0}; +Point(5166)={ 7134.66762123, 15394.98120218, 0.0}; +Point(5167)={ 7209.98689729, 15596.84840361, 0.0}; +Point(5168)={ 7275.52559397, 15779.16375086, 0.0}; +Point(5169)={ 7330.93669953, 15943.38189209, 0.0}; +Point(5170)={ 7376.91129918, 16092.04689449, 0.0}; +Point(5171)={ 7414.58366978, 16227.69156181, 0.0}; +Point(5172)={ 7445.29621693, 16351.92597761, 0.0}; +Point(5173)={ 7468.64668908, 16465.94328247, 0.0}; +Point(5174)={ 7485.88150774, 16569.96071377, 0.0}; +Point(5175)={ 7499.72985221, 16663.56984956, 0.0}; +Point(5176)={ 7506.66205577, 16747.12955267, 0.0}; +Point(5177)={ 7512.57575096, 16819.81151989, 0.0}; +Point(5178)={ 7514.08710807, 16881.59890502, 0.0}; +Point(5179)={ 7514.47114223, 16932.17094504, 0.0}; +Point(5180)={ 7514.76830103, 16971.29727821, 0.0}; +Point(5181)={ 7514.97740915, 16998.82903129, 0.0}; +Point(5182)={ 7514.13931164, 17014.60195402, 0.0}; +Point(5183)={ 3289.89219184, 12790.35483422, 0.0}; +Point(5184)={ 3310.58018382, 12774.52657374, 0.0}; +Point(5185)={ 3367.91821827, 12732.66018962, 0.0}; +Point(5186)={ 3460.49924729, 12669.51012472, 0.0}; +Point(5187)={ 3587.15882758, 12589.56892256, 0.0}; +Point(5188)={ 3748.69157000, 12498.33754689, 0.0}; +Point(5189)={ 3947.28218919, 12400.44174360, 0.0}; +Point(5190)={ 4185.75790529, 12304.66131135, 0.0}; +Point(5191)={ 4460.18180494, 12221.10425270, 0.0}; +Point(5192)={ 4753.13003967, 12171.45121104, 0.0}; +Point(5193)={ 5024.26912988, 12168.72692889, 0.0}; +Point(5194)={ 5226.77354790, 12201.14250743, 0.0}; +Point(5195)={ 5343.39035563, 12236.90518710, 0.0}; +Point(5196)={ 5448.59632419, 12282.80770076, 0.0}; +Point(5197)={ 5600.55730153, 12367.09129995, 0.0}; +Point(5198)={ 5786.98801413, 12516.68548677, 0.0}; +Point(5199)={ 5978.30382545, 12727.13630722, 0.0}; +Point(5200)={ 6154.12585134, 12978.96330751, 0.0}; +Point(5201)={ 6310.55919595, 13252.98505356, 0.0}; +Point(5202)={ 6448.84009474, 13537.07082578, 0.0}; +Point(5203)={ 6571.42476010, 13823.98861736, 0.0}; +Point(5204)={ 6683.37625302, 14108.12864995, 0.0}; +Point(5205)={ 6787.73452566, 14385.84196237, 0.0}; +Point(5206)={ 6885.92121941, 14654.26186346, 0.0}; +Point(5207)={ 6980.55366276, 14910.15006667, 0.0}; +Point(5208)={ 7070.54126137, 15151.26093687, 0.0}; +Point(5209)={ 7154.69733889, 15375.30270782, 0.0}; +Point(5210)={ 7230.94041251, 15580.82239639, 0.0}; +Point(5211)={ 7297.87068211, 15767.35820174, 0.0}; +Point(5212)={ 7354.90587707, 15935.96947443, 0.0}; +Point(5213)={ 7402.35647642, 16088.90439610, 0.0}; +Point(5214)={ 7441.26410306, 16228.56178460, 0.0}; +Point(5215)={ 7472.73345510, 16356.64271246, 0.0}; +Point(5216)={ 7497.12985962, 16474.14600151, 0.0}; +Point(5217)={ 7514.44597090, 16581.53433407, 0.0}; +Point(5218)={ 7527.97747005, 16678.25687920, 0.0}; +Point(5219)={ 7535.09400217, 16764.51814171, 0.0}; +Point(5220)={ 7540.99124296, 16839.54006308, 0.0}; +Point(5221)={ 7541.64089830, 16903.35329945, 0.0}; +Point(5222)={ 7542.17214067, 16955.52807731, 0.0}; +Point(5223)={ 7542.58301119, 16995.88565084, 0.0}; +Point(5224)={ 7541.13698201, 17024.22680416, 0.0}; +Point(5225)={ 7540.01661302, 17040.47925540, 0.0}; +Point(5226)={ 3261.49903084, 12726.17137364, 0.0}; +Point(5227)={ 3282.92688358, 12710.20873548, 0.0}; +Point(5228)={ 3341.98097582, 12667.29916139, 0.0}; +Point(5229)={ 3437.01106741, 12601.21345353, 0.0}; +Point(5230)={ 3567.24605377, 12515.99763369, 0.0}; +Point(5231)={ 3734.82912175, 12418.68331747, 0.0}; +Point(5232)={ 3940.78690897, 12314.23767975, 0.0}; +Point(5233)={ 4185.69149999, 12209.18655894, 0.0}; +Point(5234)={ 4467.62448697, 12120.29993663, 0.0}; +Point(5235)={ 4767.82137880, 12059.84545661, 0.0}; +Point(5236)={ 5048.99667939, 12050.54940083, 0.0}; +Point(5237)={ 5260.82555664, 12083.18319617, 0.0}; +Point(5238)={ 5377.63844609, 12121.17956194, 0.0}; +Point(5239)={ 5485.44284015, 12166.05357706, 0.0}; +Point(5240)={ 5646.71554413, 12264.48463838, 0.0}; +Point(5241)={ 5839.98032149, 12433.11687085, 0.0}; +Point(5242)={ 6030.93158929, 12662.25754990, 0.0}; +Point(5243)={ 6202.75284303, 12927.92672425, 0.0}; +Point(5244)={ 6352.44438512, 13212.11092910, 0.0}; +Point(5245)={ 6484.15938685, 13502.94026683, 0.0}; +Point(5246)={ 6602.39675803, 13793.72993767, 0.0}; +Point(5247)={ 6709.58969448, 14080.75556439, 0.0}; +Point(5248)={ 6810.74415647, 14360.25515967, 0.0}; +Point(5249)={ 6906.46357028, 14630.09023793, 0.0}; +Point(5250)={ 6999.60199242, 14887.37109143, 0.0}; +Point(5251)={ 7088.27950661, 15130.56550124, 0.0}; +Point(5252)={ 7172.34723962, 15357.22900810, 0.0}; +Point(5253)={ 7249.36318077, 15566.13850092, 0.0}; +Point(5254)={ 7317.54780527, 15756.70906460, 0.0}; +Point(5255)={ 7376.09445527, 15929.59564343, 0.0}; +Point(5256)={ 7425.04769481, 16086.66307046, 0.0}; +Point(5257)={ 7465.04258573, 16230.18244600, 0.0}; +Point(5258)={ 7497.41252287, 16361.77296229, 0.0}; +Point(5259)={ 7522.49785785, 16482.46086518, 0.0}; +Point(5260)={ 7539.85050184, 16592.80149099, 0.0}; +Point(5261)={ 7553.20893586, 16692.17966029, 0.0}; +Point(5262)={ 7560.80724917, 16780.70761565, 0.0}; +Point(5263)={ 7565.67432639, 16857.77145089, 0.0}; +Point(5264)={ 7566.49410858, 16923.25980491, 0.0}; +Point(5265)={ 7567.16413605, 16976.78619498, 0.0}; +Point(5266)={ 7566.43465723, 17018.15022990, 0.0}; +Point(5267)={ 7564.51164606, 17047.20577883, 0.0}; +Point(5268)={ 7563.40861296, 17063.87125534, 0.0}; +Point(5269)={ 3261.49903084, 12650.45013986, 0.0}; +Point(5270)={ 3283.55136760, 12634.45733529, 0.0}; +Point(5271)={ 3343.14267673, 12589.88606172, 0.0}; +Point(5272)={ 3439.26404825, 12521.60378813, 0.0}; +Point(5273)={ 3572.21939904, 12435.55800004, 0.0}; +Point(5274)={ 3741.43850546, 12335.10206692, 0.0}; +Point(5275)={ 3949.13331026, 12227.07544038, 0.0}; +Point(5276)={ 4196.75385828, 12119.98465839, 0.0}; +Point(5277)={ 4479.75814485, 12021.00776121, 0.0}; +Point(5278)={ 4785.15541363, 11955.73507748, 0.0}; +Point(5279)={ 5074.43872246, 11939.34834651, 0.0}; +Point(5280)={ 5295.32036529, 11970.18302848, 0.0}; +Point(5281)={ 5413.13070538, 12005.26725758, 0.0}; +Point(5282)={ 5523.15546529, 12053.91001808, 0.0}; +Point(5283)={ 5695.67828413, 12167.10499424, 0.0}; +Point(5284)={ 5893.73266587, 12356.32453337, 0.0}; +Point(5285)={ 6081.16317974, 12604.77671468, 0.0}; +Point(5286)={ 6246.39326715, 12883.87121807, 0.0}; +Point(5287)={ 6390.54212180, 13176.21299027, 0.0}; +Point(5288)={ 6516.32403564, 13472.59862949, 0.0}; +Point(5289)={ 6629.50559361, 13766.93207084, 0.0}; +Point(5290)={ 6733.94535475, 14055.75896569, 0.0}; +Point(5291)={ 6830.72872244, 14337.16844779, 0.0}; +Point(5292)={ 6924.47429270, 14607.95347437, 0.0}; +Point(5293)={ 7015.29401430, 14866.63706628, 0.0}; +Point(5294)={ 7103.40414519, 15111.28259830, 0.0}; +Point(5295)={ 7187.37393529, 15340.16421834, 0.0}; +Point(5296)={ 7265.12268532, 15552.08212569, 0.0}; +Point(5297)={ 7334.50603314, 15746.39166012, 0.0}; +Point(5298)={ 7394.47716489, 15923.37910874, 0.0}; +Point(5299)={ 7444.85615942, 16084.48599537, 0.0}; +Point(5300)={ 7486.06054739, 16231.72955226, 0.0}; +Point(5301)={ 7519.11432195, 16366.72554367, 0.0}; +Point(5302)={ 7544.96566846, 16490.35712083, 0.0}; +Point(5303)={ 7562.60440370, 16603.31321422, 0.0}; +Point(5304)={ 7575.54305439, 16705.02986853, 0.0}; +Point(5305)={ 7583.42726306, 16795.47446877, 0.0}; +Point(5306)={ 7587.36691883, 16874.22135504, 0.0}; +Point(5307)={ 7588.34047139, 16941.06063567, 0.0}; +Point(5308)={ 7589.13576785, 16995.66968671, 0.0}; +Point(5309)={ 7586.96721380, 17037.82705923, 0.0}; +Point(5310)={ 7585.07750322, 17067.46272404, 0.0}; +Point(5311)={ 7583.99386282, 17084.45650520, 0.0}; +Point(5312)={ 3261.49903084, 12581.12898579, 0.0}; +Point(5313)={ 3283.58026076, 12564.33422464, 0.0}; +Point(5314)={ 3344.45001874, 12519.21074892, 0.0}; +Point(5315)={ 3442.94297998, 12450.72191373, 0.0}; +Point(5316)={ 3576.62927874, 12361.19631185, 0.0}; +Point(5317)={ 3748.36786867, 12259.54860935, 0.0}; +Point(5318)={ 3957.68304103, 12148.72267640, 0.0}; +Point(5319)={ 4205.66999350, 12035.17863170, 0.0}; +Point(5320)={ 4491.17339146, 11932.32358690, 0.0}; +Point(5321)={ 4799.57760564, 11854.58649207, 0.0}; +Point(5322)={ 5097.24365258, 11829.87431960, 0.0}; +Point(5323)={ 5328.78510832, 11857.11028508, 0.0}; +Point(5324)={ 5447.77938235, 11894.70596638, 0.0}; +Point(5325)={ 5559.95761311, 11949.53813138, 0.0}; +Point(5326)={ 5744.64690071, 12076.65040382, 0.0}; +Point(5327)={ 5944.06582312, 12288.88456885, 0.0}; +Point(5328)={ 6128.37803050, 12553.88577253, 0.0}; +Point(5329)={ 6285.61930620, 12845.35389394, 0.0}; +Point(5330)={ 6423.16945291, 13145.00436226, 0.0}; +Point(5331)={ 6544.65990004, 13445.50752158, 0.0}; +Point(5332)={ 6653.43549604, 13742.67396171, 0.0}; +Point(5333)={ 6753.32042197, 14033.60241767, 0.0}; +Point(5334)={ 6848.04395223, 14315.80425794, 0.0}; +Point(5335)={ 6939.99070294, 14587.21318088, 0.0}; +Point(5336)={ 7028.59319286, 14846.91675030, 0.0}; +Point(5337)={ 7115.92340433, 15092.63700991, 0.0}; +Point(5338)={ 7199.65548697, 15323.28170034, 0.0}; +Point(5339)={ 7277.89512689, 15537.74338105, 0.0}; +Point(5340)={ 7348.40080256, 15735.31020296, 0.0}; +Point(5341)={ 7409.80131319, 15915.99871841, 0.0}; +Point(5342)={ 7461.54475045, 16080.87768048, 0.0}; +Point(5343)={ 7503.96490381, 16231.62818135, 0.0}; +Point(5344)={ 7537.72327969, 16369.83297849, 0.0}; +Point(5345)={ 7564.47344832, 16496.21577211, 0.0}; +Point(5346)={ 7582.23461220, 16611.68165266, 0.0}; +Point(5347)={ 7594.91185325, 16715.59712539, 0.0}; +Point(5348)={ 7603.05433740, 16807.86375766, 0.0}; +Point(5349)={ 7606.30760922, 16888.20721136, 0.0}; +Point(5350)={ 7607.44707708, 16956.33698783, 0.0}; +Point(5351)={ 7607.60868289, 17011.96866083, 0.0}; +Point(5352)={ 7604.91162887, 17054.91124169, 0.0}; +Point(5353)={ 7603.02534629, 17085.10283048, 0.0}; +Point(5354)={ 7601.94963927, 17102.41228165, 0.0}; +Point(5355)={ 3261.49903084, 12519.48508702, 0.0}; +Point(5356)={ 3284.18319734, 12502.69620244, 0.0}; +Point(5357)={ 3346.59663358, 12457.48859376, 0.0}; +Point(5358)={ 3445.15717544, 12385.75285304, 0.0}; +Point(5359)={ 3581.79057647, 12296.41442006, 0.0}; +Point(5360)={ 3754.27842969, 12191.04145884, 0.0}; +Point(5361)={ 3965.19447898, 12077.61670861, 0.0}; +Point(5362)={ 4214.88260192, 11961.51302380, 0.0}; +Point(5363)={ 4500.33585310, 11849.55555636, 0.0}; +Point(5364)={ 4811.84564120, 11764.55550476, 0.0}; +Point(5365)={ 5116.96200970, 11726.68274295, 0.0}; +Point(5366)={ 5360.43594859, 11751.89031068, 0.0}; +Point(5367)={ 5480.81425393, 11790.36718439, 0.0}; +Point(5368)={ 5599.68227954, 11844.69680429, 0.0}; +Point(5369)={ 5793.77173623, 11993.38394179, 0.0}; +Point(5370)={ 5993.90250774, 12227.90717161, 0.0}; +Point(5371)={ 6169.28457406, 12510.93937190, 0.0}; +Point(5372)={ 6320.99746200, 12811.55438203, 0.0}; +Point(5373)={ 6452.30541298, 13117.32980841, 0.0}; +Point(5374)={ 6568.66433702, 13421.65225166, 0.0}; +Point(5375)={ 6674.28999096, 13720.85277023, 0.0}; +Point(5376)={ 6770.72477982, 14013.22255410, 0.0}; +Point(5377)={ 6862.81697575, 14296.16425514, 0.0}; +Point(5378)={ 6952.42073608, 14568.17102163, 0.0}; +Point(5379)={ 7039.61911638, 14828.31778273, 0.0}; +Point(5380)={ 7126.27626415, 15074.68995038, 0.0}; +Point(5381)={ 7209.52509645, 15306.71788858, 0.0}; +Point(5382)={ 7288.07737015, 15523.25184546, 0.0}; +Point(5383)={ 7359.59303315, 15723.61101984, 0.0}; +Point(5384)={ 7422.33193370, 15907.64271872, 0.0}; +Point(5385)={ 7475.43041118, 16076.03792934, 0.0}; +Point(5386)={ 7519.00139377, 16230.14326883, 0.0}; +Point(5387)={ 7553.73665228, 16371.35745995, 0.0}; +Point(5388)={ 7580.90915075, 16500.48187161, 0.0}; +Point(5389)={ 7599.04112650, 16618.32414108, 0.0}; +Point(5390)={ 7611.73364665, 16724.32442667, 0.0}; +Point(5391)={ 7620.31246647, 16818.32944771, 0.0}; +Point(5392)={ 7622.95849223, 16900.20688334, 0.0}; +Point(5393)={ 7624.23703903, 16969.57358086, 0.0}; +Point(5394)={ 7623.38140973, 17026.17851260, 0.0}; +Point(5395)={ 7620.71060442, 17069.88602762, 0.0}; +Point(5396)={ 7618.83333259, 17100.60934849, 0.0}; +Point(5397)={ 7617.75713585, 17118.21987617, 0.0}; +Point(5398)={ 3261.49903084, 12466.86075119, 0.0}; +Point(5399)={ 3284.41140433, 12449.60742131, 0.0}; +Point(5400)={ 3346.69682918, 12402.11813451, 0.0}; +Point(5401)={ 3447.42719835, 12330.11030837, 0.0}; +Point(5402)={ 3585.08713907, 12237.91419500, 0.0}; +Point(5403)={ 3760.38546420, 12132.12673936, 0.0}; +Point(5404)={ 3972.08711360, 12014.57780892, 0.0}; +Point(5405)={ 4222.34937790, 11893.46904533, 0.0}; +Point(5406)={ 4509.16090141, 11777.92657341, 0.0}; +Point(5407)={ 4821.07538963, 11679.89933072, 0.0}; +Point(5408)={ 5133.31769277, 11631.80789089, 0.0}; +Point(5409)={ 5390.17082957, 11648.12772685, 0.0}; +Point(5410)={ 5514.39182719, 11684.64535050, 0.0}; +Point(5411)={ 5637.81870367, 11748.89482461, 0.0}; +Point(5412)={ 5840.72008432, 11919.95564957, 0.0}; +Point(5413)={ 6037.58250079, 12176.92435901, 0.0}; +Point(5414)={ 6206.23677042, 12473.74888043, 0.0}; +Point(5415)={ 6351.26378123, 12782.51068419, 0.0}; +Point(5416)={ 6477.91670140, 13092.94133726, 0.0}; +Point(5417)={ 6590.00707738, 13400.29961907, 0.0}; +Point(5418)={ 6690.96575147, 13701.73294224, 0.0}; +Point(5419)={ 6785.44540388, 13994.81565259, 0.0}; +Point(5420)={ 6875.43760580, 14278.17321924, 0.0}; +Point(5421)={ 6962.66115744, 14550.58654676, 0.0}; +Point(5422)={ 7048.52349845, 14810.88218109, 0.0}; +Point(5423)={ 7134.44607436, 15057.58960733, 0.0}; +Point(5424)={ 7217.22497657, 15290.54741556, 0.0}; +Point(5425)={ 7295.98136330, 15508.65237678, 0.0}; +Point(5426)={ 7368.32963901, 15711.32976199, 0.0}; +Point(5427)={ 7432.27176825, 15898.31042406, 0.0}; +Point(5428)={ 7486.71813611, 16069.92266763, 0.0}; +Point(5429)={ 7531.37089819, 16227.19812541, 0.0}; +Point(5430)={ 7567.05894536, 16371.26568744, 0.0}; +Point(5431)={ 7594.68991461, 16502.98617397, 0.0}; +Point(5432)={ 7613.40278979, 16623.05507765, 0.0}; +Point(5433)={ 7626.15769957, 16731.03890313, 0.0}; +Point(5434)={ 7634.99097508, 16826.72815052, 0.0}; +Point(5435)={ 7637.17079257, 16910.07649282, 0.0}; +Point(5436)={ 7638.57402070, 16980.63584121, 0.0}; +Point(5437)={ 7636.87216463, 17038.18611795, 0.0}; +Point(5438)={ 7634.23054630, 17082.63251431, 0.0}; +Point(5439)={ 7632.37403837, 17113.87032931, 0.0}; +Point(5440)={ 7631.30998655, 17131.77262893, 0.0}; +Point(5441)={ 3261.49903084, 12419.71357898, 0.0}; +Point(5442)={ 3284.57594842, 12401.94164138, 0.0}; +Point(5443)={ 3348.17841164, 12354.21738952, 0.0}; +Point(5444)={ 3450.77067560, 12281.71877144, 0.0}; +Point(5445)={ 3589.47860549, 12187.14989304, 0.0}; +Point(5446)={ 3766.08231378, 12078.90563735, 0.0}; +Point(5447)={ 3979.86387890, 11960.45788479, 0.0}; +Point(5448)={ 4230.24827801, 11834.54776367, 0.0}; +Point(5449)={ 4516.11337915, 11711.28347244, 0.0}; +Point(5450)={ 4828.98124369, 11607.12049797, 0.0}; +Point(5451)={ 5145.72275047, 11540.65986464, 0.0}; +Point(5452)={ 5417.15968508, 11548.15759058, 0.0}; +Point(5453)={ 5545.91210955, 11587.08490374, 0.0}; +Point(5454)={ 5678.50742219, 11657.31154005, 0.0}; +Point(5455)={ 5887.64766852, 11853.91127363, 0.0}; +Point(5456)={ 6077.32391546, 12133.37560946, 0.0}; +Point(5457)={ 6238.68339686, 12441.95631677, 0.0}; +Point(5458)={ 6377.21728220, 12757.55198940, 0.0}; +Point(5459)={ 6498.69382143, 13072.12817424, 0.0}; +Point(5460)={ 6607.74385347, 13381.69242430, 0.0}; +Point(5461)={ 6705.75963684, 13684.52946531, 0.0}; +Point(5462)={ 6797.54683854, 13978.38994033, 0.0}; +Point(5463)={ 6885.50212169, 14262.02732989, 0.0}; +Point(5464)={ 6971.21137793, 14534.41832643, 0.0}; +Point(5465)={ 7055.82729742, 14794.62071911, 0.0}; +Point(5466)={ 7140.53841743, 15041.53069130, 0.0}; +Point(5467)={ 7223.01418632, 15274.94344435, 0.0}; +Point(5468)={ 7301.84951504, 15494.15094896, 0.0}; +Point(5469)={ 7374.88348909, 15698.65898517, 0.0}; +Point(5470)={ 7439.88457711, 15888.17705431, 0.0}; +Point(5471)={ 7495.60116662, 16062.72082723, 0.0}; +Point(5472)={ 7541.40201554, 16222.96131085, 0.0}; +Point(5473)={ 7577.98144117, 16369.76510405, 0.0}; +Point(5474)={ 7606.16950971, 16503.93494698, 0.0}; +Point(5475)={ 7625.46377403, 16626.11354102, 0.0}; +Point(5476)={ 7638.25756715, 16735.98511822, 0.0}; +Point(5477)={ 7647.32492622, 16833.27583019, 0.0}; +Point(5478)={ 7649.16194352, 16918.01770428, 0.0}; +Point(5479)={ 7650.67565125, 16989.71260281, 0.0}; +Point(5480)={ 7648.28026141, 17048.16797002, 0.0}; +Point(5481)={ 7645.66058229, 17093.31828210, 0.0}; +Point(5482)={ 7643.81964728, 17125.04679109, 0.0}; +Point(5483)={ 7642.76480210, 17143.22744447, 0.0}; +Point(5484)={ 3261.49903084, 12379.66266471, 0.0}; +Point(5485)={ 3285.05400779, 12361.82530124, 0.0}; +Point(5486)={ 3349.96302947, 12313.95815068, 0.0}; +Point(5487)={ 3452.95587995, 12239.07334938, 0.0}; +Point(5488)={ 3594.09514474, 12144.37469662, 0.0}; +Point(5489)={ 3771.62833128, 12033.28921495, 0.0}; +Point(5490)={ 3986.44867894, 11911.92932573, 0.0}; +Point(5491)={ 4238.45109499, 11784.69854236, 0.0}; +Point(5492)={ 4523.12423087, 11655.17354418, 0.0}; +Point(5493)={ 4833.94734119, 11539.31246397, 0.0}; +Point(5494)={ 5154.82301836, 11461.61513397, 0.0}; +Point(5495)={ 5440.15746479, 11455.89820609, 0.0}; +Point(5496)={ 5577.29713275, 11490.38028216, 0.0}; +Point(5497)={ 5720.18849832, 11572.08533826, 0.0}; +Point(5498)={ 5930.99152149, 11798.02024779, 0.0}; +Point(5499)={ 6112.83488184, 12096.60147331, 0.0}; +Point(5500)={ 6267.52591996, 12414.60066505, 0.0}; +Point(5501)={ 6400.46540400, 12735.75734044, 0.0}; +Point(5502)={ 6516.88270202, 13053.92567959, 0.0}; +Point(5503)={ 6621.58759463, 13365.80069681, 0.0}; +Point(5504)={ 6718.04011115, 13669.40443496, 0.0}; +Point(5505)={ 6807.49862213, 13963.82671053, 0.0}; +Point(5506)={ 6893.58368534, 14247.58701845, 0.0}; +Point(5507)={ 6978.05748966, 14519.75529280, 0.0}; +Point(5508)={ 7061.61680100, 14779.65171182, 0.0}; +Point(5509)={ 7145.02361523, 15026.53494559, 0.0}; +Point(5510)={ 7227.15658392, 15260.03055835, 0.0}; +Point(5511)={ 7305.96801457, 15479.88311499, 0.0}; +Point(5512)={ 7379.51001851, 15685.72885552, 0.0}; +Point(5513)={ 7445.42364066, 15877.33183546, 0.0}; +Point(5514)={ 7502.30868914, 16054.49323070, 0.0}; +Point(5515)={ 7549.31609680, 16217.50422552, 0.0}; +Point(5516)={ 7586.73646029, 16366.96472026, 0.0}; +Point(5517)={ 7615.65028583, 16503.46736751, 0.0}; +Point(5518)={ 7635.33788888, 16627.70051005, 0.0}; +Point(5519)={ 7648.27125066, 16739.36287549, 0.0}; +Point(5520)={ 7657.24957963, 16838.19814722, 0.0}; +Point(5521)={ 7659.15427547, 16924.24256411, 0.0}; +Point(5522)={ 7660.76514258, 16997.01601001, 0.0}; +Point(5523)={ 7657.81089046, 17056.33356869, 0.0}; +Point(5524)={ 7655.20649044, 17102.15175350, 0.0}; +Point(5525)={ 7653.37642710, 17134.34578516, 0.0}; +Point(5526)={ 7652.32804615, 17152.79068852, 0.0}; +Point(5527)={ 3261.49903084, 12346.71848827, 0.0}; +Point(5528)={ 3285.50630816, 12328.79229058, 0.0}; +Point(5529)={ 3351.26909823, 12280.18821753, 0.0}; +Point(5530)={ 3455.22257280, 12203.75591820, 0.0}; +Point(5531)={ 3598.24302714, 12108.09321334, 0.0}; +Point(5532)={ 3777.31244828, 11995.13055777, 0.0}; +Point(5533)={ 3993.23768996, 11870.72464393, 0.0}; +Point(5534)={ 4245.44431698, 11739.37643841, 0.0}; +Point(5535)={ 4530.01040125, 11607.74400256, 0.0}; +Point(5536)={ 4838.25653557, 11483.28324068, 0.0}; +Point(5537)={ 5159.66796048, 11387.15687407, 0.0}; +Point(5538)={ 5459.52694926, 11360.35195535, 0.0}; +Point(5539)={ 5608.12064922, 11397.25997946, 0.0}; +Point(5540)={ 5762.64616381, 11495.13972012, 0.0}; +Point(5541)={ 5970.50090939, 11751.36807907, 0.0}; +Point(5542)={ 6144.35438066, 12065.67335381, 0.0}; +Point(5543)={ 6290.02232990, 12392.52158987, 0.0}; +Point(5544)={ 6417.99179872, 12718.01596103, 0.0}; +Point(5545)={ 6532.38295168, 13038.23316799, 0.0}; +Point(5546)={ 6633.63232034, 13351.87546715, 0.0}; +Point(5547)={ 6727.92441207, 13656.28840965, 0.0}; +Point(5548)={ 6815.60496534, 13951.03585570, 0.0}; +Point(5549)={ 6900.04468553, 14234.78225572, 0.0}; +Point(5550)={ 6983.34425227, 14506.62810200, 0.0}; +Point(5551)={ 7066.09259628, 14766.02628541, 0.0}; +Point(5552)={ 7148.20832701, 15012.65829561, 0.0}; +Point(5553)={ 7229.90985717, 15245.91512355, 0.0}; +Point(5554)={ 7308.59200317, 15465.96464339, 0.0}; +Point(5555)={ 7382.45320307, 15672.62624839, 0.0}; +Point(5556)={ 7449.11354200, 15865.79131986, 0.0}; +Point(5557)={ 7507.04393519, 16045.17151387, 0.0}; +Point(5558)={ 7555.20530627, 16210.73852491, 0.0}; +Point(5559)={ 7593.53291497, 16362.75660297, 0.0}; +Point(5560)={ 7623.20413306, 16501.54504194, 0.0}; +Point(5561)={ 7643.26783690, 16627.78944222, 0.0}; +Point(5562)={ 7656.42137435, 16741.18461369, 0.0}; +Point(5563)={ 7665.36483564, 16841.52135028, 0.0}; +Point(5564)={ 7667.37100034, 16928.83657648, 0.0}; +Point(5565)={ 7669.03838051, 17002.66907911, 0.0}; +Point(5566)={ 7665.67668588, 17062.83825142, 0.0}; +Point(5567)={ 7663.08002334, 17109.31431878, 0.0}; +Point(5568)={ 7661.25573863, 17141.96760477, 0.0}; +Point(5569)={ 7660.21068774, 17160.67323217, 0.0}; +Point(5570)={ 3261.49903084, 12319.91112098, 0.0}; +Point(5571)={ 3285.88035215, 12301.82527634, 0.0}; +Point(5572)={ 3351.86625618, 12251.73041420, 0.0}; +Point(5573)={ 3457.47761045, 12174.79860601, 0.0}; +Point(5574)={ 3601.59424188, 12077.02865935, 0.0}; +Point(5575)={ 3783.13613394, 11963.43201931, 0.0}; +Point(5576)={ 4000.51318343, 11836.32699465, 0.0}; +Point(5577)={ 4252.98582340, 11701.48536128, 0.0}; +Point(5578)={ 4535.61939604, 11565.26860940, 0.0}; +Point(5579)={ 4841.55593851, 11436.36643021, 0.0}; +Point(5580)={ 5161.53573185, 11324.67546544, 0.0}; +Point(5581)={ 5473.29116077, 11279.15816126, 0.0}; +Point(5582)={ 5638.46747753, 11308.18638412, 0.0}; +Point(5583)={ 5806.29667605, 11426.17360911, 0.0}; +Point(5584)={ 6007.75379050, 11712.14478242, 0.0}; +Point(5585)={ 6169.11669991, 12041.46764414, 0.0}; +Point(5586)={ 6309.17673173, 12374.11331715, 0.0}; +Point(5587)={ 6432.37099378, 12703.20611097, 0.0}; +Point(5588)={ 6543.63855133, 13025.50871846, 0.0}; +Point(5589)={ 6643.57538701, 13340.04268990, 0.0}; +Point(5590)={ 6735.61253903, 13645.19451374, 0.0}; +Point(5591)={ 6822.02904106, 13940.06105838, 0.0}; +Point(5592)={ 6905.23517025, 14223.64712585, 0.0}; +Point(5593)={ 6987.37244843, 14495.13077923, 0.0}; +Point(5594)={ 7069.34528045, 14753.95305831, 0.0}; +Point(5595)={ 7150.42007390, 15000.09476628, 0.0}; +Point(5596)={ 7231.58801105, 15232.86060639, 0.0}; +Point(5597)={ 7310.02784629, 15452.70630703, 0.0}; +Point(5598)={ 7384.03488318, 15659.66085928, 0.0}; +Point(5599)={ 7451.25271318, 15853.81348916, 0.0}; +Point(5600)={ 7510.08124289, 16034.92502005, 0.0}; +Point(5601)={ 7559.32880089, 16202.77106476, 0.0}; +Point(5602)={ 7598.61664191, 16357.27003682, 0.0}; +Point(5603)={ 7629.08619269, 16498.38021256, 0.0}; +Point(5604)={ 7649.52247138, 16626.67073825, 0.0}; +Point(5605)={ 7662.95779059, 16741.78333872, 0.0}; +Point(5606)={ 7671.97069340, 16843.57922884, 0.0}; +Point(5607)={ 7674.11270493, 16932.11874147, 0.0}; +Point(5608)={ 7675.55080073, 17006.96015405, 0.0}; +Point(5609)={ 7672.14973305, 17067.94636615, 0.0}; +Point(5610)={ 7669.52525473, 17115.04740725, 0.0}; +Point(5611)={ 7667.68275264, 17148.13683303, 0.0}; +Point(5612)={ 7666.62741774, 17167.09006011, 0.0}; +Point(5613)={ 3261.49903084, 12298.31039899, 0.0}; +Point(5614)={ 3285.97192877, 12279.65756282, 0.0}; +Point(5615)={ 3352.59896711, 12228.53498568, 0.0}; +Point(5616)={ 3459.97202058, 12151.05077946, 0.0}; +Point(5617)={ 3605.49227191, 12051.27153393, 0.0}; +Point(5618)={ 3789.19390316, 11935.89742589, 0.0}; +Point(5619)={ 4008.80326754, 11807.33599009, 0.0}; +Point(5620)={ 4261.22958052, 11669.93128861, 0.0}; +Point(5621)={ 4541.43044706, 11530.39672053, 0.0}; +Point(5622)={ 4843.04545434, 11394.63128959, 0.0}; +Point(5623)={ 5161.29724085, 11274.17658878, 0.0}; +Point(5624)={ 5480.36714453, 11191.29171234, 0.0}; +Point(5625)={ 5671.86483583, 11213.29909331, 0.0}; +Point(5626)={ 5853.00290926, 11364.42246285, 0.0}; +Point(5627)={ 6037.77084502, 11682.53311362, 0.0}; +Point(5628)={ 6191.93132637, 12021.04370626, 0.0}; +Point(5629)={ 6325.84641978, 12358.76752347, 0.0}; +Point(5630)={ 6445.06037976, 12690.72299277, 0.0}; +Point(5631)={ 6552.74929912, 13014.98641739, 0.0}; +Point(5632)={ 6651.48241639, 13330.23791863, 0.0}; +Point(5633)={ 6741.81261931, 13635.90531397, 0.0}; +Point(5634)={ 6827.08240570, 13930.82915520, 0.0}; +Point(5635)={ 6909.36483527, 14214.16967979, 0.0}; +Point(5636)={ 6990.41338002, 14485.26626278, 0.0}; +Point(5637)={ 7071.62617503, 14743.47297065, 0.0}; +Point(5638)={ 7151.85405610, 14988.95013594, 0.0}; +Point(5639)={ 7232.47841008, 15220.98816226, 0.0}; +Point(5640)={ 7310.54518076, 15440.25884005, 0.0}; +Point(5641)={ 7384.45456857, 15646.97382394, 0.0}; +Point(5642)={ 7452.05545330, 15841.40226106, 0.0}; +Point(5643)={ 7511.57448056, 16023.54052752, 0.0}; +Point(5644)={ 7561.79177134, 16193.13524501, 0.0}; +Point(5645)={ 7602.07148026, 16349.87348591, 0.0}; +Point(5646)={ 7633.20077450, 16493.36798395, 0.0}; +Point(5647)={ 7654.23910828, 16623.80365534, 0.0}; +Point(5648)={ 7668.04543525, 16740.75053069, 0.0}; +Point(5649)={ 7677.35187298, 16844.07648502, 0.0}; +Point(5650)={ 7679.57899689, 16933.90424079, 0.0}; +Point(5651)={ 7680.85734781, 17009.80696278, 0.0}; +Point(5652)={ 7677.41631941, 17071.65056715, 0.0}; +Point(5653)={ 7674.75903022, 17119.40851137, 0.0}; +Point(5654)={ 7672.89243417, 17152.95650588, 0.0}; +Point(5655)={ 7671.69508204, 17172.15772442, 0.0}; +Point(5656)={ 3261.49903084, 12280.56186974, 0.0}; +Point(5657)={ 3286.05008722, 12261.30423608, 0.0}; +Point(5658)={ 3353.70856238, 12209.58939815, 0.0}; +Point(5659)={ 3462.92157143, 12131.39138397, 0.0}; +Point(5660)={ 3610.29441297, 12029.57786411, 0.0}; +Point(5661)={ 3796.21298208, 11911.86066774, 0.0}; +Point(5662)={ 4017.93321214, 11782.70217195, 0.0}; +Point(5663)={ 4269.43798024, 11643.88160770, 0.0}; +Point(5664)={ 4546.54972728, 11502.18847574, 0.0}; +Point(5665)={ 4843.79040815, 11361.46546834, 0.0}; +Point(5666)={ 5156.67149498, 11227.40630091, 0.0}; +Point(5667)={ 5480.61131621, 11120.39671359, 0.0}; +Point(5668)={ 5706.17110438, 11120.21218914, 0.0}; +Point(5669)={ 5895.35264166, 11317.22935542, 0.0}; +Point(5670)={ 6065.68575078, 11658.90321034, 0.0}; +Point(5671)={ 6208.74645965, 12006.01485585, 0.0}; +Point(5672)={ 6338.40240750, 12347.14023046, 0.0}; +Point(5673)={ 6455.32371975, 12680.93869157, 0.0}; +Point(5674)={ 6560.55456581, 13006.56518772, 0.0}; +Point(5675)={ 6657.84361276, 13322.49739220, 0.0}; +Point(5676)={ 6746.97861830, 13628.49612842, 0.0}; +Point(5677)={ 6831.13675262, 13923.47795186, 0.0}; +Point(5678)={ 6912.73857688, 14206.55089641, 0.0}; +Point(5679)={ 6992.81797649, 14477.28303381, 0.0}; +Point(5680)={ 7073.38748245, 14734.88004704, 0.0}; +Point(5681)={ 7152.92545363, 14979.63243478, 0.0}; +Point(5682)={ 7232.97233620, 15210.83775045, 0.0}; +Point(5683)={ 7310.59376044, 15429.26944923, 0.0}; +Point(5684)={ 7384.21705700, 15635.28149683, 0.0}; +Point(5685)={ 7451.97229977, 15829.27624273, 0.0}; +Point(5686)={ 7511.90464612, 16011.56935693, 0.0}; +Point(5687)={ 7562.87168991, 16182.05780351, 0.0}; +Point(5688)={ 7604.09135697, 16340.43952651, 0.0}; +Point(5689)={ 7635.74836764, 16486.17583990, 0.0}; +Point(5690)={ 7657.59502428, 16618.89808656, 0.0}; +Point(5691)={ 7671.96550243, 16737.96571982, 0.0}; +Point(5692)={ 7681.62355522, 16843.08873073, 0.0}; +Point(5693)={ 7683.93079644, 16934.37515032, 0.0}; +Point(5694)={ 7685.14509269, 17011.43075835, 0.0}; +Point(5695)={ 7681.68986257, 17074.17729844, 0.0}; +Point(5696)={ 7679.02258320, 17122.61614180, 0.0}; +Point(5697)={ 7677.14913114, 17156.63690675, 0.0}; +Point(5698)={ 7675.61093768, 17176.07358006, 0.0}; + +Line(1) = {1, 2}; +Line(2) = {2, 3}; +Line(3) = {3, 4}; +Line(4) = {4, 5}; +Line(5) = {5, 6}; +Line(6) = {6, 7}; +Line(7) = {7, 8}; +Line(8) = {8, 9}; +Line(9) = {9, 10}; +Line(10) = {10, 11}; +Line(11) = {11, 12}; +Line(12) = {12, 13}; +Line(13) = {13, 14}; +Line(14) = {14, 15}; +Line(15) = {15, 16}; +Line(16) = {16, 17}; +Line(17) = {17, 18}; +Line(18) = {18, 19}; +Line(19) = {19, 20}; +Line(20) = {20, 21}; +Line(21) = {21, 22}; +Line(22) = {22, 23}; +Line(23) = {23, 24}; +Line(24) = {24, 25}; +Line(25) = {25, 26}; +Line(26) = {26, 27}; +Line(27) = {27, 28}; +Line(28) = {28, 29}; +Line(29) = {29, 30}; +Line(30) = {30, 31}; +Line(31) = {31, 32}; +Line(32) = {32, 33}; +Line(33) = {33, 34}; +Line(34) = {34, 35}; +Line(35) = {35, 36}; +Line(36) = {36, 37}; +Line(37) = {37, 38}; +Line(38) = {38, 39}; +Line(39) = {39, 40}; +Line(40) = {40, 41}; +Line(41) = {41, 42}; +Line(42) = {42, 43}; +Line(43) = {43, 44}; +Line(44) = {44, 45}; +Line(45) = {45, 46}; +Line(46) = {46, 47}; +Line(47) = {47, 48}; +Line(48) = {48, 49}; +Line(49) = {49, 50}; +Line(50) = {50, 51}; +Line(51) = {51, 52}; +Line(52) = {52, 53}; +Line(53) = {53, 54}; +Line(54) = {54, 55}; +Line(55) = {55, 56}; +Line(56) = {56, 57}; +Line(57) = {57, 58}; +Line(58) = {58, 59}; +Line(59) = {59, 60}; +Line(60) = {60, 1}; +Line(61) = {2932, 2975}; +Line(62) = {2975, 3018}; +Line(63) = {3018, 3061}; +Line(64) = {3061, 3104}; +Line(65) = {3104, 3147}; +Line(66) = {3147, 3190}; +Line(67) = {3190, 3233}; +Line(68) = {3233, 3276}; +Line(69) = {3276, 3319}; +Line(70) = {3319, 3362}; +Line(71) = {3362, 3405}; +Line(72) = {3405, 3448}; +Line(73) = {3448, 3491}; +Line(74) = {3491, 3534}; +Line(75) = {3534, 3577}; +Line(76) = {3577, 3620}; +Line(77) = {3620, 3663}; +Line(78) = {3663, 3706}; +Line(79) = {3706, 3749}; +Line(80) = {3749, 1201}; +Line(81) = {1201, 1292}; +Line(82) = {1292, 1383}; +Line(83) = {1383, 1474}; +Line(84) = {1474, 1565}; +Line(85) = {1565, 1656}; +Line(86) = {1656, 1747}; +Line(87) = {1747, 1838}; +Line(88) = {1838, 1929}; +Line(89) = {1929, 2020}; +Line(90) = {2020, 2111}; +Line(91) = {2111, 2202}; +Line(92) = {2202, 2293}; +Line(93) = {2293, 2384}; +Line(94) = {2384, 2475}; +Line(95) = {2475, 2566}; +Line(96) = {2566, 2657}; +Line(97) = {2657, 2748}; +Line(98) = {2748, 2840}; +Line(99) = {4881, 4924}; +Line(100) = {4924, 4967}; +Line(101) = {4967, 5010}; +Line(102) = {5010, 5053}; +Line(103) = {5053, 5096}; +Line(104) = {5096, 5139}; +Line(105) = {5139, 5182}; +Line(106) = {5182, 5225}; +Line(107) = {5225, 5268}; +Line(108) = {5268, 5311}; +Line(109) = {5311, 5354}; +Line(110) = {5354, 5397}; +Line(111) = {5397, 5440}; +Line(112) = {5440, 5483}; +Line(113) = {5483, 5526}; +Line(114) = {5526, 5569}; +Line(115) = {5569, 5612}; +Line(116) = {5612, 5655}; +Line(117) = {5655, 5698}; +Line(118) = {5698, 1291}; +Line(119) = {1291, 1382}; +Line(120) = {1382, 1473}; +Line(121) = {1473, 1564}; +Line(122) = {1564, 1655}; +Line(123) = {1655, 1746}; +Line(124) = {1746, 1837}; +Line(125) = {1837, 1928}; +Line(126) = {1928, 2019}; +Line(127) = {2019, 2110}; +Line(128) = {2110, 2201}; +Line(129) = {2201, 2292}; +Line(130) = {2292, 2383}; +Line(131) = {2383, 2474}; +Line(132) = {2474, 2565}; +Line(133) = {2565, 2656}; +Line(134) = {2656, 2747}; +Line(135) = {2747, 2838}; +Line(136) = {2838, 2930}; +Line(137) = {4839, 4882}; +Line(138) = {4882, 4925}; +Line(139) = {4925, 4968}; +Line(140) = {4968, 5011}; +Line(141) = {5011, 5054}; +Line(142) = {5054, 5097}; +Line(143) = {5097, 5140}; +Line(144) = {5140, 5183}; +Line(145) = {5183, 5226}; +Line(146) = {5226, 5269}; +Line(147) = {5269, 5312}; +Line(148) = {5312, 5355}; +Line(149) = {5355, 5398}; +Line(150) = {5398, 5441}; +Line(151) = {5441, 5484}; +Line(152) = {5484, 5527}; +Line(153) = {5527, 5570}; +Line(154) = {5570, 5613}; +Line(155) = {5613, 5656}; +Line(156) = {5656, 3792}; +Line(157) = {3792, 3847}; +Line(158) = {3847, 3902}; +Line(159) = {3902, 3957}; +Line(160) = {3957, 4012}; +Line(161) = {4012, 4067}; +Line(162) = {4067, 4122}; +Line(163) = {4122, 4177}; +Line(164) = {4177, 4232}; +Line(165) = {4232, 4287}; +Line(166) = {4287, 4342}; +Line(167) = {4342, 4397}; +Line(168) = {4397, 4452}; +Line(169) = {4452, 4507}; +Line(170) = {4507, 4562}; +Line(171) = {4562, 4617}; +Line(172) = {4617, 4672}; +Line(173) = {4672, 4727}; +Line(174) = {4727, 4783}; +Line(175) = {2974, 3017}; +Line(176) = {3017, 3060}; +Line(177) = {3060, 3103}; +Line(178) = {3103, 3146}; +Line(179) = {3146, 3189}; +Line(180) = {3189, 3232}; +Line(181) = {3232, 3275}; +Line(182) = {3275, 3318}; +Line(183) = {3318, 3361}; +Line(184) = {3361, 3404}; +Line(185) = {3404, 3447}; +Line(186) = {3447, 3490}; +Line(187) = {3490, 3533}; +Line(188) = {3533, 3576}; +Line(189) = {3576, 3619}; +Line(190) = {3619, 3662}; +Line(191) = {3662, 3705}; +Line(192) = {3705, 3748}; +Line(193) = {3748, 3791}; +Line(194) = {3791, 3846}; +Line(195) = {3846, 3901}; +Line(196) = {3901, 3956}; +Line(197) = {3956, 4011}; +Line(198) = {4011, 4066}; +Line(199) = {4066, 4121}; +Line(200) = {4121, 4176}; +Line(201) = {4176, 4231}; +Line(202) = {4231, 4286}; +Line(203) = {4286, 4341}; +Line(204) = {4341, 4396}; +Line(205) = {4396, 4451}; +Line(206) = {4451, 4506}; +Line(207) = {4506, 4561}; +Line(208) = {4561, 4616}; +Line(209) = {4616, 4671}; +Line(210) = {4671, 4726}; +Line(211) = {4726, 4781}; +Line(212) = {4781, 4837}; +Line(213) = {2840, 2841}; +Line(214) = {2841, 2842}; +Line(215) = {2842, 2843}; +Line(216) = {2843, 2844}; +Line(217) = {2844, 2845}; +Line(218) = {2845, 2846}; +Line(219) = {2846, 2847}; +Line(220) = {2847, 2848}; +Line(221) = {2848, 2849}; +Line(222) = {2849, 2850}; +Line(223) = {2850, 2851}; +Line(224) = {2851, 2852}; +Line(225) = {2852, 2853}; +Line(226) = {2853, 2854}; +Line(227) = {2854, 2855}; +Line(228) = {2855, 2856}; +Line(229) = {2856, 2857}; +Line(230) = {2857, 2858}; +Line(231) = {2858, 2859}; +Line(232) = {2859, 2860}; +Line(233) = {2860, 2861}; +Line(234) = {2861, 2862}; +Line(235) = {2862, 2863}; +Line(236) = {2863, 2864}; +Line(237) = {2864, 2865}; +Line(238) = {2865, 2866}; +Line(239) = {2866, 2867}; +Line(240) = {2867, 2868}; +Line(241) = {2868, 2869}; +Line(242) = {2869, 2870}; +Line(243) = {2870, 2871}; +Line(244) = {2871, 2872}; +Line(245) = {2872, 2873}; +Line(246) = {2873, 2874}; +Line(247) = {2874, 2875}; +Line(248) = {2875, 2876}; +Line(249) = {2876, 2877}; +Line(250) = {2877, 2878}; +Line(251) = {2878, 2879}; +Line(252) = {2879, 2880}; +Line(253) = {2880, 2881}; +Line(254) = {2881, 2882}; +Line(255) = {2882, 2883}; +Line(256) = {2883, 2884}; +Line(257) = {2884, 2885}; +Line(258) = {2885, 2886}; +Line(259) = {2886, 2887}; +Line(260) = {2887, 2888}; +Line(261) = {2888, 2889}; +Line(262) = {2889, 2890}; +Line(263) = {2890, 2891}; +Line(264) = {2891, 2892}; +Line(265) = {2892, 2893}; +Line(266) = {2893, 2894}; +Line(267) = {2894, 2895}; +Line(268) = {2895, 2896}; +Line(269) = {2896, 2897}; +Line(270) = {2897, 2898}; +Line(271) = {2898, 2899}; +Line(272) = {2899, 2900}; +Line(273) = {2900, 2901}; +Line(274) = {2901, 2902}; +Line(275) = {2902, 2903}; +Line(276) = {2903, 2904}; +Line(277) = {2904, 2905}; +Line(278) = {2905, 2906}; +Line(279) = {2906, 2907}; +Line(280) = {2907, 2908}; +Line(281) = {2908, 2909}; +Line(282) = {2909, 2910}; +Line(283) = {2910, 2911}; +Line(284) = {2911, 2912}; +Line(285) = {2912, 2913}; +Line(286) = {2913, 2914}; +Line(287) = {2914, 2915}; +Line(288) = {2915, 2916}; +Line(289) = {2916, 2917}; +Line(290) = {2917, 2918}; +Line(291) = {2918, 2919}; +Line(292) = {2919, 2920}; +Line(293) = {2920, 2921}; +Line(294) = {2921, 2922}; +Line(295) = {2922, 2923}; +Line(296) = {2923, 2924}; +Line(297) = {2924, 2925}; +Line(298) = {2925, 2926}; +Line(299) = {2926, 2927}; +Line(300) = {2927, 2928}; +Line(301) = {2928, 2929}; +Line(302) = {2929, 2930}; +Line(303) = {2932, 2933}; +Line(304) = {2933, 2934}; +Line(305) = {2934, 2935}; +Line(306) = {2935, 2936}; +Line(307) = {2936, 2937}; +Line(308) = {2937, 2938}; +Line(309) = {2938, 2939}; +Line(310) = {2939, 2940}; +Line(311) = {2940, 2941}; +Line(312) = {2941, 2942}; +Line(313) = {2942, 2943}; +Line(314) = {2943, 2944}; +Line(315) = {2944, 2945}; +Line(316) = {2945, 2946}; +Line(317) = {2946, 2947}; +Line(318) = {2947, 2948}; +Line(319) = {2948, 2949}; +Line(320) = {2949, 2950}; +Line(321) = {2950, 2951}; +Line(322) = {2951, 2952}; +Line(323) = {2952, 2953}; +Line(324) = {2953, 2954}; +Line(325) = {2954, 2955}; +Line(326) = {2955, 2956}; +Line(327) = {2956, 2957}; +Line(328) = {2957, 2958}; +Line(329) = {2958, 2959}; +Line(330) = {2959, 2960}; +Line(331) = {2960, 2961}; +Line(332) = {2961, 2962}; +Line(333) = {2962, 2963}; +Line(334) = {2963, 2964}; +Line(335) = {2964, 2965}; +Line(336) = {2965, 2966}; +Line(337) = {2966, 2967}; +Line(338) = {2967, 2968}; +Line(339) = {2968, 2969}; +Line(340) = {2969, 2970}; +Line(341) = {2970, 2971}; +Line(342) = {2971, 2972}; +Line(343) = {2972, 2973}; +Line(344) = {2973, 2974}; +Line(345) = {4783, 4784}; +Line(346) = {4784, 4785}; +Line(347) = {4785, 4786}; +Line(348) = {4786, 4787}; +Line(349) = {4787, 4788}; +Line(350) = {4788, 4789}; +Line(351) = {4789, 4790}; +Line(352) = {4790, 4791}; +Line(353) = {4791, 4792}; +Line(354) = {4792, 4793}; +Line(355) = {4793, 4794}; +Line(356) = {4794, 4795}; +Line(357) = {4795, 4796}; +Line(358) = {4796, 4797}; +Line(359) = {4797, 4798}; +Line(360) = {4798, 4799}; +Line(361) = {4799, 4800}; +Line(362) = {4800, 4801}; +Line(363) = {4801, 4802}; +Line(364) = {4802, 4803}; +Line(365) = {4803, 4804}; +Line(366) = {4804, 4805}; +Line(367) = {4805, 4806}; +Line(368) = {4806, 4807}; +Line(369) = {4807, 4808}; +Line(370) = {4808, 4809}; +Line(371) = {4809, 4810}; +Line(372) = {4810, 4811}; +Line(373) = {4811, 4812}; +Line(374) = {4812, 4813}; +Line(375) = {4813, 4814}; +Line(376) = {4814, 4815}; +Line(377) = {4815, 4816}; +Line(378) = {4816, 4817}; +Line(379) = {4817, 4818}; +Line(380) = {4818, 4819}; +Line(381) = {4819, 4820}; +Line(382) = {4820, 4821}; +Line(383) = {4821, 4822}; +Line(384) = {4822, 4823}; +Line(385) = {4823, 4824}; +Line(386) = {4824, 4825}; +Line(387) = {4825, 4826}; +Line(388) = {4826, 4827}; +Line(389) = {4827, 4828}; +Line(390) = {4828, 4829}; +Line(391) = {4829, 4830}; +Line(392) = {4830, 4831}; +Line(393) = {4831, 4832}; +Line(394) = {4832, 4833}; +Line(395) = {4833, 4834}; +Line(396) = {4834, 4835}; +Line(397) = {4835, 4836}; +Line(398) = {4836, 4837}; +Line(399) = {4839, 4840}; +Line(400) = {4840, 4841}; +Line(401) = {4841, 4842}; +Line(402) = {4842, 4843}; +Line(403) = {4843, 4844}; +Line(404) = {4844, 4845}; +Line(405) = {4845, 4846}; +Line(406) = {4846, 4847}; +Line(407) = {4847, 4848}; +Line(408) = {4848, 4849}; +Line(409) = {4849, 4850}; +Line(410) = {4850, 4851}; +Line(411) = {4851, 4852}; +Line(412) = {4852, 4853}; +Line(413) = {4853, 4854}; +Line(414) = {4854, 4855}; +Line(415) = {4855, 4856}; +Line(416) = {4856, 4857}; +Line(417) = {4857, 4858}; +Line(418) = {4858, 4859}; +Line(419) = {4859, 4860}; +Line(420) = {4860, 4861}; +Line(421) = {4861, 4862}; +Line(422) = {4862, 4863}; +Line(423) = {4863, 4864}; +Line(424) = {4864, 4865}; +Line(425) = {4865, 4866}; +Line(426) = {4866, 4867}; +Line(427) = {4867, 4868}; +Line(428) = {4868, 4869}; +Line(429) = {4869, 4870}; +Line(430) = {4870, 4871}; +Line(431) = {4871, 4872}; +Line(432) = {4872, 4873}; +Line(433) = {4873, 4874}; +Line(434) = {4874, 4875}; +Line(435) = {4875, 4876}; +Line(436) = {4876, 4877}; +Line(437) = {4877, 4878}; +Line(438) = {4878, 4879}; +Line(439) = {4879, 4880}; +Line(440) = {4880, 4881}; + +// Inner (core) loop +Curve Loop(1) = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60}; + +// Outer (wall) loop +Curve Loop(2) = {399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,-302,-301,-300,-299,-298,-297,-296,-295,-294,-293,-292,-291,-290,-289,-288,-287,-286,-285,-284,-283,-282,-281,-280,-279,-278,-277,-276,-275,-274,-273,-272,-271,-270,-269,-268,-267,-266,-265,-264,-263,-262,-261,-260,-259,-258,-257,-256,-255,-254,-253,-252,-251,-250,-249,-248,-247,-246,-245,-244,-243,-242,-241,-240,-239,-238,-237,-236,-235,-234,-233,-232,-231,-230,-229,-228,-227,-226,-225,-224,-223,-222,-221,-220,-219,-218,-217,-216,-215,-214,-213,-98,-97,-96,-95,-94,-93,-92,-91,-90,-89,-88,-87,-86,-85,-84,-83,-82,-81,-80,-79,-78,-77,-76,-75,-74,-73,-72,-71,-70,-69,-68,-67,-66,-65,-64,-63,-62,-61,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,-398,-397,-396,-395,-394,-393,-392,-391,-390,-389,-388,-387,-386,-385,-384,-383,-382,-381,-380,-379,-378,-377,-376,-375,-374,-373,-372,-371,-370,-369,-368,-367,-366,-365,-364,-363,-362,-361,-360,-359,-358,-357,-356,-355,-354,-353,-352,-351,-350,-349,-348,-347,-346,-345,-174,-173,-172,-171,-170,-169,-168,-167,-166,-165,-164,-163,-162,-161,-160,-159,-158,-157,-156,-155,-154,-153,-152,-151,-150,-149,-148,-147,-146,-145,-144,-143,-142,-141,-140,-139,-138,-137}; + +// This meshes the core +//Plane Surface(1) = {1}; + +// This meshes the SOL and not the core +Plane Surface(1) = {2, 1}; + +//Create a physical surface out of the construction surface +Physical Surface(1) = {1}; +Recombine Surface "*"; + +// Physical Lines for interior/exterior? +// Numbering is clockwise starting at point 4839 (top left). This is the same starting point as the Outer wall loop. + +//Interior +Physical Curve (100) = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60}; + +// Exterior +Physical Curve (101) = {399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440}; +Physical Curve (102) = {99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136}; +Physical Curve (-103) = {-302,-301,-300,-299,-298,-297,-296,-295,-294,-293,-292,-291,-290,-289,-288,-287,-286,-285,-284,-283,-282,-281,-280,-279,-278,-277,-276,-275,-274,-273,-272,-271,-270,-269,-268,-267,-266,-265,-264,-263,-262,-261,-260,-259,-258,-257,-256,-255,-254,-253,-252,-251,-250,-249,-248,-247,-246,-245,-244,-243,-242,-241,-240,-239,-238,-237,-236,-235,-234,-233,-232,-231,-230,-229,-228,-227,-226,-225,-224,-223,-222,-221,-220,-219,-218,-217,-216,-215,-214,-213}; +Physical Curve (-104) = {-98,-97,-96,-95,-94,-93,-92,-91,-90,-89,-88,-87,-86,-85,-84,-83,-82,-81,-80,-79,-78,-77,-76,-75,-74,-73,-72,-71,-70,-69,-68,-67,-66,-65,-64,-63,-62,-61}; +Physical Curve (105) = {303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344}; +Physical Curve (106) = {175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212}; +Physical Curve (-107) = {-398,-397,-396,-395,-394,-393,-392,-391,-390,-389,-388,-387,-386,-385,-384,-383,-382,-381,-380,-379,-378,-377,-376,-375,-374,-373,-372,-371,-370,-369,-368,-367,-366,-365,-364,-363,-362,-361,-360,-359,-358,-357,-356,-355,-354,-353,-352,-351,-350,-349,-348,-347,-346,-345}; +Physical Curve (-108) = {-174,-173,-172,-171,-170,-169,-168,-167,-166,-165,-164,-163,-162,-161,-160,-159,-158,-157,-156,-155,-154,-153,-152,-151,-150,-149,-148,-147,-146,-145,-144,-143,-142,-141,-140,-139,-138,-137}; + + + + diff --git a/test/test_resources/MASTU-2D/mastu_cd.xml b/test/test_resources/MASTU-2D/mastu_cd.xml new file mode 100644 index 00000000..915a053a --- /dev/null +++ b/test/test_resources/MASTU-2D/mastu_cd.xml @@ -0,0 +1,11839 @@ + + + + + 7.68566483e+03 -1.71769068e+04 0.00000000e+00 + 7.67561104e+03 -1.71760737e+04 0.00000000e+00 + 7.67876450e+03 -1.71792271e+04 0.00000000e+00 + 7.68344559e+03 -1.71839082e+04 0.00000000e+00 + 7.67876450e+03 1.71792271e+04 0.00000000e+00 + 7.67561094e+03 1.71760736e+04 0.00000000e+00 + 7.68498379e+03 1.71765935e+04 0.00000000e+00 + 7.68346586e+03 1.71839285e+04 0.00000000e+00 + 7.62768678e+03 -6.36475077e+03 0.00000000e+00 + 7.66931703e+03 -6.33412358e+03 0.00000000e+00 + 7.64664040e+03 -6.32602928e+03 0.00000000e+00 + 7.62406221e+03 -6.31797014e+03 0.00000000e+00 + 7.64661269e+03 6.32601939e+03 0.00000000e+00 + 7.66929156e+03 6.33411447e+03 0.00000000e+00 + 7.63346578e+03 6.36059709e+03 0.00000000e+00 + 7.62403302e+03 6.31795976e+03 0.00000000e+00 + 8.82518416e+03 1.82983324e+04 0.00000000e+00 + 8.81244198e+03 1.83129046e+04 0.00000000e+00 + 8.81872675e+03 1.82364118e+04 0.00000000e+00 + 8.84743786e+03 1.82728824e+04 0.00000000e+00 + 3.41080601e+03 -1.25978462e+04 0.00000000e+00 + 3.37794732e+03 -1.25468703e+04 0.00000000e+00 + 3.32271674e+03 -1.25689033e+04 0.00000000e+00 + 3.34684335e+03 -1.26442761e+04 0.00000000e+00 + 7.73237660e+03 7.41128635e+03 0.00000000e+00 + 7.75656113e+03 7.22709689e+03 0.00000000e+00 + 7.92535433e+03 7.18152720e+03 0.00000000e+00 + 7.98679644e+03 7.45496849e+03 0.00000000e+00 + 5.67640268e+03 1.11341645e+04 0.00000000e+00 + 5.89979033e+03 1.11195016e+04 0.00000000e+00 + 5.95646322e+03 1.13115625e+04 0.00000000e+00 + 5.76846130e+03 1.13758528e+04 0.00000000e+00 + 5.24231023e+03 1.31335139e+04 0.00000000e+00 + 5.15230979e+03 1.31034813e+04 0.00000000e+00 + 5.19035209e+03 1.30156884e+04 0.00000000e+00 + 5.28873998e+03 1.30446428e+04 0.00000000e+00 + 3.67276174e+03 -1.25156640e+04 0.00000000e+00 + 3.72729158e+03 -1.25914436e+04 0.00000000e+00 + 3.80788682e+03 -1.25406445e+04 0.00000000e+00 + 3.75524041e+03 -1.24535613e+04 0.00000000e+00 + 8.60402883e+03 -1.04494449e+04 0.00000000e+00 + 8.75817642e+03 -1.07112781e+04 0.00000000e+00 + 9.16071923e+03 -1.04915172e+04 0.00000000e+00 + 8.78947544e+03 -1.00892818e+04 0.00000000e+00 + 5.94009080e+03 -9.12249563e+03 0.00000000e+00 + 5.79966824e+03 -8.88825143e+03 0.00000000e+00 + 5.59511964e+03 -9.04720278e+03 0.00000000e+00 + 5.71094982e+03 -9.23826878e+03 0.00000000e+00 + 7.75379542e+03 1.55224755e+04 0.00000000e+00 + 8.02317478e+03 1.56687454e+04 0.00000000e+00 + 7.86197730e+03 1.58530256e+04 0.00000000e+00 + 7.68637536e+03 1.57360464e+04 0.00000000e+00 + 4.53379007e+03 -9.05023071e+03 0.00000000e+00 + 4.59692002e+03 -8.87833053e+03 0.00000000e+00 + 4.39511248e+03 -8.77927465e+03 0.00000000e+00 + 4.35976159e+03 -8.96978404e+03 0.00000000e+00 + 7.31455736e+03 -1.55284167e+04 0.00000000e+00 + 7.26120067e+03 -1.52726593e+04 0.00000000e+00 + 7.06142258e+03 -1.54141258e+04 0.00000000e+00 + 7.11146522e+03 -1.56032680e+04 0.00000000e+00 + 4.59842306e+03 8.08794482e+03 0.00000000e+00 + 4.34919308e+03 8.27781887e+03 0.00000000e+00 + 3.94998698e+03 8.15421428e+03 0.00000000e+00 + 4.40651383e+03 7.72316053e+03 0.00000000e+00 + 4.93186701e+03 1.18224004e+04 0.00000000e+00 + 5.06350197e+03 1.17396131e+04 0.00000000e+00 + 5.16965384e+03 1.18695030e+04 0.00000000e+00 + 5.03599683e+03 1.19457122e+04 0.00000000e+00 + 7.26895577e+03 -1.62577553e+04 0.00000000e+00 + 7.27601834e+03 -1.61897613e+04 0.00000000e+00 + 7.20679669e+03 -1.62109791e+04 0.00000000e+00 + 7.21911361e+03 -1.62884086e+04 0.00000000e+00 + 7.58666813e+03 -1.69858143e+04 0.00000000e+00 + 7.60956223e+03 -1.70189206e+04 0.00000000e+00 + 7.64376147e+03 -1.70020260e+04 0.00000000e+00 + 7.62114489e+03 -1.69615958e+04 0.00000000e+00 + 3.90680098e+03 1.14160741e+04 0.00000000e+00 + 3.82890327e+03 1.14890955e+04 0.00000000e+00 + 3.72751991e+03 1.14003921e+04 0.00000000e+00 + 3.82626798e+03 1.13204298e+04 0.00000000e+00 + 4.67167196e+03 1.12237975e+04 0.00000000e+00 + 4.70418119e+03 1.13838306e+04 0.00000000e+00 + 4.53968537e+03 1.14104458e+04 0.00000000e+00 + 4.51702669e+03 1.12505975e+04 0.00000000e+00 + 7.67551604e+03 1.48251041e+04 0.00000000e+00 + 8.02536342e+03 1.49999925e+04 0.00000000e+00 + 7.84059359e+03 1.52792579e+04 0.00000000e+00 + 7.59657783e+03 1.51139731e+04 0.00000000e+00 + 7.68168471e+03 1.70977667e+04 0.00000000e+00 + 7.70992486e+03 1.70737749e+04 0.00000000e+00 + 7.72996352e+03 1.71203892e+04 0.00000000e+00 + 7.69271070e+03 1.71260368e+04 0.00000000e+00 + 8.13431092e+03 1.28399290e+04 0.00000000e+00 + 8.33999888e+03 1.28931425e+04 0.00000000e+00 + 8.42718274e+03 1.31051128e+04 0.00000000e+00 + 8.11421756e+03 1.30348698e+04 0.00000000e+00 + 6.60542728e+03 -1.09264758e+04 0.00000000e+00 + 6.94448377e+03 -1.09277166e+04 0.00000000e+00 + 6.94694829e+03 -1.06501545e+04 0.00000000e+00 + 6.68619452e+03 -1.06340774e+04 0.00000000e+00 + 6.68970813e+03 8.08959828e+03 0.00000000e+00 + 6.44094523e+03 7.85640982e+03 0.00000000e+00 + 6.62108688e+03 7.61575526e+03 0.00000000e+00 + 6.87258356e+03 7.84182434e+03 0.00000000e+00 + 8.24034578e+03 7.77600223e+03 0.00000000e+00 + 8.41403699e+03 8.06116053e+03 0.00000000e+00 + 7.97175037e+03 8.24388703e+03 0.00000000e+00 + 7.98771351e+03 7.77830780e+03 0.00000000e+00 + 3.30837391e+03 1.21504681e+04 0.00000000e+00 + 3.35439348e+03 1.21328321e+04 0.00000000e+00 + 3.36800487e+03 1.21802723e+04 0.00000000e+00 + 3.32985838e+03 1.21945715e+04 0.00000000e+00 + 8.84869178e+03 -1.76008272e+04 0.00000000e+00 + 8.81967466e+03 -1.74131947e+04 0.00000000e+00 + 8.70736325e+03 -1.75309094e+04 0.00000000e+00 + 8.77351707e+03 -1.76026098e+04 0.00000000e+00 + 8.07187016e+03 1.65242090e+04 0.00000000e+00 + 7.92142519e+03 1.65382709e+04 0.00000000e+00 + 7.86906313e+03 1.64035313e+04 0.00000000e+00 + 8.02729320e+03 1.63555198e+04 0.00000000e+00 + 7.25175529e+03 -1.64311354e+04 0.00000000e+00 + 7.32348974e+03 -1.64021328e+04 0.00000000e+00 + 7.31810745e+03 -1.63036420e+04 0.00000000e+00 + 7.23739101e+03 -1.63592092e+04 0.00000000e+00 + 1.31318962e+04 -5.15277033e+03 0.00000000e+00 + 1.19382590e+04 -5.24724846e+03 0.00000000e+00 + 1.17694317e+04 -6.53559018e+03 0.00000000e+00 + 1.28432564e+04 -6.41514048e+03 0.00000000e+00 + 7.82028916e+03 1.66716443e+04 0.00000000e+00 + 7.94161713e+03 1.66698848e+04 0.00000000e+00 + 7.93866517e+03 1.68196198e+04 0.00000000e+00 + 7.81314527e+03 1.67737193e+04 0.00000000e+00 + 3.41105551e+03 1.08727419e+04 0.00000000e+00 + 3.51182561e+03 1.09119147e+04 0.00000000e+00 + 3.50122685e+03 1.09935639e+04 0.00000000e+00 + 3.41938613e+03 1.09957659e+04 0.00000000e+00 + 7.86697127e+03 -6.53721373e+03 0.00000000e+00 + 8.02718939e+03 -6.61981827e+03 0.00000000e+00 + 8.15087413e+03 -6.44711277e+03 0.00000000e+00 + 7.90871282e+03 -6.40246667e+03 0.00000000e+00 + 5.38579311e+03 1.30755369e+04 0.00000000e+00 + 5.33745618e+03 1.31634683e+04 0.00000000e+00 + 3.33103930e+03 -1.11451773e+04 0.00000000e+00 + 3.40517883e+03 -1.10689985e+04 0.00000000e+00 + 3.38577146e+03 -1.10034581e+04 0.00000000e+00 + 3.31478757e+03 -1.10600647e+04 0.00000000e+00 + 6.03408360e+03 -1.01893486e+04 0.00000000e+00 + 5.78561987e+03 -1.01841088e+04 0.00000000e+00 + 5.75012535e+03 -1.04157162e+04 0.00000000e+00 + 5.99475365e+03 -1.04513858e+04 0.00000000e+00 + 7.68876717e+03 -1.69894223e+04 0.00000000e+00 + 7.66966300e+03 -1.69402432e+04 0.00000000e+00 + 5.77923117e+03 1.35009164e+04 0.00000000e+00 + 5.83709240e+03 1.33434378e+04 0.00000000e+00 + 6.00292728e+03 1.34221859e+04 0.00000000e+00 + 5.94484728e+03 1.36201291e+04 0.00000000e+00 + 5.60197229e+03 -8.68938630e+03 0.00000000e+00 + 5.42402307e+03 -8.87848534e+03 0.00000000e+00 + 9.47311220e+03 -1.09860581e+04 0.00000000e+00 + 1.00424513e+04 -1.13556248e+04 0.00000000e+00 + 1.06086958e+04 -1.05745119e+04 0.00000000e+00 + 9.84712200e+03 -1.05794556e+04 0.00000000e+00 + 8.34329722e+03 1.24233916e+04 0.00000000e+00 + 8.43431609e+03 1.25320482e+04 0.00000000e+00 + 8.31368741e+03 1.26581607e+04 0.00000000e+00 + 8.20671874e+03 1.25230688e+04 0.00000000e+00 + 7.06534659e+03 -6.23766281e+03 0.00000000e+00 + 7.03589817e+03 -6.01772418e+03 0.00000000e+00 + 6.66127230e+03 -6.26065964e+03 0.00000000e+00 + 6.94063576e+03 -6.39635964e+03 0.00000000e+00 + 8.02714867e+03 1.32396907e+04 0.00000000e+00 + 8.26900837e+03 1.33462185e+04 0.00000000e+00 + 8.12354237e+03 1.36255233e+04 0.00000000e+00 + 7.89935694e+03 1.34670261e+04 0.00000000e+00 + 4.51832803e+03 1.22702450e+04 0.00000000e+00 + 4.44825999e+03 1.21319662e+04 0.00000000e+00 + 4.56469792e+03 1.20662453e+04 0.00000000e+00 + 4.65537377e+03 1.21779076e+04 0.00000000e+00 + 4.19258580e+03 -1.15052070e+04 0.00000000e+00 + 4.32853154e+03 -1.14666379e+04 0.00000000e+00 + 4.32674261e+03 -1.13120538e+04 0.00000000e+00 + 4.18633332e+03 -1.13619340e+04 0.00000000e+00 + 7.95250513e+03 -1.33156291e+04 0.00000000e+00 + 7.89308467e+03 -1.35642443e+04 0.00000000e+00 + 8.12355863e+03 -1.36254864e+04 0.00000000e+00 + 8.26902531e+03 -1.33461885e+04 0.00000000e+00 + 3.28167715e+03 -1.23248388e+04 0.00000000e+00 + 3.30131148e+03 -1.23278988e+04 0.00000000e+00 + 3.29891825e+03 -1.23062699e+04 0.00000000e+00 + 3.28016667e+03 -1.23043172e+04 0.00000000e+00 + 6.19408993e+03 1.01932338e+04 0.00000000e+00 + 6.09113213e+03 1.00340701e+04 0.00000000e+00 + 6.26672456e+03 9.90716570e+03 0.00000000e+00 + 6.40200352e+03 1.00817921e+04 0.00000000e+00 + 6.90088050e+03 -8.77822500e+03 0.00000000e+00 + 6.89598370e+03 -9.20924862e+03 0.00000000e+00 + 7.24919173e+03 -9.24242296e+03 0.00000000e+00 + 7.32910638e+03 -8.87542510e+03 0.00000000e+00 + 7.63156008e+03 1.70069874e+04 0.00000000e+00 + 7.67077103e+03 1.70431487e+04 0.00000000e+00 + 7.63656218e+03 1.70635510e+04 0.00000000e+00 + 7.61522449e+03 1.70399822e+04 0.00000000e+00 + 3.28754287e+03 -1.22247745e+04 0.00000000e+00 + 3.30695566e+03 -1.22351827e+04 0.00000000e+00 + 3.33146808e+03 -1.22212633e+04 0.00000000e+00 + 3.29444713e+03 -1.21932671e+04 0.00000000e+00 + 8.07226542e+03 -1.71789095e+04 0.00000000e+00 + 7.96618575e+03 -1.70904225e+04 0.00000000e+00 + 7.92156868e+03 -1.71590684e+04 0.00000000e+00 + 7.97263032e+03 -1.71987234e+04 0.00000000e+00 + 4.60915631e+03 -1.15598827e+04 0.00000000e+00 + 4.75532473e+03 -1.15463312e+04 0.00000000e+00 + 4.77113849e+03 -1.13704885e+04 0.00000000e+00 + 4.61843409e+03 -1.13909536e+04 0.00000000e+00 + 3.51537953e+03 -1.11343824e+04 0.00000000e+00 + 3.51509093e+03 -1.12113796e+04 0.00000000e+00 + 3.62794007e+03 -1.12283054e+04 0.00000000e+00 + 3.59927191e+03 -1.11018604e+04 0.00000000e+00 + 7.11874733e+03 6.60840556e+03 0.00000000e+00 + 7.24783560e+03 6.78876031e+03 0.00000000e+00 + 7.10999797e+03 6.96223605e+03 0.00000000e+00 + 6.93313882e+03 6.75770615e+03 0.00000000e+00 + 7.86951494e+03 -1.70402616e+04 0.00000000e+00 + 7.85491339e+03 -1.71214108e+04 0.00000000e+00 + 8.91938477e+03 1.67334227e+04 0.00000000e+00 + 8.80727920e+03 1.69209358e+04 0.00000000e+00 + 8.67367257e+03 1.69488788e+04 0.00000000e+00 + 8.63273375e+03 1.67721374e+04 0.00000000e+00 + 1.16026207e+04 6.03524938e+03 0.00000000e+00 + 1.22045075e+04 4.81467046e+03 0.00000000e+00 + 1.31318957e+04 5.15277346e+03 0.00000000e+00 + 1.28432554e+04 6.41514401e+03 0.00000000e+00 + 4.10677598e+03 1.06258205e+04 0.00000000e+00 + 3.98910559e+03 1.04931791e+04 0.00000000e+00 + 4.12106042e+03 1.03981579e+04 0.00000000e+00 + 4.23511103e+03 1.05284640e+04 0.00000000e+00 + 3.87402307e+03 -5.15600522e+03 0.00000000e+00 + 4.02844109e+03 -5.96863614e+03 0.00000000e+00 + 4.67704322e+03 -6.05589436e+03 0.00000000e+00 + 4.68422206e+03 -5.16657461e+03 0.00000000e+00 + 3.57916257e+03 -1.25565998e+04 0.00000000e+00 + 3.64347807e+03 -1.26584421e+04 0.00000000e+00 + 3.32521586e+03 1.23094538e+04 0.00000000e+00 + 3.32212718e+03 1.22760690e+04 0.00000000e+00 + 3.35762420e+03 1.22792057e+04 0.00000000e+00 + 3.34758481e+03 1.23055457e+04 0.00000000e+00 + 7.82413639e+03 -1.71807257e+04 0.00000000e+00 + 7.80847076e+03 -1.72399315e+04 0.00000000e+00 + 7.85736583e+03 -1.72746277e+04 0.00000000e+00 + 7.88723700e+03 -1.72177683e+04 0.00000000e+00 + 7.75292170e+03 -8.98708154e+03 0.00000000e+00 + 8.21313022e+03 -8.78398307e+03 0.00000000e+00 + 7.97436340e+03 -8.45973764e+03 0.00000000e+00 + 7.72358261e+03 -8.63264038e+03 0.00000000e+00 + 4.80008258e+03 -1.31125698e+04 0.00000000e+00 + 4.67247434e+03 -1.30885828e+04 0.00000000e+00 + 4.62129369e+03 -1.31981292e+04 0.00000000e+00 + 4.77670823e+03 -1.32084350e+04 0.00000000e+00 + 3.63677769e+03 1.28980174e+04 0.00000000e+00 + 3.56471882e+03 1.28408473e+04 0.00000000e+00 + 3.60844712e+03 1.27773105e+04 0.00000000e+00 + 3.67756736e+03 1.28214672e+04 0.00000000e+00 + 3.28105761e+03 -1.22696241e+04 0.00000000e+00 + 3.30068512e+03 -1.22789584e+04 0.00000000e+00 + 3.30620555e+03 -1.22569003e+04 0.00000000e+00 + 3.28348869e+03 -1.22492693e+04 0.00000000e+00 + 6.23770014e+03 -1.04935296e+04 0.00000000e+00 + 6.33733909e+03 -1.02020249e+04 0.00000000e+00 + 3.38233491e+03 1.19843357e+04 0.00000000e+00 + 3.32141367e+03 1.19718178e+04 0.00000000e+00 + 3.32701111e+03 1.18985136e+04 0.00000000e+00 + 3.39600245e+03 1.19077298e+04 0.00000000e+00 + 8.33643202e+03 -1.16281726e+04 0.00000000e+00 + 8.17533977e+03 -1.13603773e+04 0.00000000e+00 + 7.91748784e+03 -1.15187943e+04 0.00000000e+00 + 8.07475771e+03 -1.17935171e+04 0.00000000e+00 + 4.73747015e+03 -6.83263392e+03 0.00000000e+00 + 5.27722137e+03 -6.74931641e+03 0.00000000e+00 + 5.26004606e+03 -6.20889737e+03 0.00000000e+00 + 6.12898118e+03 9.76243629e+03 0.00000000e+00 + 5.96995969e+03 9.88262040e+03 0.00000000e+00 + 5.27101121e+03 -1.32465752e+04 0.00000000e+00 + 5.37098477e+03 -1.32800668e+04 0.00000000e+00 + 5.42249257e+03 -1.31877917e+04 0.00000000e+00 + 5.32201973e+03 -1.31664770e+04 0.00000000e+00 + 3.94966886e+03 -1.05013770e+04 0.00000000e+00 + 3.83143055e+03 -1.06103446e+04 0.00000000e+00 + 3.92441108e+03 -1.07342204e+04 0.00000000e+00 + 4.03699791e+03 -1.06166439e+04 0.00000000e+00 + 7.80043332e+03 1.65609451e+04 0.00000000e+00 + 4.62229696e+03 -7.98202647e+03 0.00000000e+00 + 4.92254018e+03 -7.64826221e+03 0.00000000e+00 + 4.48794941e+03 -7.35462847e+03 0.00000000e+00 + 4.30520363e+03 -7.76294468e+03 0.00000000e+00 + 9.18155405e+03 1.22622065e+04 0.00000000e+00 + 8.99919943e+03 1.24407841e+04 0.00000000e+00 + 8.87416403e+03 1.23530579e+04 0.00000000e+00 + 8.88616603e+03 1.21847514e+04 0.00000000e+00 + 6.44712533e+03 -1.23714171e+04 0.00000000e+00 + 6.27446822e+03 -1.23262327e+04 0.00000000e+00 + 6.19750618e+03 -1.25394178e+04 0.00000000e+00 + 6.41786215e+03 -1.25782655e+04 0.00000000e+00 + 3.52701519e+03 -1.24651517e+04 0.00000000e+00 + 3.54169081e+03 -1.24053951e+04 0.00000000e+00 + 3.48721154e+03 -1.23889033e+04 0.00000000e+00 + 3.47427702e+03 -1.24408367e+04 0.00000000e+00 + 4.06670815e+03 1.27799770e+04 0.00000000e+00 + 4.15305946e+03 1.28255298e+04 0.00000000e+00 + 4.10573478e+03 1.29126839e+04 0.00000000e+00 + 4.03172409e+03 1.28682715e+04 0.00000000e+00 + 3.88458495e+03 -1.31339698e+04 0.00000000e+00 + 3.88648522e+03 -1.30522956e+04 0.00000000e+00 + 3.78094291e+03 -1.30469059e+04 0.00000000e+00 + 3.79623617e+03 -1.31486800e+04 0.00000000e+00 + 4.34953677e+03 1.06588135e+04 0.00000000e+00 + 4.22085844e+03 1.07500686e+04 0.00000000e+00 + 5.67138616e+03 -1.32347403e+04 0.00000000e+00 + 5.54011908e+03 -1.32090719e+04 0.00000000e+00 + 5.48534666e+03 -1.33221674e+04 0.00000000e+00 + 5.61835639e+03 -1.33807068e+04 0.00000000e+00 + 4.16604277e+03 1.18661592e+04 0.00000000e+00 + 4.08683480e+03 1.19102973e+04 0.00000000e+00 + 3.99411431e+03 1.18546609e+04 0.00000000e+00 + 4.09775004e+03 1.17651759e+04 0.00000000e+00 + 8.43582225e+03 -1.26349565e+04 0.00000000e+00 + 8.54854213e+03 -1.25299433e+04 0.00000000e+00 + 8.55570492e+03 -1.24310791e+04 0.00000000e+00 + 8.41091679e+03 -1.24369162e+04 0.00000000e+00 + 5.91179562e+03 -1.17546273e+04 0.00000000e+00 + 6.08093062e+03 -1.18288936e+04 0.00000000e+00 + 6.18756043e+03 -1.16419688e+04 0.00000000e+00 + 5.96308371e+03 -1.15656522e+04 0.00000000e+00 + 4.46132126e+03 1.07892149e+04 0.00000000e+00 + 4.32925176e+03 1.08714104e+04 0.00000000e+00 + 5.32169430e+03 9.89488040e+03 0.00000000e+00 + 5.40074066e+03 9.73753534e+03 0.00000000e+00 + 5.63923271e+03 9.80473694e+03 0.00000000e+00 + 5.47484832e+03 1.00076893e+04 0.00000000e+00 + 8.55069263e+03 -1.78711277e+04 0.00000000e+00 + 8.60847989e+03 -1.77574110e+04 0.00000000e+00 + 8.50534133e+03 -1.76983106e+04 0.00000000e+00 + 8.45088486e+03 -1.77952646e+04 0.00000000e+00 + 7.40364623e+03 6.36367923e+03 0.00000000e+00 + 7.47251847e+03 6.25732605e+03 0.00000000e+00 + 7.56806786e+03 6.29679175e+03 0.00000000e+00 + 7.51184183e+03 6.38275585e+03 0.00000000e+00 + 4.29663491e+03 -9.64979351e+03 0.00000000e+00 + 4.20337261e+03 -9.75827622e+03 0.00000000e+00 + 4.26843437e+03 -9.88159647e+03 0.00000000e+00 + 4.38652243e+03 -9.78481923e+03 0.00000000e+00 + 8.26285698e+03 -1.61245910e+04 0.00000000e+00 + 8.46019515e+03 -1.63526833e+04 0.00000000e+00 + 8.66017894e+03 -1.62286563e+04 0.00000000e+00 + 8.50171044e+03 -1.59441989e+04 0.00000000e+00 + 5.03503197e+03 6.51239023e+03 0.00000000e+00 + 4.68208718e+03 6.18383767e+03 0.00000000e+00 + 5.23033267e+03 5.95453078e+03 0.00000000e+00 + 5.37808936e+03 6.44408415e+03 0.00000000e+00 + 7.29659654e+03 6.17273138e+03 0.00000000e+00 + 7.25281912e+03 6.34826696e+03 0.00000000e+00 + 7.03475487e+03 6.37653490e+03 0.00000000e+00 + 7.03589601e+03 6.01772271e+03 0.00000000e+00 + 3.35063797e+03 -1.23514566e+04 0.00000000e+00 + 3.36327380e+03 -1.23191143e+04 0.00000000e+00 + 3.32474919e+03 -1.23014100e+04 0.00000000e+00 + 3.32378313e+03 -1.23351477e+04 0.00000000e+00 + 4.24208501e+03 -1.23114001e+04 0.00000000e+00 + 4.35125937e+03 -1.22695928e+04 0.00000000e+00 + 4.33485138e+03 -1.21660576e+04 0.00000000e+00 + 4.22351435e+03 -1.22017593e+04 0.00000000e+00 + 5.58022130e+03 -1.08265059e+04 0.00000000e+00 + 5.37979829e+03 -1.07428527e+04 0.00000000e+00 + 5.28888583e+03 -1.08977212e+04 0.00000000e+00 + 5.46410581e+03 -1.09900081e+04 0.00000000e+00 + 3.72927857e+03 1.16781432e+04 0.00000000e+00 + 3.67795339e+03 1.17764666e+04 0.00000000e+00 + 3.58021361e+03 1.17187020e+04 0.00000000e+00 + 3.64277029e+03 1.16188132e+04 0.00000000e+00 + 7.72848537e+03 -1.41409313e+04 0.00000000e+00 + 7.80987813e+03 -1.38406286e+04 0.00000000e+00 + 7.59052015e+03 -1.37274410e+04 0.00000000e+00 + 7.49879431e+03 -1.39850991e+04 0.00000000e+00 + 8.95329467e+03 1.12780392e+04 0.00000000e+00 + 8.60428815e+03 1.11839150e+04 0.00000000e+00 + 8.64172253e+03 1.08049637e+04 0.00000000e+00 + 9.08171702e+03 1.08491191e+04 0.00000000e+00 + 7.52206391e+03 1.62220643e+04 0.00000000e+00 + 7.59035634e+03 1.63215402e+04 0.00000000e+00 + 7.51136195e+03 1.63698335e+04 0.00000000e+00 + 7.42166644e+03 1.63274272e+04 0.00000000e+00 + 4.62146911e+03 1.00872191e+04 0.00000000e+00 + 4.78677656e+03 1.01735910e+04 0.00000000e+00 + 4.69460702e+03 1.03327048e+04 0.00000000e+00 + 4.56047174e+03 1.02370976e+04 0.00000000e+00 + 3.47840639e+03 -1.22805482e+04 0.00000000e+00 + 3.49317865e+03 -1.22242181e+04 0.00000000e+00 + 3.43885256e+03 -1.22060754e+04 0.00000000e+00 + 3.42842329e+03 -1.22562388e+04 0.00000000e+00 + 3.33612514e+03 -1.17144347e+04 0.00000000e+00 + 3.41106498e+03 -1.17023966e+04 0.00000000e+00 + 3.42127750e+03 -1.16141618e+04 0.00000000e+00 + 3.34031270e+03 -1.16299819e+04 0.00000000e+00 + 7.45905470e+03 -1.62038471e+04 0.00000000e+00 + 7.41727676e+03 -1.63196147e+04 0.00000000e+00 + 7.51293470e+03 -1.63749856e+04 0.00000000e+00 + 7.58837674e+03 -1.62589033e+04 0.00000000e+00 + 8.05591286e+03 1.71365336e+04 0.00000000e+00 + 8.15049529e+03 1.71327888e+04 0.00000000e+00 + 8.17484158e+03 1.72292328e+04 0.00000000e+00 + 8.07313232e+03 1.72277329e+04 0.00000000e+00 + 8.50408864e+03 1.65620323e+04 0.00000000e+00 + 8.40387127e+03 1.67073583e+04 0.00000000e+00 + 8.25409088e+03 1.67179702e+04 0.00000000e+00 + 8.25485375e+03 1.65255115e+04 0.00000000e+00 + 6.52176755e+03 -1.32871489e+04 0.00000000e+00 + 6.55366709e+03 -1.30556862e+04 0.00000000e+00 + 6.36996718e+03 -1.30073132e+04 0.00000000e+00 + 6.33667226e+03 -1.32197868e+04 0.00000000e+00 + 3.94998845e+03 -8.15422074e+03 0.00000000e+00 + 4.19221478e+03 -8.07646015e+03 0.00000000e+00 + 3.78860174e+03 -7.50809947e+03 0.00000000e+00 + 5.62915170e+03 1.28143734e+04 0.00000000e+00 + 5.74119530e+03 1.29510759e+04 0.00000000e+00 + 5.58599322e+03 1.29992975e+04 0.00000000e+00 + 5.53570072e+03 1.28987793e+04 0.00000000e+00 + 6.04466666e+03 1.32203136e+04 0.00000000e+00 + 6.06699662e+03 1.30251165e+04 0.00000000e+00 + 6.25093785e+03 1.30381533e+04 0.00000000e+00 + 6.22430349e+03 1.32689951e+04 0.00000000e+00 + 8.59761403e+03 -1.65752078e+04 0.00000000e+00 + 8.39870797e+03 -1.66859187e+04 0.00000000e+00 + 8.55022442e+03 -1.68481718e+04 0.00000000e+00 + 8.71740492e+03 -1.67820670e+04 0.00000000e+00 + 3.92642821e+03 -1.19485394e+04 0.00000000e+00 + 3.83133270e+03 -1.19947417e+04 0.00000000e+00 + 3.86112382e+03 -1.20839020e+04 0.00000000e+00 + 3.95859218e+03 -1.20510538e+04 0.00000000e+00 + 7.55635023e+03 -1.69514695e+04 0.00000000e+00 + 7.52665347e+03 -1.69259139e+04 0.00000000e+00 + 7.50466617e+03 -1.69483221e+04 0.00000000e+00 + 7.53385454e+03 -1.69823207e+04 0.00000000e+00 + 4.43346977e+03 1.01753011e+04 0.00000000e+00 + 4.47151767e+03 1.00470096e+04 0.00000000e+00 + 6.21098680e+03 -9.00369145e+03 0.00000000e+00 + 6.07809387e+03 -8.67296945e+03 0.00000000e+00 + 7.18135675e+03 -1.50508333e+04 0.00000000e+00 + 6.98663385e+03 -1.52078512e+04 0.00000000e+00 + 7.18905401e+03 1.02035752e+04 0.00000000e+00 + 6.91653627e+03 1.03647158e+04 0.00000000e+00 + 6.76953839e+03 1.01374618e+04 0.00000000e+00 + 7.01472498e+03 9.96730652e+03 0.00000000e+00 + 3.33497855e+03 -1.22664116e+04 0.00000000e+00 + 4.04875210e+03 1.29805591e+04 0.00000000e+00 + 4.18458451e+03 1.29767801e+04 0.00000000e+00 + 4.10752349e+03 1.30510217e+04 0.00000000e+00 + 3.29646259e+03 -1.23797406e+04 0.00000000e+00 + 3.26149903e+03 -1.23796681e+04 0.00000000e+00 + 3.26149903e+03 -1.24197217e+04 0.00000000e+00 + 3.29667332e+03 -1.24204245e+04 0.00000000e+00 + 1.06440454e+04 9.07185693e+03 0.00000000e+00 + 1.11854914e+04 9.67012416e+03 0.00000000e+00 + 1.06086925e+04 1.05745168e+04 0.00000000e+00 + 1.01990306e+04 9.68151476e+03 0.00000000e+00 + 8.91936969e+03 -1.67333908e+04 0.00000000e+00 + 8.79753311e+03 -1.64931656e+04 0.00000000e+00 + 6.09846092e+03 9.30112301e+03 0.00000000e+00 + 5.84136052e+03 9.30948526e+03 0.00000000e+00 + 5.79272081e+03 9.02378713e+03 0.00000000e+00 + 6.10746916e+03 9.03888696e+03 0.00000000e+00 + 5.25025017e+03 1.28943331e+04 0.00000000e+00 + 5.08345239e+03 1.30056253e+04 0.00000000e+00 + 5.06941624e+03 1.28701739e+04 0.00000000e+00 + 7.58635546e+03 1.69924476e+04 0.00000000e+00 + 7.55239651e+03 1.69703350e+04 0.00000000e+00 + 7.54869653e+03 1.69402943e+04 0.00000000e+00 + 7.59600183e+03 1.69395252e+04 0.00000000e+00 + 3.61743912e+03 -1.24383068e+04 0.00000000e+00 + 3.68851915e+03 -1.24128182e+04 0.00000000e+00 + 3.32810910e+03 1.25699953e+04 0.00000000e+00 + 3.32267810e+03 1.26487115e+04 0.00000000e+00 + 3.26149903e+03 1.26504501e+04 0.00000000e+00 + 3.26149903e+03 1.25811290e+04 0.00000000e+00 + 5.90994977e+03 1.30058641e+04 0.00000000e+00 + 5.87902491e+03 1.31721501e+04 0.00000000e+00 + 3.26149903e+03 -1.25811446e+04 0.00000000e+00 + 3.26149903e+03 -1.26504667e+04 0.00000000e+00 + 5.29778930e+03 -1.20721605e+04 0.00000000e+00 + 5.33254540e+03 -1.19057753e+04 0.00000000e+00 + 5.18268267e+03 -1.18322766e+04 0.00000000e+00 + 5.15199473e+03 -1.19998377e+04 0.00000000e+00 + 3.29523372e+03 1.23671372e+04 0.00000000e+00 + 3.27726279e+03 1.23466545e+04 0.00000000e+00 + 3.27947217e+03 1.23289028e+04 0.00000000e+00 + 3.29989512e+03 1.23344299e+04 0.00000000e+00 + 4.77977874e+03 1.20991955e+04 0.00000000e+00 + 4.87716493e+03 1.22082792e+04 0.00000000e+00 + 4.75463018e+03 1.22846328e+04 0.00000000e+00 + 7.91403923e+03 -1.73178367e+04 0.00000000e+00 + 7.94960583e+03 -1.72535819e+04 0.00000000e+00 + 8.45875276e+03 1.22014457e+04 0.00000000e+00 + 8.44082153e+03 1.23616260e+04 0.00000000e+00 + 8.27108848e+03 1.22816082e+04 0.00000000e+00 + 7.99962692e+03 6.84286171e+03 0.00000000e+00 + 8.16096653e+03 7.07033251e+03 0.00000000e+00 + 7.81527194e+03 6.96136094e+03 0.00000000e+00 + 9.33218179e+03 -1.14470072e+04 0.00000000e+00 + 9.53493267e+03 -1.19165829e+04 0.00000000e+00 + 1.14422077e+04 7.27380000e+03 0.00000000e+00 + 1.10762652e+04 8.23831976e+03 0.00000000e+00 + 1.04256464e+04 7.89144638e+03 0.00000000e+00 + 1.06770631e+04 7.05865070e+03 0.00000000e+00 + 3.34526559e+03 -1.19451832e+04 0.00000000e+00 + 3.38524318e+03 -1.19786502e+04 0.00000000e+00 + 3.44870110e+03 -1.19661344e+04 0.00000000e+00 + 3.39310671e+03 -1.18996545e+04 0.00000000e+00 + 8.47185165e+03 1.27697480e+04 0.00000000e+00 + 8.62053313e+03 1.27250827e+04 0.00000000e+00 + 8.69662742e+03 1.27602468e+04 0.00000000e+00 + 8.57564540e+03 1.29067163e+04 0.00000000e+00 + 6.20113615e+03 -1.18945864e+04 0.00000000e+00 + 6.31972093e+03 -1.18278953e+04 0.00000000e+00 + 8.99920697e+03 -1.24407765e+04 0.00000000e+00 + 9.18156042e+03 -1.22622000e+04 0.00000000e+00 + 8.94571163e+03 -1.21413401e+04 0.00000000e+00 + 8.94112402e+03 -1.23459198e+04 0.00000000e+00 + 7.92322676e+03 -1.69308375e+04 0.00000000e+00 + 7.84213174e+03 -1.69272077e+04 0.00000000e+00 + 7.80844505e+03 -1.69752556e+04 0.00000000e+00 + 3.70197101e+03 5.86281787e+02 0.00000000e+00 + 2.58461359e+03 1.05127928e+03 0.00000000e+00 + 2.56017625e+03 -2.93830000e-04 0.00000000e+00 + 3.12531728e+03 -8.76205990e+01 0.00000000e+00 + 6.77195166e+03 1.07154616e+04 0.00000000e+00 + 7.04165446e+03 1.06097026e+04 0.00000000e+00 + 7.13940938e+03 1.09094865e+04 0.00000000e+00 + 6.84400132e+03 1.09233015e+04 0.00000000e+00 + 5.54607029e+03 -1.35070716e+04 0.00000000e+00 + 5.70734015e+03 -1.36351672e+04 0.00000000e+00 + 5.76699058e+03 -1.34556049e+04 0.00000000e+00 + 8.06107806e+03 -7.09480099e+03 0.00000000e+00 + 7.71108957e+03 -7.21323072e+03 0.00000000e+00 + 7.72152380e+03 -7.55635237e+03 0.00000000e+00 + 8.18554722e+03 -7.42725636e+03 0.00000000e+00 + 3.29908317e+03 1.24597525e+04 0.00000000e+00 + 3.30818430e+03 1.25068892e+04 0.00000000e+00 + 3.26149903e+03 1.25194851e+04 0.00000000e+00 + 3.26149903e+03 1.24668608e+04 0.00000000e+00 + 6.85691541e+03 -6.62514195e+03 0.00000000e+00 + 7.06532173e+03 -6.65790054e+03 0.00000000e+00 + 7.11063489e+03 -6.47358316e+03 0.00000000e+00 + 4.37602739e+03 -1.00565630e+04 0.00000000e+00 + 4.51356638e+03 -1.00303019e+04 0.00000000e+00 + 4.45990098e+03 -9.89867145e+03 0.00000000e+00 + 4.37276874e+03 -9.94772438e+03 0.00000000e+00 + 7.58667709e+03 -1.66252562e+04 0.00000000e+00 + 7.56242742e+03 -1.67145756e+04 0.00000000e+00 + 7.60318348e+03 -1.67818553e+04 0.00000000e+00 + 7.67546227e+03 -1.67149794e+04 0.00000000e+00 + 7.90871370e+03 6.40246687e+03 0.00000000e+00 + 7.97984812e+03 6.57981022e+03 0.00000000e+00 + 7.83904075e+03 6.64201425e+03 0.00000000e+00 + 7.81832891e+03 6.49471857e+03 0.00000000e+00 + 6.01859741e+03 1.18164187e+04 0.00000000e+00 + 6.18889488e+03 1.17143086e+04 0.00000000e+00 + 6.28292759e+03 1.19633476e+04 0.00000000e+00 + 6.10388692e+03 1.19421257e+04 0.00000000e+00 + 5.26328583e+03 -1.22318156e+04 0.00000000e+00 + 5.11799273e+03 -1.21609344e+04 0.00000000e+00 + 7.41312286e+03 1.68262676e+04 0.00000000e+00 + 7.45900533e+03 1.67893195e+04 0.00000000e+00 + 7.49657274e+03 1.68399172e+04 0.00000000e+00 + 7.45118947e+03 1.68749408e+04 0.00000000e+00 + 1.01077924e+04 8.62044996e+03 0.00000000e+00 + 9.58266788e+03 8.29702980e+03 0.00000000e+00 + 9.84437969e+03 7.63789940e+03 0.00000000e+00 + 8.61024843e+03 1.23123520e+04 0.00000000e+00 + 8.52483521e+03 1.24214204e+04 0.00000000e+00 + 4.06364024e+03 1.31855604e+04 0.00000000e+00 + 3.97579729e+03 1.32205489e+04 0.00000000e+00 + 3.94681681e+03 1.31478971e+04 0.00000000e+00 + 4.02503034e+03 1.31055697e+04 0.00000000e+00 + 7.47184788e+03 -1.60027293e+04 0.00000000e+00 + 7.31743577e+03 -1.59421485e+04 0.00000000e+00 + 7.28529553e+03 -1.60847798e+04 0.00000000e+00 + 7.35934800e+03 -1.60946103e+04 0.00000000e+00 + 3.26149903e+03 -1.22983104e+04 0.00000000e+00 + 3.26149903e+03 -1.23199124e+04 0.00000000e+00 + 7.11217742e+03 1.12396299e+04 0.00000000e+00 + 7.32827685e+03 1.11330333e+04 0.00000000e+00 + 7.43687229e+03 1.13443148e+04 0.00000000e+00 + 7.20739030e+03 1.14310150e+04 0.00000000e+00 + 9.01563008e+03 -1.18349149e+04 0.00000000e+00 + 7.26114789e+03 -1.18396464e+04 0.00000000e+00 + 7.34819077e+03 -1.20039776e+04 0.00000000e+00 + 7.54907071e+03 -1.19307493e+04 0.00000000e+00 + 7.45687960e+03 -1.17320633e+04 0.00000000e+00 + 5.51164404e+03 1.27452305e+04 0.00000000e+00 + 5.48070817e+03 1.28330404e+04 0.00000000e+00 + 3.26149903e+03 1.22983104e+04 0.00000000e+00 + 3.27953264e+03 1.23082796e+04 0.00000000e+00 + 3.26149903e+03 1.23199111e+04 0.00000000e+00 + 7.71343878e+03 -6.45761195e+03 0.00000000e+00 + 7.75512638e+03 -6.36151507e+03 0.00000000e+00 + 4.24349754e+03 9.44471011e+03 0.00000000e+00 + 4.20149813e+03 9.34752380e+03 0.00000000e+00 + 4.30251748e+03 9.26021140e+03 0.00000000e+00 + 4.34590938e+03 9.41849984e+03 0.00000000e+00 + 5.36256559e+03 7.35571099e+03 0.00000000e+00 + 5.35098802e+03 7.80474501e+03 0.00000000e+00 + 4.96445753e+03 7.90189211e+03 0.00000000e+00 + 4.84350967e+03 7.38759513e+03 0.00000000e+00 + 3.45954258e+03 -1.23260193e+04 0.00000000e+00 + 3.49253927e+03 -1.23489230e+04 0.00000000e+00 + 3.53753092e+03 -1.23252369e+04 0.00000000e+00 + 7.30448411e+03 1.67328666e+04 0.00000000e+00 + 7.36702080e+03 1.67627901e+04 0.00000000e+00 + 7.32693456e+03 1.68273972e+04 0.00000000e+00 + 7.27548945e+03 1.67759521e+04 0.00000000e+00 + 7.29976703e+03 -1.67316651e+04 0.00000000e+00 + 7.27548759e+03 -1.67759502e+04 0.00000000e+00 + 7.32693123e+03 -1.68273939e+04 0.00000000e+00 + 7.36799103e+03 -1.67664853e+04 0.00000000e+00 + 6.62737189e+03 -1.38802697e+04 0.00000000e+00 + 6.68191138e+03 -1.36113196e+04 0.00000000e+00 + 6.47911632e+03 -1.35248479e+04 0.00000000e+00 + 6.41876858e+03 -1.37676964e+04 0.00000000e+00 + 7.52438984e+03 1.60118290e+04 0.00000000e+00 + 7.42973475e+03 1.61231543e+04 0.00000000e+00 + 7.31146361e+03 1.60224009e+04 0.00000000e+00 + 7.43367693e+03 1.58916208e+04 0.00000000e+00 + 5.32723637e+03 -1.25892782e+04 0.00000000e+00 + 5.27219134e+03 -1.27021577e+04 0.00000000e+00 + 5.38882308e+03 -1.27827797e+04 0.00000000e+00 + 5.45170953e+03 -1.26688361e+04 0.00000000e+00 + 4.20588574e+03 9.78376083e+03 0.00000000e+00 + 4.16394308e+03 9.89522004e+03 0.00000000e+00 + 4.01271432e+03 9.93459147e+03 0.00000000e+00 + 4.05439393e+03 9.76804983e+03 0.00000000e+00 + 4.16930848e+03 1.00616263e+04 0.00000000e+00 + 4.24358720e+03 9.95616170e+03 0.00000000e+00 + 4.35087334e+03 1.00138251e+04 0.00000000e+00 + 4.30416535e+03 1.01284709e+04 0.00000000e+00 + 7.08322967e+03 1.48318825e+04 0.00000000e+00 + 7.12966411e+03 1.51060284e+04 0.00000000e+00 + 7.01101099e+03 1.52665780e+04 0.00000000e+00 + 6.88419744e+03 1.50195089e+04 0.00000000e+00 + 4.33629721e+03 1.21791598e+04 0.00000000e+00 + 4.37312277e+03 1.22816847e+04 0.00000000e+00 + 4.44752777e+03 -3.06737237e+03 0.00000000e+00 + 4.20888465e+03 -2.20934567e+03 0.00000000e+00 + 3.53937543e+03 -2.63526487e+03 0.00000000e+00 + 3.82498284e+03 -3.49576518e+03 0.00000000e+00 + 4.33141409e+03 3.33341317e+03 0.00000000e+00 + 3.56965558e+03 3.22951969e+03 0.00000000e+00 + 3.46747693e+03 2.33930241e+03 0.00000000e+00 + 4.23395795e+03 2.50607531e+03 0.00000000e+00 + 3.62956552e+03 1.23865001e+04 0.00000000e+00 + 3.60961780e+03 1.24614771e+04 0.00000000e+00 + 3.54562061e+03 1.24416089e+04 0.00000000e+00 + 3.56616512e+03 1.23745965e+04 0.00000000e+00 + 6.64056100e+03 -1.23998205e+04 0.00000000e+00 + 6.61084698e+03 -1.26157498e+04 0.00000000e+00 + 6.80190946e+03 -1.26492224e+04 0.00000000e+00 + 6.83142600e+03 -1.24397397e+04 0.00000000e+00 + 8.67922005e+03 -1.79700268e+04 0.00000000e+00 + 8.71817051e+03 -1.78151535e+04 0.00000000e+00 + 7.59892219e+03 -1.21326406e+04 0.00000000e+00 + 7.38614612e+03 -1.21856126e+04 0.00000000e+00 + 7.40747655e+03 -1.23874299e+04 0.00000000e+00 + 7.62647884e+03 -1.23386363e+04 0.00000000e+00 + 7.83688791e+03 9.69059894e+03 0.00000000e+00 + 7.88128021e+03 9.22263836e+03 0.00000000e+00 + 8.26369608e+03 9.19749768e+03 0.00000000e+00 + 8.31384271e+03 9.60422706e+03 0.00000000e+00 + 5.20832052e+03 1.33203781e+04 0.00000000e+00 + 5.27877184e+03 1.32467889e+04 0.00000000e+00 + 5.37844267e+03 1.32849239e+04 0.00000000e+00 + 5.29411704e+03 1.33579992e+04 0.00000000e+00 + 8.61150496e+03 -1.26967554e+04 0.00000000e+00 + 8.50774914e+03 -1.27971484e+04 0.00000000e+00 + 8.57565852e+03 -1.29066995e+04 0.00000000e+00 + 8.69663819e+03 -1.27602342e+04 0.00000000e+00 + 8.45482486e+03 -6.75863319e+03 0.00000000e+00 + 8.49865805e+03 -6.46760243e+03 0.00000000e+00 + 8.23878101e+03 -6.64301527e+03 0.00000000e+00 + 5.11767586e+03 1.27341559e+04 0.00000000e+00 + 5.24202882e+03 1.27458995e+04 0.00000000e+00 + 4.00709369e+03 1.29314464e+04 0.00000000e+00 + 3.81908763e+03 -1.29735067e+04 0.00000000e+00 + 3.77820391e+03 -1.29036887e+04 0.00000000e+00 + 3.70921734e+03 -1.29764625e+04 0.00000000e+00 + 7.18084054e+03 -1.60070497e+04 0.00000000e+00 + 7.23273668e+03 -1.58284138e+04 0.00000000e+00 + 7.14717304e+03 -1.58872979e+04 0.00000000e+00 + 4.40288089e+03 -9.32686183e+03 0.00000000e+00 + 4.52496360e+03 -9.44599479e+03 0.00000000e+00 + 4.62390223e+03 -9.29563685e+03 0.00000000e+00 + 4.47359579e+03 -9.20455862e+03 0.00000000e+00 + 3.37515168e+03 -1.20200846e+04 0.00000000e+00 + 3.42996495e+03 -1.20435226e+04 0.00000000e+00 + 7.59376867e+03 1.67500604e+04 0.00000000e+00 + 7.54264504e+03 1.67009092e+04 0.00000000e+00 + 7.59675415e+03 1.66208358e+04 0.00000000e+00 + 7.64822642e+03 1.67046876e+04 0.00000000e+00 + 8.43809983e+03 1.63027556e+04 0.00000000e+00 + 8.66020363e+03 1.62287049e+04 0.00000000e+00 + 8.79755407e+03 1.64932051e+04 0.00000000e+00 + 5.54125749e+03 1.12456377e+04 0.00000000e+00 + 5.41096964e+03 1.11690952e+04 0.00000000e+00 + 5.48029569e+03 1.10021327e+04 0.00000000e+00 + 3.52434772e+03 1.23027219e+04 0.00000000e+00 + 3.50922546e+03 1.23627729e+04 0.00000000e+00 + 3.45957744e+03 1.23511665e+04 0.00000000e+00 + 3.47240428e+03 1.22993450e+04 0.00000000e+00 + 7.45086351e+03 -8.53942491e+03 0.00000000e+00 + 7.10890581e+03 -8.40966633e+03 0.00000000e+00 + 8.30831435e+03 1.75027168e+04 0.00000000e+00 + 8.20900780e+03 1.75751388e+04 0.00000000e+00 + 8.12965735e+03 1.75045772e+04 0.00000000e+00 + 8.18314590e+03 1.74339343e+04 0.00000000e+00 + 4.41643960e+03 -1.28362363e+04 0.00000000e+00 + 4.45247687e+03 -1.29463083e+04 0.00000000e+00 + 4.55987560e+03 -1.28962040e+04 0.00000000e+00 + 4.52451519e+03 -1.28026616e+04 0.00000000e+00 + 7.48526520e+03 1.69188077e+04 0.00000000e+00 + 7.52954880e+03 1.68916943e+04 0.00000000e+00 + 7.51249969e+03 1.69576828e+04 0.00000000e+00 + 3.75851237e+03 -4.53647189e+03 0.00000000e+00 + 4.21453998e+03 -4.26381703e+03 0.00000000e+00 + 5.44354839e+03 -1.21432489e+04 0.00000000e+00 + 5.48446142e+03 -1.19846983e+04 0.00000000e+00 + 3.31005430e+03 -1.25120902e+04 0.00000000e+00 + 3.35561001e+03 -1.24976260e+04 0.00000000e+00 + 6.45713019e+03 1.30680824e+04 0.00000000e+00 + 6.67346344e+03 1.31094923e+04 0.00000000e+00 + 6.62153811e+03 1.33544268e+04 0.00000000e+00 + 6.41933031e+03 1.33133769e+04 0.00000000e+00 + 7.37156293e+03 1.68720256e+04 0.00000000e+00 + 3.44215548e+03 1.28245046e+04 0.00000000e+00 + 3.51454758e+03 1.29012089e+04 0.00000000e+00 + 3.46287240e+03 1.29633350e+04 0.00000000e+00 + 3.39935662e+03 1.28998193e+04 0.00000000e+00 + 8.15087354e+03 6.44711268e+03 0.00000000e+00 + 8.49865756e+03 6.46760243e+03 0.00000000e+00 + 8.39636317e+03 6.86503674e+03 0.00000000e+00 + 8.17821187e+03 6.67598939e+03 0.00000000e+00 + 6.71189436e+03 -1.11959457e+04 0.00000000e+00 + 6.93991526e+03 -1.11676632e+04 0.00000000e+00 + 3.44729072e+03 -1.28214443e+04 0.00000000e+00 + 3.39936749e+03 -1.28998301e+04 0.00000000e+00 + 3.46288220e+03 -1.29633448e+04 0.00000000e+00 + 3.53153242e+03 -1.28907895e+04 0.00000000e+00 + 7.37155872e+03 -1.68720214e+04 0.00000000e+00 + 7.41119597e+03 -1.68310335e+04 0.00000000e+00 + 3.59695973e+03 1.10178113e+04 0.00000000e+00 + 3.53369749e+03 1.11404952e+04 0.00000000e+00 + 3.48360264e+03 1.10679088e+04 0.00000000e+00 + 3.38167183e+03 -1.23775730e+04 0.00000000e+00 + 3.40119876e+03 -1.23422150e+04 0.00000000e+00 + 8.91282229e+03 -1.10892717e+04 0.00000000e+00 + 9.00001602e+03 -1.14783464e+04 0.00000000e+00 + 7.74607732e+03 -1.67922993e+04 0.00000000e+00 + 7.68404598e+03 -1.68454977e+04 0.00000000e+00 + 7.75637122e+03 -1.69295188e+04 0.00000000e+00 + 7.80675125e+03 -1.68692900e+04 0.00000000e+00 + 1.00623925e+04 -8.42263525e+03 0.00000000e+00 + 1.03970381e+04 -9.11738137e+03 0.00000000e+00 + 1.10475584e+04 -8.36876179e+03 0.00000000e+00 + 1.05756287e+04 -8.14128872e+03 0.00000000e+00 + 5.44071251e+03 9.55401571e+03 0.00000000e+00 + 5.63996398e+03 9.55621644e+03 0.00000000e+00 + 8.19578334e+03 1.73361110e+04 0.00000000e+00 + 8.34211280e+03 1.73408163e+04 0.00000000e+00 + 5.98658569e+03 -1.10911227e+04 0.00000000e+00 + 5.78651934e+03 -1.09438934e+04 0.00000000e+00 + 5.64232839e+03 -1.11063285e+04 0.00000000e+00 + 5.80903376e+03 -1.12808854e+04 0.00000000e+00 + 4.65861421e+03 -9.95809606e+03 0.00000000e+00 + 4.58073699e+03 -9.82670306e+03 0.00000000e+00 + 3.44216150e+03 -1.23686996e+04 0.00000000e+00 + 3.41573268e+03 -1.23012945e+04 0.00000000e+00 + 3.36394610e+03 1.23359108e+04 0.00000000e+00 + 3.38898321e+03 1.22896071e+04 0.00000000e+00 + 3.42668702e+03 1.22965630e+04 0.00000000e+00 + 3.41484332e+03 1.23414758e+04 0.00000000e+00 + 3.78226757e+03 -1.22744134e+04 0.00000000e+00 + 3.78543166e+03 -1.21867534e+04 0.00000000e+00 + 3.70669195e+03 -1.21858316e+04 0.00000000e+00 + 3.70244770e+03 -1.22666720e+04 0.00000000e+00 + 3.26149903e+03 -1.25194980e+04 0.00000000e+00 + 4.47217052e+03 -8.62602158e+03 0.00000000e+00 + 4.37645682e+03 -8.34335580e+03 0.00000000e+00 + 4.04980785e+03 -8.67832718e+03 0.00000000e+00 + 7.89043098e+03 1.72566719e+04 0.00000000e+00 + 7.97161790e+03 1.72845106e+04 0.00000000e+00 + 7.93306811e+03 1.73376693e+04 0.00000000e+00 + 7.88737508e+03 1.73083789e+04 0.00000000e+00 + 3.58527034e+03 1.29678681e+04 0.00000000e+00 + 3.65687807e+03 1.30368586e+04 0.00000000e+00 + 3.60201804e+03 1.31024807e+04 0.00000000e+00 + 3.52919396e+03 1.30296567e+04 0.00000000e+00 + 6.12682408e+03 1.37598257e+04 0.00000000e+00 + 6.18541168e+03 1.35087528e+04 0.00000000e+00 + 8.17464027e+03 -1.73027481e+04 0.00000000e+00 + 8.29008530e+03 -1.72498747e+04 0.00000000e+00 + 8.22702807e+03 -1.71344315e+04 0.00000000e+00 + 3.58994185e+03 -1.29732257e+04 0.00000000e+00 + 3.52920297e+03 -1.30296656e+04 0.00000000e+00 + 3.60202558e+03 -1.31024882e+04 0.00000000e+00 + 3.65313398e+03 -1.30378936e+04 0.00000000e+00 + 6.17829567e+03 1.21648233e+04 0.00000000e+00 + 6.07559111e+03 1.23133873e+04 0.00000000e+00 + 5.93899051e+03 1.21940858e+04 0.00000000e+00 + 6.03653118e+03 1.20547818e+04 0.00000000e+00 + 1.23723976e+04 7.61679955e+03 0.00000000e+00 + 4.77327964e+03 -3.88641663e+03 0.00000000e+00 + 5.17381475e+03 -4.61398581e+03 0.00000000e+00 + 5.33790377e+03 1.01583050e+04 0.00000000e+00 + 5.63170941e+03 1.01490062e+04 0.00000000e+00 + 5.49118943e+03 1.02955611e+04 0.00000000e+00 + 8.42124633e+03 -7.69408956e+03 0.00000000e+00 + 8.04244380e+03 -7.90169485e+03 0.00000000e+00 + 5.66985295e+03 1.19734974e+04 0.00000000e+00 + 5.52403596e+03 1.18742910e+04 0.00000000e+00 + 5.60018223e+03 1.17224294e+04 0.00000000e+00 + 5.75754034e+03 1.18270275e+04 0.00000000e+00 + 8.61266365e+03 -1.25615551e+04 0.00000000e+00 + 8.67754793e+03 -1.24588170e+04 0.00000000e+00 + 4.28744005e+03 -1.28780600e+04 0.00000000e+00 + 4.32299429e+03 -1.29961149e+04 0.00000000e+00 + 3.30047964e+03 -1.23452376e+04 0.00000000e+00 + 3.31439222e+03 -1.23575227e+04 0.00000000e+00 + 3.51384221e+03 -1.13055053e+04 0.00000000e+00 + 3.42338215e+03 -1.12175067e+04 0.00000000e+00 + 3.42792417e+03 -1.13222746e+04 0.00000000e+00 + 3.33474201e+03 -1.23760705e+04 0.00000000e+00 + 3.35642420e+03 -1.24023977e+04 0.00000000e+00 + 3.95200210e+03 1.28372957e+04 0.00000000e+00 + 3.86712278e+03 1.28056110e+04 0.00000000e+00 + 3.89718879e+03 1.27088388e+04 0.00000000e+00 + 3.98223487e+03 1.27433361e+04 0.00000000e+00 + 8.95911655e+03 -6.74364219e+03 0.00000000e+00 + 8.96682704e+03 -6.41822275e+03 0.00000000e+00 + 8.02050212e+03 -1.70074190e+04 0.00000000e+00 + 8.35228170e+03 1.76151775e+04 0.00000000e+00 + 8.47435254e+03 1.75220874e+04 0.00000000e+00 + 8.42370684e+03 1.76412233e+04 0.00000000e+00 + 7.83014100e+03 8.86932315e+03 0.00000000e+00 + 8.18829461e+03 8.74837879e+03 0.00000000e+00 + 7.35442035e+03 -1.61871035e+04 0.00000000e+00 + 8.61192077e+03 -1.22726298e+04 0.00000000e+00 + 8.42882245e+03 -1.22559660e+04 0.00000000e+00 + 4.48529700e+03 1.11120245e+04 0.00000000e+00 + 4.62860884e+03 1.10689793e+04 0.00000000e+00 + 5.03374424e+03 -1.17689215e+04 0.00000000e+00 + 5.00771062e+03 -1.19364314e+04 0.00000000e+00 + 7.59227825e+03 1.10191761e+04 0.00000000e+00 + 7.47415791e+03 1.07535734e+04 0.00000000e+00 + 4.56140282e+03 1.16116061e+04 0.00000000e+00 + 4.75092780e+03 1.15422795e+04 0.00000000e+00 + 6.86244227e+03 1.11206482e+04 0.00000000e+00 + 7.03081067e+03 1.11037216e+04 0.00000000e+00 + 5.80192815e+03 -9.93890954e+03 0.00000000e+00 + 6.04867174e+03 -9.91662609e+03 0.00000000e+00 + 4.24252048e+03 1.28804449e+04 0.00000000e+00 + 9.82818033e+03 1.04490657e+04 0.00000000e+00 + 1.00424462e+04 1.13556310e+04 0.00000000e+00 + 9.55996118e+03 1.10266925e+04 0.00000000e+00 + 8.36680487e+03 1.61410719e+04 0.00000000e+00 + 8.50174384e+03 1.59442510e+04 0.00000000e+00 + 7.62984734e+03 -1.68868784e+04 0.00000000e+00 + 7.58875490e+03 -1.68477264e+04 0.00000000e+00 + 7.52425764e+03 -1.68690998e+04 0.00000000e+00 + 7.58603562e+03 -1.69196074e+04 0.00000000e+00 + 5.85982132e+03 5.78735312e+03 0.00000000e+00 + 5.84406755e+03 6.40700480e+03 0.00000000e+00 + 8.15645552e+03 1.59353792e+04 0.00000000e+00 + 8.31928139e+03 1.56522837e+04 0.00000000e+00 + 7.29582594e+03 1.55379685e+04 0.00000000e+00 + 7.18566238e+03 1.53841588e+04 0.00000000e+00 + 7.27428492e+03 1.52052866e+04 0.00000000e+00 + 7.48578805e+03 1.54144780e+04 0.00000000e+00 + 8.27438997e+03 1.72036302e+04 0.00000000e+00 + 8.37071392e+03 1.71345981e+04 0.00000000e+00 + 8.45860249e+03 1.72451866e+04 0.00000000e+00 + 3.96840328e+03 1.23709780e+04 0.00000000e+00 + 4.05243769e+03 1.23279471e+04 0.00000000e+00 + 4.11398557e+03 1.23804674e+04 0.00000000e+00 + 4.04695496e+03 1.24580102e+04 0.00000000e+00 + 4.55754784e+03 -1.02206219e+04 0.00000000e+00 + 4.73080094e+03 -1.01010777e+04 0.00000000e+00 + 8.67139672e+03 -1.20725076e+04 0.00000000e+00 + 8.45211735e+03 -1.20608964e+04 0.00000000e+00 + 6.83739144e+03 1.37736816e+04 0.00000000e+00 + 6.78752448e+03 1.40679892e+04 0.00000000e+00 + 6.65119648e+03 1.40259003e+04 0.00000000e+00 + 6.60250290e+03 1.38411228e+04 0.00000000e+00 + 3.40414596e+03 1.12764166e+04 0.00000000e+00 + 3.42373633e+03 1.11688740e+04 0.00000000e+00 + 3.52048527e+03 1.12716862e+04 0.00000000e+00 + 4.24593013e+03 -1.00411471e+04 0.00000000e+00 + 4.63163850e+03 4.83806052e+03 0.00000000e+00 + 5.13906699e+03 4.54280150e+03 0.00000000e+00 + 5.46474662e+03 5.13985600e+03 0.00000000e+00 + 4.95705330e+03 5.42714776e+03 0.00000000e+00 + 7.79872701e+03 -1.70718794e+04 0.00000000e+00 + 7.81605296e+03 -1.71085729e+04 0.00000000e+00 + 3.54782939e+03 -1.28096080e+04 0.00000000e+00 + 3.49989262e+03 -1.27927315e+04 0.00000000e+00 + 8.45500784e+03 1.68245543e+04 0.00000000e+00 + 4.13919762e+03 -1.24743581e+04 0.00000000e+00 + 4.02108229e+03 -1.24485401e+04 0.00000000e+00 + 3.95907728e+03 -1.25615742e+04 0.00000000e+00 + 4.07300477e+03 -1.25971421e+04 0.00000000e+00 + 4.80890673e+03 -9.86154102e+03 0.00000000e+00 + 4.70623512e+03 -9.73669643e+03 0.00000000e+00 + 8.81265247e+03 -1.69702893e+04 0.00000000e+00 + 9.01470977e+03 -1.69583975e+04 0.00000000e+00 + 5.87715602e+03 1.38008358e+04 0.00000000e+00 + 5.70733780e+03 1.36351651e+04 0.00000000e+00 + 5.61048292e+03 9.35833007e+03 0.00000000e+00 + 5.52065168e+03 9.16216545e+03 0.00000000e+00 + 3.70349750e+03 -1.30849473e+04 0.00000000e+00 + 8.37393001e+03 -1.78743926e+04 0.00000000e+00 + 8.46977635e+03 -1.79702390e+04 0.00000000e+00 + 5.89053870e+03 8.25235283e+03 0.00000000e+00 + 5.66371143e+03 8.08371577e+03 0.00000000e+00 + 5.70823578e+03 7.80516238e+03 0.00000000e+00 + 6.01321011e+03 7.92018476e+03 0.00000000e+00 + 8.77180742e+03 1.74371972e+04 0.00000000e+00 + 8.93902536e+03 1.73919866e+04 0.00000000e+00 + 8.96060437e+03 1.75531122e+04 0.00000000e+00 + 8.83609718e+03 1.75944253e+04 0.00000000e+00 + 9.01472034e+03 1.69584244e+04 0.00000000e+00 + 8.85975357e+03 1.70431621e+04 0.00000000e+00 + 7.45204110e+03 -7.02298686e+03 0.00000000e+00 + 7.43462566e+03 -7.22510317e+03 0.00000000e+00 + 7.65700994e+03 -6.99463953e+03 0.00000000e+00 + 3.65881931e+03 1.20253585e+04 0.00000000e+00 + 3.58743223e+03 1.19444004e+04 0.00000000e+00 + 3.63202950e+03 1.18672689e+04 0.00000000e+00 + 3.70738064e+03 1.19179049e+04 0.00000000e+00 + 3.71201618e+03 -1.07337849e+04 0.00000000e+00 + 3.79797102e+03 -1.08458429e+04 0.00000000e+00 + 7.39416729e+03 -1.48964410e+04 0.00000000e+00 + 7.57458661e+03 -1.47827661e+04 0.00000000e+00 + 7.63127120e+03 -1.44724869e+04 0.00000000e+00 + 7.30879595e+03 -1.46592928e+04 0.00000000e+00 + 3.61986916e+03 -1.23398126e+04 0.00000000e+00 + 8.35153536e+03 -8.21780702e+03 0.00000000e+00 + 8.76845631e+03 -7.95281218e+03 0.00000000e+00 + 3.30176360e+03 -1.24630485e+04 0.00000000e+00 + 3.34002003e+03 -1.24534811e+04 0.00000000e+00 + 7.59462445e+03 1.70259228e+04 0.00000000e+00 + 7.65116627e+03 1.69574082e+04 0.00000000e+00 + 4.95796684e+03 1.30314074e+04 0.00000000e+00 + 4.96795091e+03 1.29259260e+04 0.00000000e+00 + 4.67080751e+03 -1.03069021e+04 0.00000000e+00 + 4.78932825e+03 -1.02444809e+04 0.00000000e+00 + 4.69020873e+03 -9.52474787e+03 0.00000000e+00 + 4.78242238e+03 -9.39212966e+03 0.00000000e+00 + 7.30952612e+03 -7.43340989e+03 0.00000000e+00 + 6.15832234e+03 -1.38453702e+04 0.00000000e+00 + 6.24005249e+03 -1.36530798e+04 0.00000000e+00 + 6.08158120e+03 -1.35775257e+04 0.00000000e+00 + 6.04921053e+03 -1.37328382e+04 0.00000000e+00 + 8.22948538e+03 -1.75977838e+04 0.00000000e+00 + 8.31543327e+03 -1.76333912e+04 0.00000000e+00 + 8.33584147e+03 -1.75184142e+04 0.00000000e+00 + 8.24351403e+03 -1.75016587e+04 0.00000000e+00 + 4.32671568e+03 -9.40771711e+03 0.00000000e+00 + 4.38467316e+03 -9.49634302e+03 0.00000000e+00 + 5.57303165e+03 -1.27560242e+04 0.00000000e+00 + 5.50359626e+03 -1.28694922e+04 0.00000000e+00 + 4.54184141e+03 -1.30754581e+04 0.00000000e+00 + 4.34596844e+03 -1.31073113e+04 0.00000000e+00 + 4.14130956e+03 -1.07227823e+04 0.00000000e+00 + 4.01901278e+03 -1.08439992e+04 0.00000000e+00 + 5.26089827e+03 1.19898558e+04 0.00000000e+00 + 5.13725003e+03 1.20632368e+04 0.00000000e+00 + 7.32519207e+03 -1.66746404e+04 0.00000000e+00 + 7.38506561e+03 -1.66287655e+04 0.00000000e+00 + 7.33853420e+03 -1.65640430e+04 0.00000000e+00 + 7.29013946e+03 -1.66253948e+04 0.00000000e+00 + 4.66169656e+03 -8.68289925e+03 0.00000000e+00 + 4.74456054e+03 -8.45079925e+03 0.00000000e+00 + 6.72043696e+03 -1.33553033e+04 0.00000000e+00 + 6.75387856e+03 -1.31099070e+04 0.00000000e+00 + 7.08911232e+03 -1.48256396e+04 0.00000000e+00 + 6.89332251e+03 -1.49922746e+04 0.00000000e+00 + 8.02063151e+03 -1.72973434e+04 0.00000000e+00 + 5.62667845e+03 1.34056683e+04 0.00000000e+00 + 5.68793913e+03 1.32784167e+04 0.00000000e+00 + 3.26149903e+03 -1.27261897e+04 0.00000000e+00 + 3.33148751e+03 -1.27197176e+04 0.00000000e+00 + 3.32317279e+03 1.27164843e+04 0.00000000e+00 + 3.26149903e+03 1.27261714e+04 0.00000000e+00 + 7.34992665e+03 1.62244589e+04 0.00000000e+00 + 7.31652890e+03 -1.12935075e+04 0.00000000e+00 + 7.48730197e+03 -1.12002666e+04 0.00000000e+00 + 7.28551271e+03 -1.09613813e+04 0.00000000e+00 + 7.15872309e+03 -1.12168383e+04 0.00000000e+00 + 6.87824710e+03 -1.39872366e+04 0.00000000e+00 + 6.89584137e+03 -1.36834209e+04 0.00000000e+00 + 6.61501761e+03 -6.58917058e+03 0.00000000e+00 + 8.23716823e+03 -1.22522002e+04 0.00000000e+00 + 8.25365171e+03 -1.20582828e+04 0.00000000e+00 + 8.04836983e+03 -1.20546208e+04 0.00000000e+00 + 8.04571119e+03 -1.22570280e+04 0.00000000e+00 + 4.11524236e+03 -6.69417269e+03 0.00000000e+00 + 3.35769141e+03 -5.93903929e+03 0.00000000e+00 + 3.58303788e+03 -6.76374008e+03 0.00000000e+00 + 7.66018410e+03 8.56042179e+03 0.00000000e+00 + 3.34565874e+03 1.10956993e+04 0.00000000e+00 + 3.42191182e+03 1.10814838e+04 0.00000000e+00 + 3.34031047e+03 1.11788354e+04 0.00000000e+00 + 4.15293124e+03 9.39303061e+03 0.00000000e+00 + 4.16375484e+03 9.45844604e+03 0.00000000e+00 + 3.32458749e+03 1.23356064e+04 0.00000000e+00 + 7.66839533e+03 1.03032435e+04 0.00000000e+00 + 7.47880936e+03 9.99683265e+03 0.00000000e+00 + 8.03885640e+03 1.01358322e+04 0.00000000e+00 + 8.45327131e+03 1.74066367e+04 0.00000000e+00 + 8.88013495e+03 -1.71479174e+04 0.00000000e+00 + 9.07381587e+03 -1.71702146e+04 0.00000000e+00 + 7.24346332e+03 -6.85291452e+03 0.00000000e+00 + 7.04241005e+03 -6.86925936e+03 0.00000000e+00 + 7.03951431e+03 -7.09575314e+03 0.00000000e+00 + 7.24755163e+03 -7.04746169e+03 0.00000000e+00 + 6.17287368e+03 7.63071440e+03 0.00000000e+00 + 6.26577624e+03 8.09386837e+03 0.00000000e+00 + 4.59809547e+03 9.60326834e+03 0.00000000e+00 + 4.66059753e+03 9.44740098e+03 0.00000000e+00 + 4.80463233e+03 9.52071032e+03 0.00000000e+00 + 4.74021128e+03 9.67762299e+03 0.00000000e+00 + 4.09262015e+03 1.01918857e+04 0.00000000e+00 + 3.94602137e+03 1.01196614e+04 0.00000000e+00 + 6.41554564e+03 9.34472740e+03 0.00000000e+00 + 6.39056533e+03 9.02183133e+03 0.00000000e+00 + 6.67106024e+03 9.03158487e+03 0.00000000e+00 + 6.64356146e+03 9.24529883e+03 0.00000000e+00 + 3.71737995e+03 1.23164617e+04 0.00000000e+00 + 3.69802908e+03 1.23952309e+04 0.00000000e+00 + 3.64657020e+03 1.23108112e+04 0.00000000e+00 + 4.07409725e+03 -1.16677996e+04 0.00000000e+00 + 4.19111588e+03 -1.16459991e+04 0.00000000e+00 + 4.06274599e+03 -1.15474113e+04 0.00000000e+00 + 5.80559101e+03 7.28647205e+03 0.00000000e+00 + 8.22727366e+03 1.71267593e+04 0.00000000e+00 + 8.26081099e+03 1.70306708e+04 0.00000000e+00 + 4.90384456e+03 9.95834323e+03 0.00000000e+00 + 4.64686042e+03 9.87212992e+03 0.00000000e+00 + 4.90040708e+03 9.71665527e+03 0.00000000e+00 + 3.37284559e+03 -1.22809312e+04 0.00000000e+00 + 4.43970444e+03 1.29781225e+04 0.00000000e+00 + 4.54892982e+03 1.30248724e+04 0.00000000e+00 + 4.47273965e+03 1.32013693e+04 0.00000000e+00 + 4.40300806e+03 1.30748493e+04 0.00000000e+00 + 7.34632158e+03 1.66402173e+04 0.00000000e+00 + 7.32721762e+03 1.66897276e+04 0.00000000e+00 + 7.28313222e+03 1.66762494e+04 0.00000000e+00 + 7.29630471e+03 1.66347558e+04 0.00000000e+00 + 8.78194491e+03 -1.26637927e+04 0.00000000e+00 + 8.69617931e+03 -1.26093896e+04 0.00000000e+00 + 8.22675542e+03 -1.74037745e+04 0.00000000e+00 + 8.36230866e+03 -1.73854408e+04 0.00000000e+00 + 6.44863413e+03 -1.21787713e+04 0.00000000e+00 + 6.31601054e+03 -1.21938348e+04 0.00000000e+00 + 3.48285369e+03 1.20511716e+04 0.00000000e+00 + 3.43872950e+03 1.20077390e+04 0.00000000e+00 + 3.47946100e+03 1.19278577e+04 0.00000000e+00 + 3.53396532e+03 1.20031056e+04 0.00000000e+00 + 6.93393934e+03 1.31634174e+04 0.00000000e+00 + 6.80521827e+03 1.34202030e+04 0.00000000e+00 + 3.79132511e+03 1.23287678e+04 0.00000000e+00 + 3.76529230e+03 1.24054879e+04 0.00000000e+00 + 3.86282044e+03 1.20806756e+04 0.00000000e+00 + 3.94874097e+03 1.20563293e+04 0.00000000e+00 + 3.99955983e+03 1.21159397e+04 0.00000000e+00 + 3.91608436e+03 1.21739783e+04 0.00000000e+00 + 8.01157509e+03 -9.37138120e+03 0.00000000e+00 + 8.42738878e+03 -9.15905232e+03 0.00000000e+00 + 8.32131833e+03 -1.28203636e+04 0.00000000e+00 + 8.41783100e+03 -1.28858765e+04 0.00000000e+00 + 3.91132545e+03 1.12363637e+04 0.00000000e+00 + 4.00522329e+03 1.13406442e+04 0.00000000e+00 + 7.48905041e+03 6.51688038e+03 0.00000000e+00 + 7.38485208e+03 6.46027060e+03 0.00000000e+00 + 3.67867120e+03 -1.31791338e+04 0.00000000e+00 + 7.32222929e+03 1.64534882e+04 0.00000000e+00 + 7.31405101e+03 1.63727580e+04 0.00000000e+00 + 7.40274490e+03 1.64434251e+04 0.00000000e+00 + 3.95193400e+03 1.22593833e+04 0.00000000e+00 + 3.88538926e+03 1.22827232e+04 0.00000000e+00 + 3.82768841e+03 1.22322841e+04 0.00000000e+00 + 7.82422207e+03 -1.20794441e+04 0.00000000e+00 + 7.84419278e+03 -1.22888052e+04 0.00000000e+00 + 3.93215199e+03 1.26155999e+04 0.00000000e+00 + 4.01317934e+03 1.26500610e+04 0.00000000e+00 + 6.04397621e+03 1.40000025e+04 0.00000000e+00 + 3.29550491e+03 1.22997499e+04 0.00000000e+00 + 3.28973345e+03 1.22810443e+04 0.00000000e+00 + 3.29686189e+03 1.22639845e+04 0.00000000e+00 + 7.42960612e+03 -1.65205974e+04 0.00000000e+00 + 7.45454060e+03 -1.65933996e+04 0.00000000e+00 + 7.34822759e+03 1.49621992e+04 0.00000000e+00 + 3.37118947e+03 1.20574308e+04 0.00000000e+00 + 3.31422761e+03 1.20367243e+04 0.00000000e+00 + 8.37424695e+03 1.78747096e+04 0.00000000e+00 + 8.49152908e+03 1.77809965e+04 0.00000000e+00 + 8.58585648e+03 1.78991070e+04 0.00000000e+00 + 8.46984374e+03 1.79703064e+04 0.00000000e+00 + 5.68076886e+03 -1.06345414e+04 0.00000000e+00 + 5.96715027e+03 -1.07261741e+04 0.00000000e+00 + 3.78009182e+03 -1.13087922e+04 0.00000000e+00 + 3.76388984e+03 -1.11809196e+04 0.00000000e+00 + 3.68076789e+03 -1.13346901e+04 0.00000000e+00 + 5.41030526e+03 -1.22991161e+04 0.00000000e+00 + 5.16453090e+03 -1.08355263e+04 0.00000000e+00 + 5.18732837e+03 -1.07013676e+04 0.00000000e+00 + 7.71907244e+03 1.45227328e+04 0.00000000e+00 + 7.96000445e+03 1.46421298e+04 0.00000000e+00 + 8.53130297e+03 1.73541743e+04 0.00000000e+00 + 8.01627265e+03 1.39404285e+04 0.00000000e+00 + 7.95995812e+03 1.42831462e+04 0.00000000e+00 + 7.75613962e+03 1.42353768e+04 0.00000000e+00 + 7.78281685e+03 1.40269985e+04 0.00000000e+00 + 3.44477138e+03 1.26800457e+04 0.00000000e+00 + 3.38906263e+03 1.26476738e+04 0.00000000e+00 + 3.43494791e+03 1.26014899e+04 0.00000000e+00 + 3.46096342e+03 1.26354718e+04 0.00000000e+00 + 4.89452653e+03 -1.00042985e+04 0.00000000e+00 + 1.14216271e+04 4.48074198e+03 0.00000000e+00 + 1.08320551e+04 5.28569081e+03 0.00000000e+00 + 3.81108310e+03 -1.32097719e+04 0.00000000e+00 + 3.76070055e+03 -1.32611632e+04 0.00000000e+00 + 8.31924701e+03 -1.56522276e+04 0.00000000e+00 + 8.17351115e+03 -1.58978093e+04 0.00000000e+00 + 4.08935359e+03 1.20196765e+04 0.00000000e+00 + 4.17232877e+03 1.21365001e+04 0.00000000e+00 + 4.06832368e+03 1.22274004e+04 0.00000000e+00 + 3.26149903e+03 1.23467185e+04 0.00000000e+00 + 3.26149903e+03 1.23796627e+04 0.00000000e+00 + 5.56979137e+03 -1.30785709e+04 0.00000000e+00 + 5.70557622e+03 -1.30752094e+04 0.00000000e+00 + 5.70357680e+03 -1.28787867e+04 0.00000000e+00 + 5.58931706e+03 -1.29427796e+04 0.00000000e+00 + 5.36213516e+03 -1.30617722e+04 0.00000000e+00 + 5.45038768e+03 -1.31124793e+04 0.00000000e+00 + 7.56083302e+03 -1.70120158e+04 0.00000000e+00 + 3.78153630e+03 -1.19146804e+04 0.00000000e+00 + 3.87432540e+03 -1.18320361e+04 0.00000000e+00 + 3.87241872e+03 -1.22825758e+04 0.00000000e+00 + 3.77190156e+03 -1.23602718e+04 0.00000000e+00 + 3.85290393e+03 -1.23759741e+04 0.00000000e+00 + 8.69894317e+03 1.80013345e+04 0.00000000e+00 + 8.57337077e+03 1.80738334e+04 0.00000000e+00 + 9.09737976e+03 1.73639113e+04 0.00000000e+00 + 9.09981374e+03 1.75365781e+04 0.00000000e+00 + 8.92577095e+03 -1.73147805e+04 0.00000000e+00 + 8.95725998e+03 -1.74682671e+04 0.00000000e+00 + 9.09981481e+03 -1.75365617e+04 0.00000000e+00 + 9.09737917e+03 -1.73638922e+04 0.00000000e+00 + 6.70624528e+03 8.65047907e+03 0.00000000e+00 + 6.35208640e+03 8.72878141e+03 0.00000000e+00 + 6.24814833e+03 8.45653825e+03 0.00000000e+00 + 6.47911959e+03 8.31247105e+03 0.00000000e+00 + 8.08901513e+03 -1.70614461e+04 0.00000000e+00 + 3.46442058e+03 1.24729837e+04 0.00000000e+00 + 3.43478015e+03 1.25198636e+04 0.00000000e+00 + 3.39862584e+03 1.24883211e+04 0.00000000e+00 + 3.42134383e+03 1.24475668e+04 0.00000000e+00 + 6.30270171e+03 -9.88658324e+03 0.00000000e+00 + 6.29805136e+03 -9.59714630e+03 0.00000000e+00 + 6.04240485e+03 -9.64502106e+03 0.00000000e+00 + 7.80958453e+03 -1.51683158e+04 0.00000000e+00 + 7.68937363e+03 -1.49284512e+04 0.00000000e+00 + 7.47646334e+03 -1.51188246e+04 0.00000000e+00 + 7.58566340e+03 -1.53303223e+04 0.00000000e+00 + 4.32736980e+03 1.19249199e+04 0.00000000e+00 + 4.27951817e+03 1.18151160e+04 0.00000000e+00 + 4.42939712e+03 1.17761510e+04 0.00000000e+00 + 4.41178127e+03 1.18951575e+04 0.00000000e+00 + 3.26149903e+03 -1.18943993e+04 0.00000000e+00 + 3.26149903e+03 -1.19649653e+04 0.00000000e+00 + 3.32062308e+03 -1.19949982e+04 0.00000000e+00 + 4.11572044e+03 1.56211477e+03 0.00000000e+00 + 3.43733240e+03 1.67683917e+03 0.00000000e+00 + 8.43796173e+03 -1.75450113e+04 0.00000000e+00 + 8.45879825e+03 -1.74530954e+04 0.00000000e+00 + 4.27585781e+03 1.20760250e+04 0.00000000e+00 + 4.21921340e+03 1.19709735e+04 0.00000000e+00 + 6.45002207e+03 9.74901593e+03 0.00000000e+00 + 6.26392869e+03 9.60065635e+03 0.00000000e+00 + 6.63461001e+03 9.56617419e+03 0.00000000e+00 + 4.19057326e+03 -1.19568256e+04 0.00000000e+00 + 4.06880483e+03 -1.20074644e+04 0.00000000e+00 + 4.09049388e+03 -1.21270209e+04 0.00000000e+00 + 4.20723457e+03 -1.20847879e+04 0.00000000e+00 + 5.08553535e+03 1.30794489e+04 0.00000000e+00 + 7.66906108e+03 1.71352969e+04 0.00000000e+00 + 7.66127653e+03 1.71109839e+04 0.00000000e+00 + 4.20135081e+03 -1.32402299e+04 0.00000000e+00 + 4.33238031e+03 -1.32162923e+04 0.00000000e+00 + 4.21488649e+03 -1.31416477e+04 0.00000000e+00 + 8.03661388e+03 -1.74278368e+04 0.00000000e+00 + 8.09341229e+03 -1.73640913e+04 0.00000000e+00 + 7.97447742e+03 -1.73686126e+04 0.00000000e+00 + 7.59836763e+03 1.68642866e+04 0.00000000e+00 + 3.36734532e+03 1.27887510e+04 0.00000000e+00 + 3.34189723e+03 1.28423599e+04 0.00000000e+00 + 3.37278766e+03 -1.27895198e+04 0.00000000e+00 + 3.34190811e+03 -1.28423707e+04 0.00000000e+00 + 3.80920905e+03 1.21517851e+04 0.00000000e+00 + 3.74584335e+03 1.21432540e+04 0.00000000e+00 + 3.76318151e+03 1.20487409e+04 0.00000000e+00 + 6.09834160e+03 1.25825220e+04 0.00000000e+00 + 5.96688187e+03 1.27004226e+04 0.00000000e+00 + 5.84399192e+03 1.25743946e+04 0.00000000e+00 + 5.96613928e+03 1.24499532e+04 0.00000000e+00 + 7.64459643e+03 -1.25412824e+04 0.00000000e+00 + 7.89081759e+03 -1.25042823e+04 0.00000000e+00 + 5.37818845e+03 1.27341080e+04 0.00000000e+00 + 5.39328744e+03 1.28507045e+04 0.00000000e+00 + 3.40082965e+03 1.23846020e+04 0.00000000e+00 + 3.37333904e+03 1.23739866e+04 0.00000000e+00 + 3.60045102e+03 -1.28797740e+04 0.00000000e+00 + 3.64512251e+03 -1.29199986e+04 0.00000000e+00 + 3.68878811e+03 -1.28580528e+04 0.00000000e+00 + 3.61539896e+03 -1.28278547e+04 0.00000000e+00 + 3.37824774e+03 1.27262926e+04 0.00000000e+00 + 8.16129861e+03 1.20912968e+04 0.00000000e+00 + 8.36306705e+03 1.20238063e+04 0.00000000e+00 + 5.85072790e+03 1.28069036e+04 0.00000000e+00 + 5.72743371e+03 1.26981070e+04 0.00000000e+00 + 4.16383153e+03 -7.16449040e+03 0.00000000e+00 + 8.57273855e+03 -1.80732012e+04 0.00000000e+00 + 3.86690857e+03 1.23490393e+04 0.00000000e+00 + 3.27959582e+03 -1.22867274e+04 0.00000000e+00 + 3.26149903e+03 -1.22805614e+04 0.00000000e+00 + 3.26149903e+03 1.22805619e+04 0.00000000e+00 + 3.27823095e+03 1.22902260e+04 0.00000000e+00 + 8.71930968e+03 -7.48243849e+03 0.00000000e+00 + 8.45624718e+03 -7.33015193e+03 0.00000000e+00 + 6.56790375e+03 7.16233185e+03 0.00000000e+00 + 6.79922438e+03 7.38119094e+03 0.00000000e+00 + 6.37010328e+03 7.38374369e+03 0.00000000e+00 + 3.85465777e+03 -1.03073380e+04 0.00000000e+00 + 4.03763374e+03 -1.04363131e+04 0.00000000e+00 + 4.04845235e+03 -1.03206120e+04 0.00000000e+00 + 4.47527783e+03 1.28489825e+04 0.00000000e+00 + 4.59366181e+03 1.28820304e+04 0.00000000e+00 + 3.41107686e+03 -1.08727206e+04 0.00000000e+00 + 3.33240206e+03 -1.09493115e+04 0.00000000e+00 + 3.48180744e+03 -1.09317617e+04 0.00000000e+00 + 3.87263886e+03 1.16260471e+04 0.00000000e+00 + 3.89017946e+03 1.15471652e+04 0.00000000e+00 + 3.96767719e+03 1.15210486e+04 0.00000000e+00 + 4.00131219e+03 1.16564797e+04 0.00000000e+00 + 3.97850485e+03 -1.21625227e+04 0.00000000e+00 + 3.99108528e+03 -1.22964644e+04 0.00000000e+00 + 4.11204788e+03 -1.22419306e+04 0.00000000e+00 + 7.94585543e+03 -1.58927680e+04 0.00000000e+00 + 8.01553565e+03 -1.61234450e+04 0.00000000e+00 + 9.51291729e+03 -6.65205321e+03 0.00000000e+00 + 9.54710668e+03 -6.23656773e+03 0.00000000e+00 + 3.30948487e+03 1.23865784e+04 0.00000000e+00 + 3.28987808e+03 1.23970402e+04 0.00000000e+00 + 3.99866059e+03 -1.31777619e+04 0.00000000e+00 + 3.95191749e+03 -1.31223247e+04 0.00000000e+00 + 3.88562558e+03 -1.32304164e+04 0.00000000e+00 + 3.69493043e+03 -1.23497680e+04 0.00000000e+00 + 3.50898854e+03 -1.26130923e+04 0.00000000e+00 + 3.46240104e+03 -1.25614946e+04 0.00000000e+00 + 3.45107783e+03 -1.26470803e+04 0.00000000e+00 + 6.55563975e+03 -1.42140405e+04 0.00000000e+00 + 6.67342137e+03 -1.45273780e+04 0.00000000e+00 + 6.86032847e+03 -1.43738853e+04 0.00000000e+00 + 6.76992357e+03 -1.41983756e+04 0.00000000e+00 + 4.60113718e+03 -1.29685648e+04 0.00000000e+00 + 3.32333648e+03 1.24123623e+04 0.00000000e+00 + 3.35220829e+03 1.23931574e+04 0.00000000e+00 + 3.37670556e+03 1.24289569e+04 0.00000000e+00 + 3.33508540e+03 1.24466645e+04 0.00000000e+00 + 8.12673062e+03 1.23735956e+04 0.00000000e+00 + 8.06540057e+03 1.22613899e+04 0.00000000e+00 + 7.96000170e+03 -1.46420693e+04 0.00000000e+00 + 7.95996370e+03 -1.42830943e+04 0.00000000e+00 + 5.45291580e+03 1.20031926e+04 0.00000000e+00 + 5.35664359e+03 1.20969115e+04 0.00000000e+00 + 5.35414856e+03 1.19376883e+04 0.00000000e+00 + 1.00420992e+04 -7.04734864e+03 0.00000000e+00 + 1.08326706e+04 -6.81310796e+03 0.00000000e+00 + 1.09059730e+04 -5.99051389e+03 0.00000000e+00 + 1.01570820e+04 -6.50046984e+03 0.00000000e+00 + 3.41604638e+03 1.15627600e+04 0.00000000e+00 + 3.41179987e+03 1.16495536e+04 0.00000000e+00 + 3.33603375e+03 1.16522775e+04 0.00000000e+00 + 3.33827756e+03 1.15643470e+04 0.00000000e+00 + 3.76069761e+03 1.32611603e+04 0.00000000e+00 + 3.67866591e+03 1.31791286e+04 0.00000000e+00 + 3.71299653e+03 1.31037958e+04 0.00000000e+00 + 3.76456853e+03 1.31595382e+04 0.00000000e+00 + 6.35498392e+03 -8.34280852e+03 0.00000000e+00 + 6.13887117e+03 -8.41550190e+03 0.00000000e+00 + 6.44084010e+03 -8.60715435e+03 0.00000000e+00 + 3.28495764e+03 -1.23481856e+04 0.00000000e+00 + 3.26149903e+03 -1.23467216e+04 0.00000000e+00 + 3.30509485e+03 1.22306275e+04 0.00000000e+00 + 3.33297519e+03 1.22337250e+04 0.00000000e+00 + 5.83137515e+03 6.86866300e+03 0.00000000e+00 + 6.29423726e+03 6.89393513e+03 0.00000000e+00 + 6.17014846e+03 7.19811822e+03 0.00000000e+00 + 7.92792929e+03 1.22915312e+04 0.00000000e+00 + 7.91103581e+03 1.20962619e+04 0.00000000e+00 + 3.46467027e+03 -1.17846386e+04 0.00000000e+00 + 3.43747351e+03 -1.18475787e+04 0.00000000e+00 + 3.52011031e+03 -1.18790765e+04 0.00000000e+00 + 3.51646548e+03 -1.18018524e+04 0.00000000e+00 + 6.21464002e+03 1.24377032e+04 0.00000000e+00 + 4.29740331e+03 -9.25677921e+03 0.00000000e+00 + 4.33682482e+03 -9.13082380e+03 0.00000000e+00 + 4.65173961e+03 -1.04434041e+04 0.00000000e+00 + 4.81531110e+03 -1.04025890e+04 0.00000000e+00 + 4.35642586e+03 9.54821816e+03 0.00000000e+00 + 4.25387253e+03 9.54951387e+03 0.00000000e+00 + 3.77618535e+03 1.15777321e+04 0.00000000e+00 + 3.83935972e+03 1.17519452e+04 0.00000000e+00 + 4.42007331e+03 4.12579656e+03 0.00000000e+00 + 4.90200321e+03 4.08388889e+03 0.00000000e+00 + 3.59324378e+03 -1.08431960e+04 0.00000000e+00 + 3.51207393e+03 -1.07693667e+04 0.00000000e+00 + 3.57383579e+03 -1.24851584e+04 0.00000000e+00 + 3.49208948e+03 -1.20862571e+04 0.00000000e+00 + 3.53034288e+03 -1.20131049e+04 0.00000000e+00 + 7.76093128e+03 1.36922354e+04 0.00000000e+00 + 8.01628558e+03 -1.39403828e+04 0.00000000e+00 + 4.38180221e+03 1.20255732e+04 0.00000000e+00 + 4.30094794e+03 1.25221615e+04 0.00000000e+00 + 4.20246936e+03 1.24494883e+04 0.00000000e+00 + 4.26026316e+03 1.23574799e+04 0.00000000e+00 + 4.38159233e+03 1.24113154e+04 0.00000000e+00 + 7.79236136e+03 -6.66546442e+03 0.00000000e+00 + 7.65948035e+03 -6.57425154e+03 0.00000000e+00 + 7.04750324e+03 -7.34072455e+03 0.00000000e+00 + 7.25722344e+03 -7.19453772e+03 0.00000000e+00 + 4.97762771e+03 -1.20925897e+04 0.00000000e+00 + 4.86537817e+03 -1.18914745e+04 0.00000000e+00 + 4.84095761e+03 -1.20463281e+04 0.00000000e+00 + 7.66933203e+03 -1.71100525e+04 0.00000000e+00 + 7.69701956e+03 -1.71053916e+04 0.00000000e+00 + 7.69681943e+03 -1.70727209e+04 0.00000000e+00 + 7.65715465e+03 -1.70781953e+04 0.00000000e+00 + 7.61045304e+03 -8.15371900e+03 0.00000000e+00 + 4.03463492e+03 -1.18949830e+04 0.00000000e+00 + 4.12289217e+03 1.25574229e+04 0.00000000e+00 + 4.09989281e+03 1.26811497e+04 0.00000000e+00 + 4.03404776e+03 1.25792626e+04 0.00000000e+00 + 4.45423016e+03 -1.18862051e+04 0.00000000e+00 + 4.32121749e+03 -1.19147997e+04 0.00000000e+00 + 4.32718545e+03 -1.20482476e+04 0.00000000e+00 + 4.44979693e+03 -1.20236881e+04 0.00000000e+00 + 5.06627674e+03 9.70588889e+03 0.00000000e+00 + 5.10213104e+03 9.87539887e+03 0.00000000e+00 + 8.11015681e+03 1.74056479e+04 0.00000000e+00 + 8.08860809e+03 1.73283975e+04 0.00000000e+00 + 4.13234179e+03 -1.23483143e+04 0.00000000e+00 + 4.05253041e+03 -1.23706443e+04 0.00000000e+00 + 4.21688630e+03 1.16728368e+04 0.00000000e+00 + 4.10729316e+03 1.16030167e+04 0.00000000e+00 + 3.26149903e+03 1.24197136e+04 0.00000000e+00 + 3.29294282e+03 1.24213876e+04 0.00000000e+00 + 4.43144387e+03 -1.22347462e+04 0.00000000e+00 + 4.44290311e+03 -1.21477076e+04 0.00000000e+00 + 3.58237242e+03 1.23064556e+04 0.00000000e+00 + 6.82748823e+03 9.75806558e+03 0.00000000e+00 + 6.61715138e+03 9.93541954e+03 0.00000000e+00 + 8.42719724e+03 -1.31050920e+04 0.00000000e+00 + 8.23388478e+03 -1.29874198e+04 0.00000000e+00 + 8.15415005e+03 -1.31187343e+04 0.00000000e+00 + 5.07107855e+03 -1.23302026e+04 0.00000000e+00 + 4.93997792e+03 -1.22305504e+04 0.00000000e+00 + 5.76854130e+03 -1.27002337e+04 0.00000000e+00 + 5.64165144e+03 -1.26272661e+04 0.00000000e+00 + 3.42754867e+03 -1.15184001e+04 0.00000000e+00 + 3.34306046e+03 -1.15380069e+04 0.00000000e+00 + 4.74055454e+03 -1.17128845e+04 0.00000000e+00 + 4.59846271e+03 -1.17184850e+04 0.00000000e+00 + 4.58840160e+03 -1.18710848e+04 0.00000000e+00 + 4.72533951e+03 -1.18716004e+04 0.00000000e+00 + 4.88605316e+03 -1.17282923e+04 0.00000000e+00 + 4.24029012e+03 1.26227655e+04 0.00000000e+00 + 4.19435044e+03 1.27257422e+04 0.00000000e+00 + 6.54848056e+03 -9.86211254e+03 0.00000000e+00 + 6.53424584e+03 -1.00667725e+04 0.00000000e+00 + 7.36628809e+03 1.57281839e+04 0.00000000e+00 + 7.51575278e+03 1.56880126e+04 0.00000000e+00 + 7.51944932e+03 1.58255038e+04 0.00000000e+00 + 3.75010291e+03 1.07331174e+04 0.00000000e+00 + 3.62599427e+03 1.06386393e+04 0.00000000e+00 + 3.74414868e+03 1.04832802e+04 0.00000000e+00 + 3.86507257e+03 1.06071308e+04 0.00000000e+00 + 5.51208081e+03 -1.25346495e+04 0.00000000e+00 + 8.19426899e+03 1.61390680e+04 0.00000000e+00 + 3.75531988e+03 1.18357487e+04 0.00000000e+00 + 3.80462976e+03 1.18840884e+04 0.00000000e+00 + 3.78669963e+03 1.19539161e+04 0.00000000e+00 + 9.27565878e+03 1.15088739e+04 0.00000000e+00 + 7.08081600e+03 -7.60794528e+03 0.00000000e+00 + 7.35683222e+03 -7.82473279e+03 0.00000000e+00 + 6.77750332e+03 -1.28734220e+04 0.00000000e+00 + 6.58223675e+03 -1.28321338e+04 0.00000000e+00 + 4.47275157e+03 -1.12612297e+04 0.00000000e+00 + 4.62621008e+03 -1.12135040e+04 0.00000000e+00 + 4.63046201e+03 -1.10287895e+04 0.00000000e+00 + 4.47004294e+03 -1.10916207e+04 0.00000000e+00 + 4.90679437e+03 -1.15601425e+04 0.00000000e+00 + 4.92835440e+03 -1.13756878e+04 0.00000000e+00 + 4.73298484e+03 9.28213823e+03 0.00000000e+00 + 4.88549218e+03 9.37183453e+03 0.00000000e+00 + 7.68264208e+03 7.69494241e+03 0.00000000e+00 + 7.87305385e+03 -1.01510210e+04 0.00000000e+00 + 7.88847647e+03 -9.85437247e+03 0.00000000e+00 + 7.61288716e+03 -9.64117776e+03 0.00000000e+00 + 7.44238339e+03 -1.01642455e+04 0.00000000e+00 + 4.94328414e+03 1.03041982e+04 0.00000000e+00 + 5.06442794e+03 1.01524710e+04 0.00000000e+00 + 3.57191257e+03 1.20749091e+04 0.00000000e+00 + 3.82588405e+03 -1.16593660e+04 0.00000000e+00 + 3.94287849e+03 -1.15954237e+04 0.00000000e+00 + 3.89271713e+03 -1.14595916e+04 0.00000000e+00 + 3.81346103e+03 -1.15521528e+04 0.00000000e+00 + 5.87715798e+03 -1.38008380e+04 0.00000000e+00 + 6.04397817e+03 -1.40000049e+04 0.00000000e+00 + 7.30737868e+03 1.65842050e+04 0.00000000e+00 + 7.36309165e+03 1.65822031e+04 0.00000000e+00 + 6.06558032e+03 9.52737996e+03 0.00000000e+00 + 4.10884536e+03 -1.31688002e+04 0.00000000e+00 + 4.08451960e+03 -1.32694156e+04 0.00000000e+00 + 6.51954441e+03 -8.90434902e+03 0.00000000e+00 + 5.43757689e+03 -1.29689849e+04 0.00000000e+00 + 8.48257183e+03 1.70079586e+04 0.00000000e+00 + 8.57731962e+03 1.71687515e+04 0.00000000e+00 + 3.89002045e+03 -1.29669016e+04 0.00000000e+00 + 4.80310470e+03 1.19029004e+04 0.00000000e+00 + 4.90583977e+03 1.20228003e+04 0.00000000e+00 + 4.68021080e+03 1.19873105e+04 0.00000000e+00 + 8.90625101e+03 1.72163542e+04 0.00000000e+00 + 9.07382135e+03 1.71702367e+04 0.00000000e+00 + 5.88004752e+03 -1.29071852e+04 0.00000000e+00 + 5.90692350e+03 -1.27365319e+04 0.00000000e+00 + 6.12190354e+03 1.12256273e+04 0.00000000e+00 + 6.24375914e+03 1.13959982e+04 0.00000000e+00 + 6.06468749e+03 1.15090565e+04 0.00000000e+00 + 6.41956919e+03 6.05264862e+03 0.00000000e+00 + 6.29588834e+03 6.44115406e+03 0.00000000e+00 + 4.47274073e+03 -1.32013693e+04 0.00000000e+00 + 5.22299559e+03 1.26304608e+04 0.00000000e+00 + 5.35827366e+03 1.26043711e+04 0.00000000e+00 + 8.20323747e+03 -1.24671138e+04 0.00000000e+00 + 4.26059794e+03 1.02850865e+04 0.00000000e+00 + 4.39822696e+03 1.02699871e+04 0.00000000e+00 + 7.51932302e+03 -1.67931740e+04 0.00000000e+00 + 7.50507155e+03 -1.67268517e+04 0.00000000e+00 + 7.43816743e+03 -1.67463989e+04 0.00000000e+00 + 7.45995161e+03 -1.68061028e+04 0.00000000e+00 + 6.16925780e+03 -1.09301942e+04 0.00000000e+00 + 6.11621308e+03 1.09397566e+04 0.00000000e+00 + 6.04080310e+03 1.11032172e+04 0.00000000e+00 + 5.88683208e+03 1.09315653e+04 0.00000000e+00 + 6.03528654e+03 -1.13881893e+04 0.00000000e+00 + 6.17253233e+03 -1.14608123e+04 0.00000000e+00 + 6.30310809e+03 -1.13860423e+04 0.00000000e+00 + 6.16390721e+03 -1.12362323e+04 0.00000000e+00 + 5.36798639e+03 -1.17311724e+04 0.00000000e+00 + 5.40340386e+03 -1.15513310e+04 0.00000000e+00 + 5.24628823e+03 -1.14767258e+04 0.00000000e+00 + 5.21258949e+03 -1.16558841e+04 0.00000000e+00 + 3.93460915e+03 -1.24075819e+04 0.00000000e+00 + 3.97866486e+03 1.30320196e+04 0.00000000e+00 + 3.90342305e+03 1.30758332e+04 0.00000000e+00 + 6.77084995e+03 1.47983372e+04 0.00000000e+00 + 6.64939074e+03 1.45592266e+04 0.00000000e+00 + 6.88228768e+03 1.44437264e+04 0.00000000e+00 + 6.90515333e+03 1.46969108e+04 0.00000000e+00 + 6.42484102e+03 1.15936696e+04 0.00000000e+00 + 4.83065607e+03 1.16891066e+04 0.00000000e+00 + 4.96088576e+03 1.16141707e+04 0.00000000e+00 + 5.33558003e+03 1.17898175e+04 0.00000000e+00 + 3.62805026e+03 1.08473488e+04 0.00000000e+00 + 3.51205385e+03 1.07693888e+04 0.00000000e+00 + 6.35946988e+03 1.39239437e+04 0.00000000e+00 + 6.20258076e+03 1.42239507e+04 0.00000000e+00 + 6.19020849e+03 -1.06654522e+04 0.00000000e+00 + 4.95623134e+03 -1.01636635e+04 0.00000000e+00 + 3.52929876e+03 1.21742497e+04 0.00000000e+00 + 3.51194281e+03 1.21097315e+04 0.00000000e+00 + 3.59116493e+03 1.21549647e+04 0.00000000e+00 + 6.34126896e+03 -1.07657182e+04 0.00000000e+00 + 7.48363388e+03 -1.66595112e+04 0.00000000e+00 + 4.46788220e+03 1.25221075e+04 0.00000000e+00 + 4.39295005e+03 1.26009417e+04 0.00000000e+00 + 7.21396635e+03 1.24501036e+04 0.00000000e+00 + 7.23535627e+03 1.22349046e+04 0.00000000e+00 + 7.45834794e+03 1.22101170e+04 0.00000000e+00 + 7.48095140e+03 1.24760993e+04 0.00000000e+00 + 3.29873638e+03 1.23147584e+04 0.00000000e+00 + 4.52249095e+03 -9.56738032e+03 0.00000000e+00 + 4.60108869e+03 -9.63237967e+03 0.00000000e+00 + 4.28772363e+03 1.30689431e+04 0.00000000e+00 + 4.33237962e+03 1.32162924e+04 0.00000000e+00 + 4.20135052e+03 1.32402300e+04 0.00000000e+00 + 4.16368530e+03 1.31393410e+04 0.00000000e+00 + 5.05888686e+03 -1.15941489e+04 0.00000000e+00 + 7.69913224e+03 -1.71324046e+04 0.00000000e+00 + 7.67324789e+03 -1.71364213e+04 0.00000000e+00 + 5.00902202e+03 1.26880946e+04 0.00000000e+00 + 5.06734649e+03 1.25964222e+04 0.00000000e+00 + 5.13696086e+03 1.26509340e+04 0.00000000e+00 + 7.70509599e+03 1.69889045e+04 0.00000000e+00 + 7.75911353e+03 1.70352528e+04 0.00000000e+00 + 7.28334697e+03 6.51216930e+03 0.00000000e+00 + 3.25052194e+03 -7.76812262e+02 0.00000000e+00 + 2.58461359e+03 -1.05127967e+03 0.00000000e+00 + 6.50186727e+03 1.18506331e+04 0.00000000e+00 + 6.73054195e+03 1.16265433e+04 0.00000000e+00 + 6.65062391e+03 1.18033881e+04 0.00000000e+00 + 6.56924282e+03 -9.56404191e+03 0.00000000e+00 + 3.34345081e+03 -1.21709150e+04 0.00000000e+00 + 3.38911550e+03 -1.21898466e+04 0.00000000e+00 + 3.39788399e+03 -1.21412137e+04 0.00000000e+00 + 3.35152832e+03 -1.21227922e+04 0.00000000e+00 + 8.75114113e+03 -1.76931114e+04 0.00000000e+00 + 8.65264900e+03 -1.76381330e+04 0.00000000e+00 + 5.18500546e+03 1.16381017e+04 0.00000000e+00 + 5.06358799e+03 1.15283831e+04 0.00000000e+00 + 8.64648950e+03 -8.55999399e+03 0.00000000e+00 + 5.56445387e+03 -1.16249121e+04 0.00000000e+00 + 5.73410826e+03 -1.16905001e+04 0.00000000e+00 + 5.77522206e+03 -1.15021556e+04 0.00000000e+00 + 5.60354145e+03 -1.14486180e+04 0.00000000e+00 + 5.52660981e+03 -1.18097142e+04 0.00000000e+00 + 4.16067314e+03 -1.18041398e+04 0.00000000e+00 + 4.31956580e+03 -1.17692476e+04 0.00000000e+00 + 4.32430650e+03 -1.16182967e+04 0.00000000e+00 + 4.71978072e+03 1.29264397e+04 0.00000000e+00 + 4.67132929e+03 1.30629931e+04 0.00000000e+00 + 4.84983251e+03 1.23856373e+04 0.00000000e+00 + 4.97498455e+03 1.23165132e+04 0.00000000e+00 + 5.07378572e+03 1.24250802e+04 0.00000000e+00 + 4.93859369e+03 1.25153517e+04 0.00000000e+00 + 3.68738782e+03 1.24808327e+04 0.00000000e+00 + 3.74812938e+03 1.24588264e+04 0.00000000e+00 + 4.89267413e+03 1.28740804e+04 0.00000000e+00 + 4.95634760e+03 1.27837592e+04 0.00000000e+00 + 7.99760410e+03 1.73869743e+04 0.00000000e+00 + 3.66779050e+03 -1.09377981e+04 0.00000000e+00 + 3.54412298e+03 -1.10090867e+04 0.00000000e+00 + 5.79858752e+03 -9.69154758e+03 0.00000000e+00 + 7.28185255e+03 1.62905522e+04 0.00000000e+00 + 6.80024034e+03 9.36919616e+03 0.00000000e+00 + 4.81449702e+03 -1.21842389e+04 0.00000000e+00 + 6.45902640e+03 -1.05690943e+04 0.00000000e+00 + 6.56541727e+03 -1.03623682e+04 0.00000000e+00 + 4.90829493e+03 9.57992804e+03 0.00000000e+00 + 5.04393696e+03 9.49935059e+03 0.00000000e+00 + 3.26149903e+03 -1.24668710e+04 0.00000000e+00 + 4.36830396e+03 -1.02199740e+04 0.00000000e+00 + 4.32927425e+03 -1.04025039e+04 0.00000000e+00 + 4.48867994e+03 -1.04401383e+04 0.00000000e+00 + 3.85464563e+03 1.03073595e+04 0.00000000e+00 + 3.74416514e+03 -1.04832569e+04 0.00000000e+00 + 8.59492558e+03 1.74518508e+04 0.00000000e+00 + 6.93535767e+03 -1.34218799e+04 0.00000000e+00 + 6.96930466e+03 -1.31567631e+04 0.00000000e+00 + 4.48557469e+03 1.23794787e+04 0.00000000e+00 + 3.55615366e+03 -1.22425822e+04 0.00000000e+00 + 5.55383814e+03 4.22348454e+03 0.00000000e+00 + 5.92124258e+03 4.85763611e+03 0.00000000e+00 + 3.70740573e+03 1.27426325e+04 0.00000000e+00 + 3.64207383e+03 1.27134033e+04 0.00000000e+00 + 4.70413937e+03 1.08483169e+04 0.00000000e+00 + 4.85370293e+03 1.07441596e+04 0.00000000e+00 + 5.00929090e+03 1.09566453e+04 0.00000000e+00 + 4.79109398e+03 1.10184267e+04 0.00000000e+00 + 7.98717491e+03 1.59632920e+04 0.00000000e+00 + 4.33259619e+03 1.26865163e+04 0.00000000e+00 + 4.20972688e+03 -9.07380526e+03 0.00000000e+00 + 4.19727584e+03 -9.22773748e+03 0.00000000e+00 + 4.93750038e+03 -1.29188804e+04 0.00000000e+00 + 5.05965430e+03 -1.30102118e+04 0.00000000e+00 + 5.13742858e+03 -1.28996374e+04 0.00000000e+00 + 5.02166626e+03 -1.28189470e+04 0.00000000e+00 + 6.49354102e+03 -7.93832483e+03 0.00000000e+00 + 6.28527282e+03 -7.68008622e+03 0.00000000e+00 + 6.01156227e+03 -7.84014336e+03 0.00000000e+00 + 6.21069746e+03 -8.09834166e+03 0.00000000e+00 + 3.50409119e+03 1.14755736e+04 0.00000000e+00 + 3.51204417e+03 1.13783019e+04 0.00000000e+00 + 3.60887957e+03 1.13870045e+04 0.00000000e+00 + 3.59187434e+03 1.14877635e+04 0.00000000e+00 + 6.32068011e+03 1.22917070e+04 0.00000000e+00 + 6.42025889e+03 1.23993298e+04 0.00000000e+00 + 6.36714866e+03 1.25400429e+04 0.00000000e+00 + 4.47760005e+03 1.03490805e+04 0.00000000e+00 + 5.84958545e+03 1.16261968e+04 0.00000000e+00 + 6.35559736e+03 1.06436107e+04 0.00000000e+00 + 6.27296152e+03 1.03864794e+04 0.00000000e+00 + 6.52322489e+03 1.02782264e+04 0.00000000e+00 + 6.64603203e+03 1.04929587e+04 0.00000000e+00 + 7.19919155e+03 -1.24321940e+04 0.00000000e+00 + 7.20223229e+03 -1.26469787e+04 0.00000000e+00 + 7.41798362e+03 -1.26005982e+04 0.00000000e+00 + 5.18775628e+03 1.32149424e+04 0.00000000e+00 + 8.73378771e+03 8.58987798e+03 0.00000000e+00 + 3.48038628e+03 1.18240804e+04 0.00000000e+00 + 3.55727775e+03 1.18323412e+04 0.00000000e+00 + 3.54288972e+03 1.18993613e+04 0.00000000e+00 + 6.70631785e+03 6.48690515e+03 0.00000000e+00 + 6.70669730e+03 6.18643404e+03 0.00000000e+00 + 4.78550218e+03 -1.11749971e+04 0.00000000e+00 + 6.78784635e+03 -1.47662212e+04 0.00000000e+00 + 6.98002286e+03 -1.45988663e+04 0.00000000e+00 + 8.27285273e+03 1.11675003e+04 0.00000000e+00 + 8.25108379e+03 1.08448194e+04 0.00000000e+00 + 7.40326037e+03 8.30156897e+03 0.00000000e+00 + 7.57683251e+03 8.01156952e+03 0.00000000e+00 + 7.79632123e+03 -1.28794056e+04 0.00000000e+00 + 7.68668063e+03 -1.27236606e+04 0.00000000e+00 + 7.40037413e+03 -1.28349332e+04 0.00000000e+00 + 7.64999699e+03 -1.30059162e+04 0.00000000e+00 + 5.66573446e+03 1.16004791e+04 0.00000000e+00 + 5.55740667e+03 1.14358192e+04 0.00000000e+00 + 5.40495845e+03 -1.34164002e+04 0.00000000e+00 + 3.77068993e+03 -1.17746604e+04 0.00000000e+00 + 3.89325080e+03 -1.17316144e+04 0.00000000e+00 + 5.32523111e+03 1.29741946e+04 0.00000000e+00 + 2.93892796e+03 -4.10134502e+03 0.00000000e+00 + 3.13602221e+03 -5.04770755e+03 0.00000000e+00 + 4.89153524e+03 1.14914984e+04 0.00000000e+00 + 4.98379496e+03 1.14591545e+04 0.00000000e+00 + 7.43106827e+03 1.20009917e+04 0.00000000e+00 + 7.22858140e+03 1.20457784e+04 0.00000000e+00 + 7.18036731e+03 1.18774118e+04 0.00000000e+00 + 7.37952931e+03 1.18105928e+04 0.00000000e+00 + 3.58772083e+03 1.25503621e+04 0.00000000e+00 + 3.51579390e+03 1.25064225e+04 0.00000000e+00 + 4.85063512e+03 -1.25556127e+04 0.00000000e+00 + 4.79353432e+03 -1.26595756e+04 0.00000000e+00 + 4.90665598e+03 -1.27347524e+04 0.00000000e+00 + 4.98812067e+03 -1.26116774e+04 0.00000000e+00 + 3.75560214e+03 1.28604271e+04 0.00000000e+00 + 3.72972081e+03 1.29611690e+04 0.00000000e+00 + 7.45440299e+03 -6.81237208e+03 0.00000000e+00 + 4.55713244e+03 -1.21504509e+04 0.00000000e+00 + 4.57637038e+03 -1.20144058e+04 0.00000000e+00 + 4.10629275e+03 1.14752345e+04 0.00000000e+00 + 4.98161360e+03 1.06033258e+04 0.00000000e+00 + 5.14072229e+03 1.07548185e+04 0.00000000e+00 + 4.62690020e+03 1.27354591e+04 0.00000000e+00 + 4.48334544e+03 1.27007419e+04 0.00000000e+00 + 3.32678593e+03 1.27648989e+04 0.00000000e+00 + 4.55908043e+03 5.65062224e+03 0.00000000e+00 + 3.93270895e+03 5.38219771e+03 0.00000000e+00 + 1.17824470e+04 -8.69345946e+03 0.00000000e+00 + 1.11854939e+04 -9.67012014e+03 0.00000000e+00 + 4.83591734e+03 1.04571775e+04 0.00000000e+00 + 3.34797083e+03 1.24863494e+04 0.00000000e+00 + 3.37433873e+03 1.24686770e+04 0.00000000e+00 + 3.36969819e+03 1.25240326e+04 0.00000000e+00 + 6.49927081e+03 1.28265383e+04 0.00000000e+00 + 6.71844555e+03 1.28635934e+04 0.00000000e+00 + 1.14735126e+04 -7.53307010e+03 0.00000000e+00 + 1.23723990e+04 -7.61679661e+03 0.00000000e+00 + 3.96925320e+03 1.19806387e+04 0.00000000e+00 + 5.19816494e+03 1.00228365e+04 0.00000000e+00 + 6.59116084e+03 1.35945186e+04 0.00000000e+00 + 6.73543200e+03 1.35854015e+04 0.00000000e+00 + 4.92396550e+03 1.32318313e+04 0.00000000e+00 + 5.02490715e+03 1.31302306e+04 0.00000000e+00 + 5.09936685e+03 1.31804900e+04 0.00000000e+00 + 5.04009680e+03 1.32612784e+04 0.00000000e+00 + 6.56409024e+03 1.08298042e+04 0.00000000e+00 + 6.41499259e+03 1.09729256e+04 0.00000000e+00 + 6.29210540e+03 1.08581287e+04 0.00000000e+00 + 3.71656665e+03 4.16894055e+03 0.00000000e+00 + 4.43337483e+03 -9.60313670e+03 0.00000000e+00 + 1.01904372e+04 -5.86767623e+03 0.00000000e+00 + 3.87530332e+03 -1.21803147e+04 0.00000000e+00 + 7.15845492e+03 1.45564434e+04 0.00000000e+00 + 7.40967946e+03 1.46838814e+04 0.00000000e+00 + 4.90348760e+03 1.26444037e+04 0.00000000e+00 + 4.88513637e+03 1.27301687e+04 0.00000000e+00 + 7.88365211e+03 1.71556052e+04 0.00000000e+00 + 7.84299149e+03 1.72084184e+04 0.00000000e+00 + 7.79944950e+03 1.71772495e+04 0.00000000e+00 + 7.81712247e+03 1.71351984e+04 0.00000000e+00 + 3.30845434e+03 1.20918481e+04 0.00000000e+00 + 3.26149903e+03 1.20858326e+04 0.00000000e+00 + 3.26149903e+03 1.20278267e+04 0.00000000e+00 + 4.17067557e+03 -1.26284626e+04 0.00000000e+00 + 4.28006346e+03 -1.26268247e+04 0.00000000e+00 + 4.28154352e+03 -1.25191448e+04 0.00000000e+00 + 4.20012172e+03 -1.25440950e+04 0.00000000e+00 + 7.87582157e+03 -1.68251551e+04 0.00000000e+00 + 7.31561633e+03 1.65233647e+04 0.00000000e+00 + 7.37715657e+03 1.65117478e+04 0.00000000e+00 + 7.73225537e+03 -1.63493472e+04 0.00000000e+00 + 7.89166428e+03 -1.64758512e+04 0.00000000e+00 + 8.02048811e+03 -1.63389816e+04 0.00000000e+00 + 7.82196460e+03 -1.62350491e+04 0.00000000e+00 + 3.87281358e+03 1.18698044e+04 0.00000000e+00 + 3.87408588e+03 1.19674320e+04 0.00000000e+00 + 8.96682636e+03 6.41822294e+03 0.00000000e+00 + 9.54710609e+03 6.23656803e+03 0.00000000e+00 + 9.48507491e+03 6.83821138e+03 0.00000000e+00 + 9.01568881e+03 6.82663643e+03 0.00000000e+00 + 3.70697563e+03 -1.16398042e+04 0.00000000e+00 + 3.68369827e+03 -1.17437719e+04 0.00000000e+00 + 3.47810298e+03 1.22460454e+04 0.00000000e+00 + 3.53247893e+03 1.22395374e+04 0.00000000e+00 + 4.82474024e+03 -1.28379170e+04 0.00000000e+00 + 6.69877738e+03 5.75980915e+03 0.00000000e+00 + 6.31406320e+03 5.37433483e+03 0.00000000e+00 + 4.18908963e+03 -9.49661562e+03 0.00000000e+00 + 4.17435433e+03 -9.58720109e+03 0.00000000e+00 + 4.28419216e+03 -9.51722243e+03 0.00000000e+00 + 3.32095279e+03 -1.23913289e+04 0.00000000e+00 + 3.32820603e+03 -1.24159436e+04 0.00000000e+00 + 5.00287194e+03 9.22627875e+03 0.00000000e+00 + 5.11083986e+03 9.33896695e+03 0.00000000e+00 + 7.64964264e+03 1.19458845e+04 0.00000000e+00 + 7.59701701e+03 1.17462904e+04 0.00000000e+00 + 8.40914251e+03 -1.76594261e+04 0.00000000e+00 + 8.38751193e+03 -1.77421969e+04 0.00000000e+00 + 7.76867211e+03 -1.72131142e+04 0.00000000e+00 + 7.74604835e+03 -1.72465110e+04 0.00000000e+00 + 7.78241612e+03 -1.72828788e+04 0.00000000e+00 + 3.50830674e+03 1.27854529e+04 0.00000000e+00 + 3.42475651e+03 1.27471210e+04 0.00000000e+00 + 3.47595130e+03 1.27460628e+04 0.00000000e+00 + 8.54566067e+03 -1.75819117e+04 0.00000000e+00 + 4.95918651e+03 -9.74773265e+03 0.00000000e+00 + 4.82805570e+03 -9.62637621e+03 0.00000000e+00 + 7.77885667e+03 -1.18576277e+04 0.00000000e+00 + 8.05960171e+03 1.74441267e+04 0.00000000e+00 + 4.45934335e+03 -1.17392730e+04 0.00000000e+00 + 3.50842286e+03 -1.16101378e+04 0.00000000e+00 + 3.51824884e+03 -1.15017694e+04 0.00000000e+00 + 9.79347496e+03 -7.79881995e+03 0.00000000e+00 + 1.06768114e+04 -7.59399025e+03 0.00000000e+00 + 8.15121428e+03 -1.53391503e+04 0.00000000e+00 + 7.91888279e+03 -1.54166350e+04 0.00000000e+00 + 7.97753982e+03 -1.56485396e+04 0.00000000e+00 + 5.16411559e+03 -1.26311805e+04 0.00000000e+00 + 5.08762797e+03 -1.25767096e+04 0.00000000e+00 + 5.09882849e+03 -1.27219244e+04 0.00000000e+00 + 7.93917558e+03 -1.27561162e+04 0.00000000e+00 + 7.83658462e+03 -1.26658913e+04 0.00000000e+00 + 7.83260728e+03 -6.90532860e+03 0.00000000e+00 + 8.01364929e+03 1.54167350e+04 0.00000000e+00 + 8.15124465e+03 1.53392130e+04 0.00000000e+00 + 3.37727378e+03 1.22337799e+04 0.00000000e+00 + 8.82988576e+03 1.78754478e+04 0.00000000e+00 + 8.93657939e+03 1.79114879e+04 0.00000000e+00 + 8.90972216e+03 1.80112878e+04 0.00000000e+00 + 8.82144406e+03 1.80070941e+04 0.00000000e+00 + 4.34016901e+03 9.68480277e+03 0.00000000e+00 + 4.16015029e+03 9.66498125e+03 0.00000000e+00 + 4.24906533e+03 9.63293860e+03 0.00000000e+00 + 4.62129241e+03 1.31981292e+04 0.00000000e+00 + 8.28458423e+03 -1.77850469e+04 0.00000000e+00 + 3.40112400e+03 1.25611594e+04 0.00000000e+00 + 3.47591144e+03 1.25598934e+04 0.00000000e+00 + 8.28493702e+03 1.77853997e+04 0.00000000e+00 + 8.36916625e+03 1.77197687e+04 0.00000000e+00 + 4.59628754e+03 1.04610984e+04 0.00000000e+00 + 4.47897585e+03 1.05665391e+04 0.00000000e+00 + 4.36420798e+03 1.04382127e+04 0.00000000e+00 + 5.31000275e+03 1.08881961e+04 0.00000000e+00 + 5.23434407e+03 1.10692129e+04 0.00000000e+00 + 1.17824452e+04 8.69346259e+03 0.00000000e+00 + 4.81211178e+03 1.25256747e+04 0.00000000e+00 + 4.74255478e+03 1.24609223e+04 0.00000000e+00 + 3.41013532e+03 -1.20947632e+04 0.00000000e+00 + 3.44584155e+03 -1.21138277e+04 0.00000000e+00 + 3.51816651e+03 1.26260551e+04 0.00000000e+00 + 3.99694842e+03 -1.17963063e+04 0.00000000e+00 + 5.42877520e+03 1.29680283e+04 0.00000000e+00 + 3.83281441e+03 -1.24383587e+04 0.00000000e+00 + 4.55183806e+03 1.24483552e+04 0.00000000e+00 + 4.64276671e+03 1.25699773e+04 0.00000000e+00 + 4.52850848e+03 1.25949760e+04 0.00000000e+00 + 6.02765390e+03 9.66920179e+03 0.00000000e+00 + 6.45124552e+03 1.21589421e+04 0.00000000e+00 + 6.58748086e+03 1.23573238e+04 0.00000000e+00 + 6.92691686e+03 9.13223108e+03 0.00000000e+00 + 6.57598494e+03 -1.19335649e+04 0.00000000e+00 + 6.67715799e+03 -1.21503818e+04 0.00000000e+00 + 6.83434482e+03 -1.19780486e+04 0.00000000e+00 + 6.71510380e+03 -1.18796268e+04 0.00000000e+00 + 6.27550691e+03 -9.30124847e+03 0.00000000e+00 + 6.56894194e+03 -9.23405123e+03 0.00000000e+00 + 5.04009827e+03 -1.32612788e+04 0.00000000e+00 + 5.12782261e+03 -1.32898347e+04 0.00000000e+00 + 5.18157696e+03 -1.32179202e+04 0.00000000e+00 + 5.09466894e+03 -1.31870026e+04 0.00000000e+00 + 3.13602182e+03 5.04770589e+03 0.00000000e+00 + 2.93892777e+03 4.10134394e+03 0.00000000e+00 + 7.68659012e+03 1.21535912e+04 0.00000000e+00 + 7.73156994e+03 1.23600514e+04 0.00000000e+00 + 6.08458571e+03 8.78644846e+03 0.00000000e+00 + 3.74506101e+03 1.12400930e+04 0.00000000e+00 + 3.81355581e+03 1.11468988e+04 0.00000000e+00 + 7.04978712e+03 8.85304858e+03 0.00000000e+00 + 7.05886694e+03 1.33403758e+04 0.00000000e+00 + 6.98027430e+03 1.35203272e+04 0.00000000e+00 + 8.76897285e+03 -1.72850651e+04 0.00000000e+00 + 5.08988736e+03 -1.24851431e+04 0.00000000e+00 + 4.98393863e+03 -1.24716941e+04 0.00000000e+00 + 3.98577009e+03 1.07291341e+04 0.00000000e+00 + 5.20889911e+03 1.03002083e+04 0.00000000e+00 + 5.09230559e+03 1.04483027e+04 0.00000000e+00 + 6.74539225e+03 -1.16968662e+04 0.00000000e+00 + 6.61295858e+03 -1.14749231e+04 0.00000000e+00 + 6.40865839e+03 -1.15603588e+04 0.00000000e+00 + 6.49832018e+03 -1.17486263e+04 0.00000000e+00 + 5.58539639e+03 -1.23594233e+04 0.00000000e+00 + 5.73113284e+03 -1.22788354e+04 0.00000000e+00 + 5.65343904e+03 -1.20959349e+04 0.00000000e+00 + 5.55343218e+03 -1.21995895e+04 0.00000000e+00 + 6.89001881e+03 -1.22543483e+04 0.00000000e+00 + 8.89849917e+03 -8.94761070e+03 0.00000000e+00 + 6.27148459e+03 1.11110986e+04 0.00000000e+00 + 6.40541614e+03 1.12730989e+04 0.00000000e+00 + 6.32696974e+03 -1.40063130e+04 0.00000000e+00 + 4.57462957e+03 1.18754541e+04 0.00000000e+00 + 4.47895714e+03 1.19628597e+04 0.00000000e+00 + 5.86235585e+03 -1.19383184e+04 0.00000000e+00 + 5.69363026e+03 -1.18791404e+04 0.00000000e+00 + 5.83141188e+03 -1.21101697e+04 0.00000000e+00 + 3.77835355e+03 -1.26624714e+04 0.00000000e+00 + 3.85712126e+03 -1.26156668e+04 0.00000000e+00 + 3.47382852e+03 1.21916948e+04 0.00000000e+00 + 3.43167898e+03 1.22531675e+04 0.00000000e+00 + 3.42609653e+03 1.22089910e+04 0.00000000e+00 + 5.85249211e+03 -1.30885127e+04 0.00000000e+00 + 6.35078345e+03 -1.10987897e+04 0.00000000e+00 + 4.43518113e+03 8.59850281e+03 0.00000000e+00 + 4.74940450e+03 8.40091036e+03 0.00000000e+00 + 4.88068391e+03 8.67047636e+03 0.00000000e+00 + 4.66823020e+03 8.82814351e+03 0.00000000e+00 + 3.69864170e+03 -1.14103722e+04 0.00000000e+00 + 3.77053037e+03 -1.14237380e+04 0.00000000e+00 + 6.34938044e+03 1.44622833e+04 0.00000000e+00 + 6.49929005e+03 1.42416591e+04 0.00000000e+00 + 8.62521449e+03 1.77281879e+04 0.00000000e+00 + 8.56720166e+03 1.76281454e+04 0.00000000e+00 + 8.66346262e+03 1.75499960e+04 0.00000000e+00 + 8.72750840e+03 1.76589840e+04 0.00000000e+00 + 6.72868854e+03 -8.25258235e+03 0.00000000e+00 + 6.34938191e+03 -1.44622858e+04 0.00000000e+00 + 6.20258232e+03 -1.42239531e+04 0.00000000e+00 + 3.94551419e+03 1.17541392e+04 0.00000000e+00 + 5.29146889e+03 -9.74984671e+03 0.00000000e+00 + 5.34733094e+03 -1.00055650e+04 0.00000000e+00 + 5.57010711e+03 -9.96178912e+03 0.00000000e+00 + 5.56565971e+03 -9.72795116e+03 0.00000000e+00 + 6.60319909e+03 1.20357351e+04 0.00000000e+00 + 6.73337320e+03 1.21853775e+04 0.00000000e+00 + 4.59708084e+03 1.07000090e+04 0.00000000e+00 + 4.07628006e+03 9.63532915e+03 0.00000000e+00 + 3.68393514e+03 1.15217613e+04 0.00000000e+00 + 3.83596087e+03 1.28952476e+04 0.00000000e+00 + 3.92804486e+03 1.29425061e+04 0.00000000e+00 + 3.85229240e+03 1.30077923e+04 0.00000000e+00 + 3.81091825e+03 1.29555437e+04 0.00000000e+00 + 6.48419269e+03 -1.47045484e+04 0.00000000e+00 + 6.48419151e+03 1.47045460e+04 0.00000000e+00 + 3.40957367e+03 -1.26842187e+04 0.00000000e+00 + 6.06805693e+03 1.06914398e+04 0.00000000e+00 + 3.87924387e+03 -1.28811757e+04 0.00000000e+00 + 3.99316507e+03 -1.29524503e+04 0.00000000e+00 + 3.98028573e+03 -1.28477681e+04 0.00000000e+00 + 6.50742505e+03 1.14050816e+04 0.00000000e+00 + 6.49522712e+03 -1.12845634e+04 0.00000000e+00 + 5.43688256e+03 -7.71433301e+03 0.00000000e+00 + 5.26605490e+03 -8.09764929e+03 0.00000000e+00 + 5.53921541e+03 -8.27618700e+03 0.00000000e+00 + 5.74648620e+03 -8.03879940e+03 0.00000000e+00 + 7.38384213e+03 -1.63873785e+04 0.00000000e+00 + 3.40430239e+03 1.18227554e+04 0.00000000e+00 + 5.23427911e+03 3.49238975e+03 0.00000000e+00 + 5.55383755e+03 -4.22348346e+03 0.00000000e+00 + 5.23427872e+03 -3.49238877e+03 0.00000000e+00 + 8.70576251e+03 7.70429353e+03 0.00000000e+00 + 8.91695123e+03 7.27049960e+03 0.00000000e+00 + 9.33748404e+03 7.43962170e+03 0.00000000e+00 + 9.10133666e+03 8.00465998e+03 0.00000000e+00 + 3.83219227e+03 1.24311568e+04 0.00000000e+00 + 7.34238625e+03 1.04734958e+04 0.00000000e+00 + 5.90074541e+03 1.19411236e+04 0.00000000e+00 + 6.54919465e+03 -7.47567360e+03 0.00000000e+00 + 6.56490175e+03 -7.14763728e+03 0.00000000e+00 + 6.31030061e+03 -7.13190019e+03 0.00000000e+00 + 6.31419110e+03 -7.34045967e+03 0.00000000e+00 + 5.55358891e+03 1.25826864e+04 0.00000000e+00 + 3.89707427e+03 -1.11500073e+04 0.00000000e+00 + 3.90371288e+03 -1.12916448e+04 0.00000000e+00 + 7.98998214e+03 1.14488095e+04 0.00000000e+00 + 7.96441149e+03 1.11998298e+04 0.00000000e+00 + 8.25268478e+03 1.14561813e+04 0.00000000e+00 + 6.82175869e+03 -6.87596336e+03 0.00000000e+00 + 4.78367715e+03 1.27744488e+04 0.00000000e+00 + 3.90528144e+03 1.24756981e+04 0.00000000e+00 + 7.16082348e+03 -1.22150334e+04 0.00000000e+00 + 6.98966990e+03 -1.20961641e+04 0.00000000e+00 + 7.01700376e+03 -1.23150379e+04 0.00000000e+00 + 6.60866931e+03 1.11326442e+04 0.00000000e+00 + 8.81180314e+03 1.19561433e+04 0.00000000e+00 + 9.02871576e+03 1.18124678e+04 0.00000000e+00 + 3.56735693e+03 1.15777121e+04 0.00000000e+00 + 4.70721058e+03 -1.20208627e+04 0.00000000e+00 + 5.13290600e+03 1.14096097e+04 0.00000000e+00 + 5.28271875e+03 1.15024396e+04 0.00000000e+00 + 4.07627996e+03 -9.63533023e+03 0.00000000e+00 + 4.05439530e+03 -9.76804435e+03 0.00000000e+00 + 4.14951552e+03 -9.65728997e+03 0.00000000e+00 + 8.57822162e+03 -1.74196545e+04 0.00000000e+00 + 3.44486197e+03 -1.21543905e+04 0.00000000e+00 + 3.49942694e+03 -1.21610535e+04 0.00000000e+00 + 7.52460851e+03 -9.28154748e+03 0.00000000e+00 + 6.04762061e+03 1.28476289e+04 0.00000000e+00 + 5.93378340e+03 1.28870941e+04 0.00000000e+00 + 7.19866832e+03 -1.28881682e+04 0.00000000e+00 + 3.33403766e+03 1.17369739e+04 0.00000000e+00 + 3.26149903e+03 1.17387992e+04 0.00000000e+00 + 3.26149903e+03 1.16541279e+04 0.00000000e+00 + 7.59909184e+03 1.70627651e+04 0.00000000e+00 + 7.61733030e+03 1.70828655e+04 0.00000000e+00 + 6.90153613e+03 1.18071862e+04 0.00000000e+00 + 6.75010184e+03 1.19206060e+04 0.00000000e+00 + 3.42904785e+03 -1.14193169e+04 0.00000000e+00 + 3.51621696e+03 -1.13987667e+04 0.00000000e+00 + 5.44915687e+03 -1.13824082e+04 0.00000000e+00 + 7.42987905e+03 1.67361579e+04 0.00000000e+00 + 4.88004530e+03 -1.24502256e+04 0.00000000e+00 + 4.78794081e+03 1.26176139e+04 0.00000000e+00 + 7.85977218e+03 -1.10323101e+04 0.00000000e+00 + 8.50880728e+03 -1.12106422e+04 0.00000000e+00 + 8.36077233e+03 -1.08620652e+04 0.00000000e+00 + 4.66370860e+03 -1.22982842e+04 0.00000000e+00 + 4.78973008e+03 -1.23141873e+04 0.00000000e+00 + 4.68402136e+03 -1.21632316e+04 0.00000000e+00 + 3.33410907e+03 1.23691768e+04 0.00000000e+00 + 6.96083341e+03 -1.18311311e+04 0.00000000e+00 + 7.11172915e+03 -1.19591170e+04 0.00000000e+00 + 7.11246465e+03 -1.16849212e+04 0.00000000e+00 + 3.78415361e+03 1.27720839e+04 0.00000000e+00 + 3.42245914e+03 -1.25188464e+04 0.00000000e+00 + 3.39570169e+03 -1.24786115e+04 0.00000000e+00 + 6.21482171e+03 -1.27654655e+04 0.00000000e+00 + 6.05481076e+03 -1.27538036e+04 0.00000000e+00 + 6.03507442e+03 -1.29345087e+04 0.00000000e+00 + 6.19677836e+03 -1.29624314e+04 0.00000000e+00 + 3.48082624e+03 -1.26945511e+04 0.00000000e+00 + 3.54395331e+03 -1.26769896e+04 0.00000000e+00 + 7.46089921e+03 -1.33702626e+04 0.00000000e+00 + 7.37501439e+03 -1.36063239e+04 0.00000000e+00 + 7.66919934e+03 -1.34790058e+04 0.00000000e+00 + 4.79963260e+03 -1.09730086e+04 0.00000000e+00 + 8.05341071e+03 1.26222382e+04 0.00000000e+00 + 7.90657315e+03 1.27100452e+04 0.00000000e+00 + 7.80844161e+03 1.25458836e+04 0.00000000e+00 + 7.97629528e+03 1.24597015e+04 0.00000000e+00 + 4.79737580e+03 1.30932478e+04 0.00000000e+00 + 4.77670715e+03 1.32084349e+04 0.00000000e+00 + 6.67286259e+03 1.09541870e+04 0.00000000e+00 + 4.22094697e+03 -1.01955358e+04 0.00000000e+00 + 4.18592154e+03 -1.03552949e+04 0.00000000e+00 + 4.65644796e+03 -1.24309727e+04 0.00000000e+00 + 4.52532412e+03 -1.24497356e+04 0.00000000e+00 + 4.52632439e+03 -1.25825795e+04 0.00000000e+00 + 4.67537835e+03 -1.25773767e+04 0.00000000e+00 + 7.21046782e+03 -1.20526526e+04 0.00000000e+00 + 4.95484600e+03 -1.11745289e+04 0.00000000e+00 + 8.33900888e+03 7.42919272e+03 0.00000000e+00 + 6.38762524e+03 1.35744830e+04 0.00000000e+00 + 6.25262663e+03 1.27662614e+04 0.00000000e+00 + 7.15566928e+03 1.59825802e+04 0.00000000e+00 + 7.10170359e+03 1.59076224e+04 0.00000000e+00 + 7.09559572e+03 1.57554723e+04 0.00000000e+00 + 7.21839957e+03 1.58173493e+04 0.00000000e+00 + 6.86914459e+03 1.20636174e+04 0.00000000e+00 + 5.70911255e+03 1.24503987e+04 0.00000000e+00 + 5.83450739e+03 1.23283063e+04 0.00000000e+00 + 6.94697458e+03 8.33651248e+03 0.00000000e+00 + 7.21254975e+03 8.57390754e+03 0.00000000e+00 + 5.08914028e+03 -1.14167090e+04 0.00000000e+00 + 6.00991146e+03 -9.38019812e+03 0.00000000e+00 + 5.77669155e+03 -9.45414481e+03 0.00000000e+00 + 3.88070546e+03 -1.24846684e+04 0.00000000e+00 + 5.48281649e+03 1.30996753e+04 0.00000000e+00 + 5.50511845e+03 1.30249768e+04 0.00000000e+00 + 3.78860066e+03 7.50809525e+03 0.00000000e+00 + 4.21983028e+03 7.27042506e+03 0.00000000e+00 + 3.46081874e+03 1.21379493e+04 0.00000000e+00 + 1.08320556e+04 -5.28569023e+03 0.00000000e+00 + 6.67858369e+03 1.13737564e+04 0.00000000e+00 + 3.89895956e+03 -1.26905349e+04 0.00000000e+00 + 3.94092959e+03 -1.27619445e+04 0.00000000e+00 + 4.01666799e+03 -1.26942120e+04 0.00000000e+00 + 3.95899478e+03 -1.26538264e+04 0.00000000e+00 + 4.28613104e+03 1.27789192e+04 0.00000000e+00 + 5.19917221e+03 -1.10525984e+04 0.00000000e+00 + 5.36646850e+03 -1.11431647e+04 0.00000000e+00 + 7.40772768e+03 -1.64425362e+04 0.00000000e+00 + 7.33107601e+03 -1.64772887e+04 0.00000000e+00 + 5.29407339e+03 -1.13036669e+04 0.00000000e+00 + 5.20474027e+03 -1.25228715e+04 0.00000000e+00 + 8.13423402e+03 -1.65388113e+04 0.00000000e+00 + 8.20439144e+03 -1.67033245e+04 0.00000000e+00 + 8.28939078e+03 -1.64620735e+04 0.00000000e+00 + 3.57832579e+03 -1.13038475e+04 0.00000000e+00 + 4.63470564e+03 -1.06373391e+04 0.00000000e+00 + 4.41595813e+03 -1.06861094e+04 0.00000000e+00 + 4.45605846e+03 -1.09109364e+04 0.00000000e+00 + 4.63120000e+03 -1.08378980e+04 0.00000000e+00 + 7.26103518e+03 -1.65642694e+04 0.00000000e+00 + 7.25319433e+03 -1.66154018e+04 0.00000000e+00 + 5.80083952e+03 -1.25893804e+04 0.00000000e+00 + 5.71985894e+03 -1.25053917e+04 0.00000000e+00 + 5.20832296e+03 -1.33203792e+04 0.00000000e+00 + 5.29412027e+03 -1.33580007e+04 0.00000000e+00 + 1.14216276e+04 -4.48074120e+03 0.00000000e+00 + 3.48751166e+03 -1.17074529e+04 0.00000000e+00 + 4.72323030e+03 -1.27607906e+04 0.00000000e+00 + 4.62656567e+03 -1.27099040e+04 0.00000000e+00 + 3.26149903e+03 1.18943040e+04 0.00000000e+00 + 3.26149903e+03 1.18192259e+04 0.00000000e+00 + 3.33092882e+03 1.18199710e+04 0.00000000e+00 + 8.68352504e+03 1.78262053e+04 0.00000000e+00 + 4.34892890e+03 1.16646792e+04 0.00000000e+00 + 5.78629530e+03 1.02951956e+04 0.00000000e+00 + 5.63940975e+03 1.04362959e+04 0.00000000e+00 + 6.99820225e+03 -1.26644600e+04 0.00000000e+00 + 7.01163946e+03 -1.24579076e+04 0.00000000e+00 + 3.42079553e+03 1.13816658e+04 0.00000000e+00 + 7.99965687e+03 -1.66062490e+04 0.00000000e+00 + 7.13309362e+03 8.06960657e+03 0.00000000e+00 + 6.39359297e+03 -1.27911551e+04 0.00000000e+00 + 7.01297084e+03 1.19597826e+04 0.00000000e+00 + 7.64370434e+03 1.26650673e+04 0.00000000e+00 + 6.79220039e+03 -7.76913291e+03 0.00000000e+00 + 4.77412819e+03 -1.24307735e+04 0.00000000e+00 + 4.77003594e+03 -1.25176976e+04 0.00000000e+00 + 4.49982108e+03 -9.71229306e+03 0.00000000e+00 + 5.37299285e+03 -1.24527211e+04 0.00000000e+00 + 7.41560256e+03 7.54507275e+03 0.00000000e+00 + 7.29131026e+03 7.80685172e+03 0.00000000e+00 + 7.41547390e+03 -1.66865948e+04 0.00000000e+00 + 6.99841908e+03 1.24415137e+04 0.00000000e+00 + 6.96855296e+03 1.26515393e+04 0.00000000e+00 + 6.75781926e+03 1.26331789e+04 0.00000000e+00 + 6.80175681e+03 1.24244086e+04 0.00000000e+00 + 4.99411873e+03 -1.03393788e+04 0.00000000e+00 + 1.01904365e+04 5.86767672e+03 0.00000000e+00 + 1.08055356e+04 6.37699374e+03 0.00000000e+00 + 7.80492748e+03 1.06210931e+04 0.00000000e+00 + 4.87701709e+03 -9.24378655e+03 0.00000000e+00 + 4.70547925e+03 -9.14347162e+03 0.00000000e+00 + 4.25151302e+03 1.15281442e+04 0.00000000e+00 + 4.69282893e+03 1.17757207e+04 0.00000000e+00 + 7.77142717e+03 1.70948311e+04 0.00000000e+00 + 3.97642401e+03 -1.30539600e+04 0.00000000e+00 + 6.14662237e+03 8.26490834e+03 0.00000000e+00 + 7.81005151e+03 -1.65772323e+04 0.00000000e+00 + 7.89817975e+03 -1.66750248e+04 0.00000000e+00 + 5.77539711e+03 1.05841496e+04 0.00000000e+00 + 5.64031470e+03 1.06999890e+04 0.00000000e+00 + 5.50862710e+03 1.05750483e+04 0.00000000e+00 + 4.97524900e+03 -2.68524191e+03 0.00000000e+00 + 4.78583024e+03 -1.82150206e+03 0.00000000e+00 + 6.94162182e+03 1.28757640e+04 0.00000000e+00 + 7.23667286e+03 -1.31938764e+04 0.00000000e+00 + 7.40432890e+03 -1.30713746e+04 0.00000000e+00 + 5.79506742e+03 1.00053451e+04 0.00000000e+00 + 8.49423878e+03 1.76765395e+04 0.00000000e+00 + 4.83683839e+03 1.29779303e+04 0.00000000e+00 + 7.53591956e+03 1.69895569e+04 0.00000000e+00 + 7.55894914e+03 1.70167873e+04 0.00000000e+00 + 1.00437679e+04 -9.85186471e+03 0.00000000e+00 + 7.66490637e+03 -1.61368236e+04 0.00000000e+00 + 3.73851626e+03 -1.15295773e+04 0.00000000e+00 + 3.73399978e+03 1.22320071e+04 0.00000000e+00 + 3.65939275e+03 1.22302734e+04 0.00000000e+00 + 4.94025806e+03 -9.49427537e+03 0.00000000e+00 + 4.92396658e+03 -1.32318315e+04 0.00000000e+00 + 5.01938178e+03 -1.31423180e+04 0.00000000e+00 + 7.41218436e+03 1.69126470e+04 0.00000000e+00 + 7.41217927e+03 -1.69126419e+04 0.00000000e+00 + 7.44575367e+03 -1.68753543e+04 0.00000000e+00 + 7.22733037e+03 -1.06228099e+04 0.00000000e+00 + 7.63253529e+03 -1.70693482e+04 0.00000000e+00 + 7.65568808e+03 -1.70393512e+04 0.00000000e+00 + 7.62490028e+03 -1.70486308e+04 0.00000000e+00 + 5.44303251e+03 1.16155179e+04 0.00000000e+00 + 5.35177686e+03 1.13389303e+04 0.00000000e+00 + 4.47100162e+03 -1.14259186e+04 0.00000000e+00 + 4.46513817e+03 -1.15851332e+04 0.00000000e+00 + 4.85693365e+03 1.13558317e+04 0.00000000e+00 + 6.98597899e+03 -1.28994566e+04 0.00000000e+00 + 7.03514590e+03 -1.42187777e+04 0.00000000e+00 + 7.48392813e+03 -1.69843908e+04 0.00000000e+00 + 7.47862708e+03 -1.69130290e+04 0.00000000e+00 + 7.44970737e+03 -1.69501700e+04 0.00000000e+00 + 5.89557830e+03 8.81744510e+03 0.00000000e+00 + 8.95217620e+03 -1.77696035e+04 0.00000000e+00 + 8.84830674e+03 -1.77310573e+04 0.00000000e+00 + 8.82741093e+03 -1.78566415e+04 0.00000000e+00 + 8.93208195e+03 -1.78929169e+04 0.00000000e+00 + 4.00355098e+03 1.11447522e+04 0.00000000e+00 + 4.10943553e+03 1.12498672e+04 0.00000000e+00 + 5.39982630e+03 1.07229757e+04 0.00000000e+00 + 5.55233503e+03 1.08394654e+04 0.00000000e+00 + 5.24613569e+03 1.05902462e+04 0.00000000e+00 + 3.33699838e+03 1.12412404e+04 0.00000000e+00 + 6.81108774e+03 1.53747103e+04 0.00000000e+00 + 6.71582866e+03 1.51679223e+04 0.00000000e+00 + 7.50222045e+03 1.28152584e+04 0.00000000e+00 + 7.35464316e+03 1.27062544e+04 0.00000000e+00 + 7.08563237e+03 1.38920305e+04 0.00000000e+00 + 6.99760264e+03 1.41615867e+04 0.00000000e+00 + 3.89573069e+03 1.10467905e+04 0.00000000e+00 + 4.40092419e+03 -1.27208401e+04 0.00000000e+00 + 4.27260328e+03 -1.27503525e+04 0.00000000e+00 + 3.26149903e+03 -1.20279375e+04 0.00000000e+00 + 3.26149903e+03 -1.20859456e+04 0.00000000e+00 + 3.30587311e+03 -1.21031734e+04 0.00000000e+00 + 3.31131607e+03 -1.20501319e+04 0.00000000e+00 + 8.18467948e+03 -9.73453702e+03 0.00000000e+00 + 5.16423812e+03 1.25286018e+04 0.00000000e+00 + 3.87307172e+03 1.08382359e+04 0.00000000e+00 + 4.72319364e+03 1.05905344e+04 0.00000000e+00 + 4.19949474e+03 -1.30480386e+04 0.00000000e+00 + 3.86462934e+03 -1.33408607e+04 0.00000000e+00 + 3.91213058e+03 -1.33236570e+04 0.00000000e+00 + 3.84395884e+03 -1.32833138e+04 0.00000000e+00 + 3.97026310e+03 -1.17011749e+04 0.00000000e+00 + 7.63600620e+03 1.61249401e+04 0.00000000e+00 + 5.29667825e+03 1.24779667e+04 0.00000000e+00 + 5.44693357e+03 1.24153601e+04 0.00000000e+00 + 5.00653690e+03 1.21366338e+04 0.00000000e+00 + 5.10755728e+03 1.22474990e+04 0.00000000e+00 + 4.71767270e+03 -1.29503378e+04 0.00000000e+00 + 4.85532361e+03 -1.30153032e+04 0.00000000e+00 + 8.17448524e+03 -1.70226931e+04 0.00000000e+00 + 3.62601327e+03 -1.06386168e+04 0.00000000e+00 + 4.88828754e+03 1.31152733e+04 0.00000000e+00 + 3.26149903e+03 1.22160654e+04 0.00000000e+00 + 3.28308142e+03 1.22230174e+04 0.00000000e+00 + 3.27951773e+03 1.22503314e+04 0.00000000e+00 + 3.26149903e+03 1.22448611e+04 0.00000000e+00 + 7.68612405e+03 -1.16361745e+04 0.00000000e+00 + 5.36170641e+03 1.04402004e+04 0.00000000e+00 + 3.70649253e+03 1.10712388e+04 0.00000000e+00 + 3.77928482e+03 1.09536322e+04 0.00000000e+00 + 8.49489270e+03 -1.73095904e+04 0.00000000e+00 + 6.84966812e+03 -7.43371006e+03 0.00000000e+00 + 6.81308130e+03 -7.13995405e+03 0.00000000e+00 + 7.08791999e+03 1.20685465e+04 0.00000000e+00 + 3.26149903e+03 -1.18193010e+04 0.00000000e+00 + 3.33503577e+03 -1.17897854e+04 0.00000000e+00 + 3.26149903e+03 -1.17388760e+04 0.00000000e+00 + 4.24983401e+03 -1.05749188e+04 0.00000000e+00 + 4.12799326e+03 -1.04969606e+04 0.00000000e+00 + 4.04797921e+03 -1.31027648e+03 0.00000000e+00 + 4.67038708e+03 -9.19990033e+02 0.00000000e+00 + 4.63123479e+03 4.89710000e-04 0.00000000e+00 + 3.92726736e+03 -4.02168857e+02 0.00000000e+00 + 3.65304356e+03 1.25394350e+04 0.00000000e+00 + 4.81155154e+03 -1.07774557e+04 0.00000000e+00 + 7.08790097e+03 1.17062874e+04 0.00000000e+00 + 1.00418346e+04 6.90118777e+03 0.00000000e+00 + 3.59232869e+03 1.22334701e+04 0.00000000e+00 + 6.68272816e+03 -8.53802590e+03 0.00000000e+00 + 7.51257377e+03 1.64787091e+04 0.00000000e+00 + 7.43234686e+03 1.65286390e+04 0.00000000e+00 + 4.47244876e+03 9.55572384e+03 0.00000000e+00 + 4.44983436e+03 9.65685443e+03 0.00000000e+00 + 2.65861632e+03 2.09201911e+03 0.00000000e+00 + 7.68303201e+03 1.33043629e+04 0.00000000e+00 + 7.81531008e+03 1.31094581e+04 0.00000000e+00 + 3.49524664e+03 1.27020185e+04 0.00000000e+00 + 3.48487475e+03 1.17325250e+04 0.00000000e+00 + 3.40796483e+03 1.17361421e+04 0.00000000e+00 + 4.00372912e+03 6.05852704e+03 0.00000000e+00 + 3.35769092e+03 5.93903743e+03 0.00000000e+00 + 7.44846055e+03 9.47205021e+03 0.00000000e+00 + 7.56756688e+03 9.16698325e+03 0.00000000e+00 + 3.37623213e+03 -1.24385467e+04 0.00000000e+00 + 3.41984112e+03 -1.24190507e+04 0.00000000e+00 + 7.82634861e+03 -1.73268113e+04 0.00000000e+00 + 4.55876794e+03 1.09240555e+04 0.00000000e+00 + 7.24458114e+03 1.64183494e+04 0.00000000e+00 + 7.22733513e+03 1.63491730e+04 0.00000000e+00 + 5.78665432e+03 -8.47466811e+03 0.00000000e+00 + 3.44155220e+03 -1.27471434e+04 0.00000000e+00 + 3.38937692e+03 -1.27342683e+04 0.00000000e+00 + 4.81690864e+03 -1.05842490e+04 0.00000000e+00 + 8.04665868e+03 -1.24010046e+04 0.00000000e+00 + 3.26149903e+03 1.14745835e+04 0.00000000e+00 + 3.33958378e+03 1.14751720e+04 0.00000000e+00 + 3.26149903e+03 1.15656192e+04 0.00000000e+00 + 4.29466429e+03 -1.09968949e+04 0.00000000e+00 + 4.23564315e+03 -1.08460662e+04 0.00000000e+00 + 5.71089503e+03 1.09146810e+04 0.00000000e+00 + 7.92894998e+03 -1.74294126e+04 0.00000000e+00 + 7.87459891e+03 -1.73750616e+04 0.00000000e+00 + 3.26149903e+03 -1.16541925e+04 0.00000000e+00 + 7.70854470e+03 -1.65171137e+04 0.00000000e+00 + 8.72711942e+03 6.81333498e+03 0.00000000e+00 + 8.59928706e+03 7.07419611e+03 0.00000000e+00 + 8.27282555e+03 -1.26133443e+04 0.00000000e+00 + 5.73333761e+03 1.07881718e+04 0.00000000e+00 + 8.68708200e+03 -1.81875446e+04 0.00000000e+00 + 8.73079412e+03 -1.80907202e+04 0.00000000e+00 + 4.99516767e+03 1.13590307e+04 0.00000000e+00 + 3.44187965e+03 1.24010289e+04 0.00000000e+00 + 4.40032786e+03 -1.26023770e+04 0.00000000e+00 + 4.39681354e+03 -1.24828237e+04 0.00000000e+00 + 3.28980392e+03 1.21915956e+04 0.00000000e+00 + 3.26149903e+03 1.21798764e+04 0.00000000e+00 + 3.26149903e+03 1.21370023e+04 0.00000000e+00 + 4.34317563e+03 1.12594069e+04 0.00000000e+00 + 4.38546871e+03 1.14232440e+04 0.00000000e+00 + 8.35130645e+03 1.69641883e+04 0.00000000e+00 + 3.26149903e+03 -1.22161912e+04 0.00000000e+00 + 3.26149903e+03 -1.22449884e+04 0.00000000e+00 + 8.76085203e+03 -1.23293136e+04 0.00000000e+00 + 5.81996551e+03 -1.24072503e+04 0.00000000e+00 + 7.53183487e+03 -1.05746716e+04 0.00000000e+00 + 7.88400530e+03 -1.05443171e+04 0.00000000e+00 + 5.37439869e+03 -9.51342638e+03 0.00000000e+00 + 5.40968175e+03 -9.38365676e+03 0.00000000e+00 + 5.30785546e+03 -9.30719452e+03 0.00000000e+00 + 5.20550289e+03 -9.44856893e+03 0.00000000e+00 + 7.77244183e+03 1.28174686e+04 0.00000000e+00 + 7.64459750e+03 1.29633068e+04 0.00000000e+00 + 3.85500114e+03 -1.28043406e+04 0.00000000e+00 + 7.03817488e+03 7.59671675e+03 0.00000000e+00 + 6.40002071e+03 -1.19985188e+04 0.00000000e+00 + 5.97793872e+03 -8.26614964e+03 0.00000000e+00 + 8.08316820e+03 1.66744906e+04 0.00000000e+00 + 8.08443931e+03 1.68047033e+04 0.00000000e+00 + 3.34986081e+03 -1.18502680e+04 0.00000000e+00 + 4.22910525e+03 -8.93470403e+03 0.00000000e+00 + 6.55152863e+03 1.25997691e+04 0.00000000e+00 + 7.00359326e+03 1.22168962e+04 0.00000000e+00 + 6.83744535e+03 1.22814468e+04 0.00000000e+00 + 4.83410621e+03 1.11960419e+04 0.00000000e+00 + 4.98762064e+03 -1.09102966e+04 0.00000000e+00 + 2.77823949e+03 -3.11215107e+03 0.00000000e+00 + 3.57701713e+03 -1.17444897e+04 0.00000000e+00 + 7.27006078e+03 1.61765408e+04 0.00000000e+00 + 3.58674172e+03 -1.19564130e+04 0.00000000e+00 + 7.81147943e+03 1.72467897e+04 0.00000000e+00 + 7.77376761e+03 1.72139569e+04 0.00000000e+00 + 6.16648149e+03 -1.31664860e+04 0.00000000e+00 + 6.12680926e+03 -1.33680782e+04 0.00000000e+00 + 6.29439143e+03 -1.34370453e+04 0.00000000e+00 + 4.31848377e+03 -1.11567722e+04 0.00000000e+00 + 5.93208820e+03 1.01576779e+04 0.00000000e+00 + 7.43205738e+03 -1.57943110e+04 0.00000000e+00 + 7.54979723e+03 -1.56527890e+04 0.00000000e+00 + 7.25305161e+03 -1.57056297e+04 0.00000000e+00 + 5.25174383e+03 -1.29726701e+04 0.00000000e+00 + 5.32355803e+03 -1.28851032e+04 0.00000000e+00 + 7.48393401e+03 1.69843967e+04 0.00000000e+00 + 7.44971285e+03 1.69501755e+04 0.00000000e+00 + 7.02466343e+03 1.54966328e+04 0.00000000e+00 + 7.05835839e+03 1.56405308e+04 0.00000000e+00 + 6.95686343e+03 1.57177529e+04 0.00000000e+00 + 6.89122698e+03 1.55585241e+04 0.00000000e+00 + 2.77823939e+03 3.11215029e+03 0.00000000e+00 + 4.67038708e+03 9.19990816e+02 0.00000000e+00 + 6.81108833e+03 -1.53747115e+04 0.00000000e+00 + 6.71582954e+03 -1.51679241e+04 0.00000000e+00 + 7.14915279e+03 1.28600909e+04 0.00000000e+00 + 7.18472530e+03 1.30604796e+04 0.00000000e+00 + 7.22918749e+03 1.42806824e+04 0.00000000e+00 + 7.47262719e+03 1.44036493e+04 0.00000000e+00 + 4.09356364e+03 6.70593256e+03 0.00000000e+00 + 3.58303690e+03 6.76373636e+03 0.00000000e+00 + 7.67628131e+03 1.68951019e+04 0.00000000e+00 + 7.70647465e+03 1.68282943e+04 0.00000000e+00 + 7.78091334e+03 1.68585420e+04 0.00000000e+00 + 7.74114435e+03 1.69282419e+04 0.00000000e+00 + 7.76270850e+03 -1.71607633e+04 0.00000000e+00 + 7.79137433e+03 -1.71344369e+04 0.00000000e+00 + 7.76319199e+03 -1.71028358e+04 0.00000000e+00 + 7.73228233e+03 -1.71320161e+04 0.00000000e+00 + 4.24263292e+03 1.22270683e+04 0.00000000e+00 + 8.63546818e+03 1.72993738e+04 0.00000000e+00 + 8.75863225e+03 1.72597451e+04 0.00000000e+00 + 8.66333374e+03 1.73933850e+04 0.00000000e+00 + 8.44365378e+03 9.98473620e+03 0.00000000e+00 + 6.05963535e+03 -1.26212950e+04 0.00000000e+00 + 5.92779781e+03 -1.25541073e+04 0.00000000e+00 + 5.56660387e+03 -1.01831705e+04 0.00000000e+00 + 7.78242388e+03 -1.71853987e+04 0.00000000e+00 + 6.89122689e+03 -1.55585249e+04 0.00000000e+00 + 8.20320130e+03 -1.77036639e+04 0.00000000e+00 + 8.15879349e+03 -1.75499898e+04 0.00000000e+00 + 8.12647616e+03 -1.76269388e+04 0.00000000e+00 + 5.13048305e+03 -1.12295800e+04 0.00000000e+00 + 5.57861833e+03 1.21019573e+04 0.00000000e+00 + 4.42322273e+03 1.09896439e+04 0.00000000e+00 + 9.53492699e+03 1.19165886e+04 0.00000000e+00 + 7.54670200e+03 -1.31678525e+04 0.00000000e+00 + 6.94113155e+03 -1.15373445e+04 0.00000000e+00 + 6.80564541e+03 -1.13840309e+04 0.00000000e+00 + 3.58575307e+03 1.26747412e+04 0.00000000e+00 + 3.63074613e+03 1.26233803e+04 0.00000000e+00 + 3.66312614e+03 1.26644897e+04 0.00000000e+00 + 3.78279728e+03 1.30517546e+04 0.00000000e+00 + 5.92429024e+03 -1.35234880e+04 0.00000000e+00 + 7.74353094e+03 -1.66535297e+04 0.00000000e+00 + 7.68517737e+03 -1.65965750e+04 0.00000000e+00 + 3.66960317e+03 -1.18127863e+04 0.00000000e+00 + 3.71948781e+03 -1.18509073e+04 0.00000000e+00 + 8.05567479e+03 1.75561374e+04 0.00000000e+00 + 8.12660769e+03 1.76270703e+04 0.00000000e+00 + 4.51056255e+03 -1.22977322e+04 0.00000000e+00 + 4.37803716e+03 -1.23703847e+04 0.00000000e+00 + 4.26392691e+03 -1.24178435e+04 0.00000000e+00 + 8.42386759e+03 -1.72006195e+04 0.00000000e+00 + 7.18504810e+03 1.36285411e+04 0.00000000e+00 + 7.73366051e+03 1.71825151e+04 0.00000000e+00 + 7.76296631e+03 1.71515798e+04 0.00000000e+00 + 5.80604692e+03 1.20811897e+04 0.00000000e+00 + 7.81657051e+03 -1.67355764e+04 0.00000000e+00 + 4.17381544e+03 1.22981280e+04 0.00000000e+00 + 7.53786310e+03 1.35188612e+04 0.00000000e+00 + 7.82638201e+03 1.73268446e+04 0.00000000e+00 + 7.78252405e+03 1.72829867e+04 0.00000000e+00 + 7.84070506e+03 1.72730354e+04 0.00000000e+00 + 7.10092729e+03 -1.37476486e+04 0.00000000e+00 + 7.15745903e+03 -1.35000164e+04 0.00000000e+00 + 5.63500275e+03 -1.13232429e+04 0.00000000e+00 + 5.52330551e+03 -1.12389713e+04 0.00000000e+00 + 5.20717049e+03 1.23591739e+04 0.00000000e+00 + 3.94602970e+03 -1.01196430e+04 0.00000000e+00 + 4.08165929e+03 -1.01597703e+04 0.00000000e+00 + 4.12266085e+03 -1.00018535e+04 0.00000000e+00 + 4.01271834e+03 -9.93457992e+03 0.00000000e+00 + 7.17243274e+03 -1.64021346e+04 0.00000000e+00 + 7.18605699e+03 -1.64675324e+04 0.00000000e+00 + 7.96046142e+03 -1.67831575e+04 0.00000000e+00 + 8.06749713e+03 -1.67431395e+04 0.00000000e+00 + 4.11484070e+03 -1.27713273e+04 0.00000000e+00 + 3.41797791e+03 1.20514434e+04 0.00000000e+00 + 3.43796572e+03 1.20873433e+04 0.00000000e+00 + 3.39575235e+03 1.21130397e+04 0.00000000e+00 + 7.64436451e+03 1.67964792e+04 0.00000000e+00 + 7.30086397e+03 1.16232040e+04 0.00000000e+00 + 5.36966358e+03 -5.64917727e+03 0.00000000e+00 + 5.62152639e+03 -5.19848937e+03 0.00000000e+00 + 4.38243392e+03 1.11381214e+04 0.00000000e+00 + 7.25607977e+03 1.65982194e+04 0.00000000e+00 + 7.25685648e+03 1.65456113e+04 0.00000000e+00 + 8.64260485e+03 -1.70009383e+04 0.00000000e+00 + 7.60224578e+03 -1.70637723e+04 0.00000000e+00 + 7.61868971e+03 -1.70834660e+04 0.00000000e+00 + 3.26149903e+03 -1.15656757e+04 0.00000000e+00 + 7.01430790e+03 9.54296975e+03 0.00000000e+00 + 7.75361760e+03 -1.70278497e+04 0.00000000e+00 + 7.73253512e+03 -1.70797407e+04 0.00000000e+00 + 8.55137912e+03 1.26036701e+04 0.00000000e+00 + 8.77689401e+03 1.77659506e+04 0.00000000e+00 + 8.87015177e+03 1.77164693e+04 0.00000000e+00 + 7.92123658e+03 1.29433882e+04 0.00000000e+00 + 4.64420726e+03 1.23667411e+04 0.00000000e+00 + 4.51878921e+03 -1.27002217e+04 0.00000000e+00 + 8.67013144e+03 1.26429530e+04 0.00000000e+00 + 8.74188490e+03 1.25475440e+04 0.00000000e+00 + 8.85288594e+03 1.25877893e+04 0.00000000e+00 + 8.78193609e+03 1.26638023e+04 0.00000000e+00 + 3.77762638e+03 -1.21042611e+04 0.00000000e+00 + 4.33840438e+03 1.29319911e+04 0.00000000e+00 + 4.37546936e+03 1.28202325e+04 0.00000000e+00 + 5.91147232e+03 -1.23005353e+04 0.00000000e+00 + 5.82219775e+03 -1.22298707e+04 0.00000000e+00 + 4.41755799e+03 9.80550633e+03 0.00000000e+00 + 4.32071333e+03 9.87385713e+03 0.00000000e+00 + 7.31404995e+03 1.40127636e+04 0.00000000e+00 + 5.88289550e+03 9.71861900e+03 0.00000000e+00 + 7.67878630e+03 -1.71512580e+04 0.00000000e+00 + 7.69760258e+03 -1.71580797e+04 0.00000000e+00 + 4.10431800e+03 -1.09522709e+04 0.00000000e+00 + 4.15428657e+03 -1.10743815e+04 0.00000000e+00 + 3.37298179e+03 1.25910999e+04 0.00000000e+00 + 6.35316669e+03 -6.55335041e+03 0.00000000e+00 + 6.06628044e+03 -6.47991760e+03 0.00000000e+00 + 6.02907496e+03 -6.81019488e+03 0.00000000e+00 + 6.31955069e+03 -6.84140714e+03 0.00000000e+00 + 5.24524674e+03 -1.04796543e+04 0.00000000e+00 + 5.00672147e+03 -1.05297404e+04 0.00000000e+00 + 4.99917855e+03 -1.07240214e+04 0.00000000e+00 + 3.72513684e+03 1.26490338e+04 0.00000000e+00 + 6.21341176e+03 -1.20639295e+04 0.00000000e+00 + 6.12187132e+03 -1.22450516e+04 0.00000000e+00 + 3.73119421e+03 -1.27745170e+04 0.00000000e+00 + 3.79046091e+03 -1.28281567e+04 0.00000000e+00 + 3.82070345e+03 -1.27329136e+04 0.00000000e+00 + 3.98684378e+03 -1.32992199e+04 0.00000000e+00 + 5.18418910e+03 -1.02699588e+04 0.00000000e+00 + 5.37236537e+03 -1.02089273e+04 0.00000000e+00 + 5.14176698e+03 -1.00784611e+04 0.00000000e+00 + 5.46066633e+03 -1.05658491e+04 0.00000000e+00 + 5.53216480e+03 -1.03808088e+04 0.00000000e+00 + 5.38849198e+03 -1.03504079e+04 0.00000000e+00 + 3.40084267e+03 1.22598386e+04 0.00000000e+00 + 3.36208548e+03 -1.20719365e+04 0.00000000e+00 + 5.22944065e+03 9.70210009e+03 0.00000000e+00 + 5.21467490e+03 9.82541668e+03 0.00000000e+00 + 3.26149903e+03 -1.21800005e+04 0.00000000e+00 + 7.15744238e+03 -1.63301795e+04 0.00000000e+00 + 1.24363186e+04 -4.21604633e+03 0.00000000e+00 + 1.19239411e+04 -3.47168991e+03 0.00000000e+00 + 7.06452810e+03 -1.39238527e+04 0.00000000e+00 + 7.18511874e+03 -1.40474276e+04 0.00000000e+00 + 7.29393041e+03 -1.38443888e+04 0.00000000e+00 + 5.58673088e+03 1.23256515e+04 0.00000000e+00 + 5.34143860e+03 1.22896143e+04 0.00000000e+00 + 5.47013187e+03 1.22068851e+04 0.00000000e+00 + 4.09500439e+03 -9.45288344e+03 0.00000000e+00 + 4.08787709e+03 -9.53580711e+03 0.00000000e+00 + 7.05174484e+03 1.59715453e+04 0.00000000e+00 + 7.00962968e+03 1.58540381e+04 0.00000000e+00 + 7.47405561e+03 -1.68485877e+04 0.00000000e+00 + 6.73323038e+03 1.42493834e+04 0.00000000e+00 + 6.69477020e+03 -1.01516402e+04 0.00000000e+00 + 6.02499290e+03 -1.19984127e+04 0.00000000e+00 + 5.53091979e+03 -9.32937427e+03 0.00000000e+00 + 5.43226201e+03 -9.18121900e+03 0.00000000e+00 + 7.74612905e+03 1.72465917e+04 0.00000000e+00 + 7.71747918e+03 1.72179418e+04 0.00000000e+00 + 3.34425866e+03 -1.14441439e+04 0.00000000e+00 + 3.26149903e+03 -1.14746165e+04 0.00000000e+00 + 5.81655020e+03 -1.32723106e+04 0.00000000e+00 + 8.28468812e+03 1.76493314e+04 0.00000000e+00 + 3.26149903e+03 -1.11026766e+04 0.00000000e+00 + 3.26149903e+03 -1.11938021e+04 0.00000000e+00 + 4.39359538e+03 1.27377742e+04 0.00000000e+00 + 5.97590326e+03 -1.21626945e+04 0.00000000e+00 + 6.95686284e+03 -1.57177533e+04 0.00000000e+00 + 5.85456329e+03 9.52967226e+03 0.00000000e+00 + 6.75260277e+03 6.95206695e+03 0.00000000e+00 + 6.59191529e+03 6.77883826e+03 0.00000000e+00 + 4.97524929e+03 2.68524289e+03 0.00000000e+00 + 3.72080390e+03 -1.26977036e+04 0.00000000e+00 + 4.27269424e+03 -9.44823575e+03 0.00000000e+00 + 8.63472979e+03 -1.15343445e+04 0.00000000e+00 + 5.04527197e+03 -9.34847023e+03 0.00000000e+00 + 5.37012025e+03 -8.51846432e+03 0.00000000e+00 + 7.51413383e+03 -1.70145965e+04 0.00000000e+00 + 7.99067547e+03 -1.74911381e+04 0.00000000e+00 + 7.28307635e+03 1.33293279e+04 0.00000000e+00 + 6.71697637e+03 -1.04522786e+04 0.00000000e+00 + 7.77534464e+03 -1.31110516e+04 0.00000000e+00 + 7.95673596e+03 -1.30619612e+04 0.00000000e+00 + 7.87744418e+03 1.18816677e+04 0.00000000e+00 + 7.54001661e+03 1.70404793e+04 0.00000000e+00 + 7.51413931e+03 1.70146020e+04 0.00000000e+00 + 6.79834098e+03 -9.89202967e+03 0.00000000e+00 + 6.86136597e+03 -9.57056504e+03 0.00000000e+00 + 8.21204542e+03 1.68977770e+04 0.00000000e+00 + 8.32203107e+03 1.68641069e+04 0.00000000e+00 + 3.26149903e+03 1.22655552e+04 0.00000000e+00 + 3.27709212e+03 1.22728261e+04 0.00000000e+00 + 8.09835177e+03 -1.74924919e+04 0.00000000e+00 + 8.05533023e+03 -1.75557929e+04 0.00000000e+00 + 4.37951508e+03 1.15625352e+04 0.00000000e+00 + 7.68157964e+03 -1.71672096e+04 0.00000000e+00 + 7.67169508e+03 -1.71721577e+04 0.00000000e+00 + 7.08745476e+03 -9.98031422e+03 0.00000000e+00 + 6.93238597e+03 -1.03291404e+04 0.00000000e+00 + 7.19389036e+03 -1.03852083e+04 0.00000000e+00 + 4.08451951e+03 1.32694157e+04 0.00000000e+00 + 3.98684368e+03 1.32992199e+04 0.00000000e+00 + 7.67169508e+03 1.71721577e+04 0.00000000e+00 + 7.68038352e+03 1.71666922e+04 0.00000000e+00 + 5.00770953e+03 1.11973593e+04 0.00000000e+00 + 4.13284322e+03 -1.29455760e+04 0.00000000e+00 + 7.54557167e+03 1.68000270e+04 0.00000000e+00 + 7.50226384e+03 1.67521642e+04 0.00000000e+00 + 7.17334965e+03 1.26627626e+04 0.00000000e+00 + 3.60467133e+03 -1.16203762e+04 0.00000000e+00 + 3.63296148e+03 -1.14843147e+04 0.00000000e+00 + 3.89498256e+03 -1.09847421e+04 0.00000000e+00 + 3.72759373e+03 -1.10526270e+04 0.00000000e+00 + 4.21073514e+03 1.13563077e+04 0.00000000e+00 + 8.14894476e+03 -1.74386920e+04 0.00000000e+00 + 7.58398936e+03 -1.70844520e+04 0.00000000e+00 + 7.60194572e+03 -1.71024084e+04 0.00000000e+00 + 4.03658085e+03 1.02992962e+04 0.00000000e+00 + 3.61173994e+03 -1.18386935e+04 0.00000000e+00 + 4.17595254e+03 -1.12159368e+04 0.00000000e+00 + 3.59911910e+03 -1.13717350e+04 0.00000000e+00 + 7.30866135e+03 -1.15027396e+04 0.00000000e+00 + 5.54606745e+03 1.35070696e+04 0.00000000e+00 + 5.37807080e+03 8.96198777e+03 0.00000000e+00 + 5.58818655e+03 8.81266697e+03 0.00000000e+00 + 5.56555525e+03 -9.50949840e+03 0.00000000e+00 + 5.83068174e+03 -7.53792323e+03 0.00000000e+00 + 4.07357958e+03 -1.17545604e+04 0.00000000e+00 + 4.41957091e+03 9.25537929e+03 0.00000000e+00 + 4.49389389e+03 9.37557194e+03 0.00000000e+00 + 7.00962958e+03 -1.58540379e+04 0.00000000e+00 + 7.13266241e+03 -1.57621276e+04 0.00000000e+00 + 5.25533182e+03 9.52711910e+03 0.00000000e+00 + 8.77571073e+03 1.81506905e+04 0.00000000e+00 + 8.68712794e+03 1.81875906e+04 0.00000000e+00 + 3.68166579e+03 1.25825472e+04 0.00000000e+00 + 4.06100865e+03 -1.30703301e+04 0.00000000e+00 + 7.90352287e+03 1.09204230e+04 0.00000000e+00 + 6.69877660e+03 -5.75980846e+03 0.00000000e+00 + 6.31406261e+03 -5.37433415e+03 0.00000000e+00 + 6.04182176e+03 -5.62007545e+03 0.00000000e+00 + 6.39535777e+03 -5.94720816e+03 0.00000000e+00 + 8.10426128e+03 1.69212312e+04 0.00000000e+00 + 7.99761444e+03 1.69433123e+04 0.00000000e+00 + 8.02534373e+03 -1.49999306e+04 0.00000000e+00 + 6.98561657e+03 1.15180235e+04 0.00000000e+00 + 3.62231786e+03 1.12847573e+04 0.00000000e+00 + 7.17934879e+03 7.36219211e+03 0.00000000e+00 + 4.09844072e+03 9.36921453e+03 0.00000000e+00 + 4.09500488e+03 9.45287776e+03 0.00000000e+00 + 3.57806065e+03 -1.20463030e+04 0.00000000e+00 + 3.64353090e+03 -1.20283419e+04 0.00000000e+00 + 3.39592413e+03 -1.18245527e+04 0.00000000e+00 + 8.09906439e+03 -1.68976150e+04 0.00000000e+00 + 7.99361816e+03 -1.68679794e+04 0.00000000e+00 + 8.66936330e+03 9.21393034e+03 0.00000000e+00 + 6.03813810e+03 -1.23998400e+04 0.00000000e+00 + 4.04825062e+03 -1.14090540e+04 0.00000000e+00 + 7.36505437e+03 -1.42266107e+04 0.00000000e+00 + 7.18089169e+03 -1.44269369e+04 0.00000000e+00 + 3.55573027e+03 -1.27456239e+04 0.00000000e+00 + 3.63172525e+03 -1.27546883e+04 0.00000000e+00 + 4.03847360e+03 -1.12626917e+04 0.00000000e+00 + 4.02713152e+03 -1.11230655e+04 0.00000000e+00 + 8.19059623e+03 -1.27235438e+04 0.00000000e+00 + 5.62770557e+03 8.45491635e+03 0.00000000e+00 + 5.39996988e+03 8.22272129e+03 0.00000000e+00 + 4.94914573e+03 -1.30798972e+04 0.00000000e+00 + 4.88911656e+03 -1.31343352e+04 0.00000000e+00 + 8.35764495e+03 -1.70869401e+04 0.00000000e+00 + 7.85438334e+03 1.69081396e+04 0.00000000e+00 + 7.90993670e+03 1.69799687e+04 0.00000000e+00 + 7.84575584e+03 1.70188697e+04 0.00000000e+00 + 7.79997639e+03 1.69694252e+04 0.00000000e+00 + 7.78351748e+03 -1.13526639e+04 0.00000000e+00 + 3.26149903e+03 -1.21370499e+04 0.00000000e+00 + 3.30068145e+03 -1.21522809e+04 0.00000000e+00 + 6.00530207e+03 8.54865220e+03 0.00000000e+00 + 5.78708101e+03 8.66320180e+03 0.00000000e+00 + 7.72674236e+03 1.67581614e+04 0.00000000e+00 + 7.29916427e+03 7.13988690e+03 0.00000000e+00 + 7.50748957e+03 7.29790198e+03 0.00000000e+00 + 7.18824899e+03 -9.61542128e+03 0.00000000e+00 + 4.21079599e+03 1.11518659e+04 0.00000000e+00 + 7.98053646e+03 1.28273031e+04 0.00000000e+00 + 4.78583034e+03 1.82150284e+03 0.00000000e+00 + 3.57055790e+03 -1.20985349e+04 0.00000000e+00 + 3.73270333e+03 1.25420551e+04 0.00000000e+00 + 3.76281127e+03 1.25861921e+04 0.00000000e+00 + 5.19386571e+03 -1.30497258e+04 0.00000000e+00 + 5.26305160e+03 -1.30896778e+04 0.00000000e+00 + 6.12584525e+03 -7.42114329e+03 0.00000000e+00 + 8.62227921e+03 -9.57222690e+03 0.00000000e+00 + 3.81284781e+03 1.26790332e+04 0.00000000e+00 + 9.14494864e+03 -7.59189944e+03 0.00000000e+00 + 7.54445453e+03 -1.08402748e+04 0.00000000e+00 + 3.48650049e+03 1.16466588e+04 0.00000000e+00 + 5.27687314e+03 -9.04621631e+03 0.00000000e+00 + 5.15331119e+03 -9.19914722e+03 0.00000000e+00 + 3.83741010e+03 1.25707229e+04 0.00000000e+00 + 7.87461409e+03 1.73750767e+04 0.00000000e+00 + 3.99101020e+03 1.09441231e+04 0.00000000e+00 + 5.23962691e+03 1.21770245e+04 0.00000000e+00 + 3.28989219e+03 1.27903548e+04 0.00000000e+00 + 3.98132918e+03 1.25330640e+04 0.00000000e+00 + 7.20388897e+03 -1.65786534e+04 0.00000000e+00 + 7.25965414e+03 -1.65012111e+04 0.00000000e+00 + 7.19642562e+03 -1.65264983e+04 0.00000000e+00 + 3.69679369e+03 1.13023786e+04 0.00000000e+00 + 7.70150601e+03 1.71789804e+04 0.00000000e+00 + 7.69651587e+03 1.71969785e+04 0.00000000e+00 + 4.16707865e+03 9.55088032e+03 0.00000000e+00 + 4.08787748e+03 9.53580221e+03 0.00000000e+00 + 5.09680900e+03 -9.60607658e+03 0.00000000e+00 + 7.94251609e+03 1.61412304e+04 0.00000000e+00 + 8.22548431e+03 1.63341781e+04 0.00000000e+00 + 7.69645123e+03 -1.71969139e+04 0.00000000e+00 + 7.70245716e+03 -1.71802734e+04 0.00000000e+00 + 5.23129497e+03 -1.23848120e+04 0.00000000e+00 + 4.09844062e+03 -9.36922266e+03 0.00000000e+00 + 4.20778313e+03 -9.41921916e+03 0.00000000e+00 + 7.68764913e+03 1.12623824e+04 0.00000000e+00 + 7.59282455e+03 6.65338383e+03 0.00000000e+00 + 7.68154830e+03 6.54809469e+03 0.00000000e+00 + 7.70280117e+03 6.78719602e+03 0.00000000e+00 + 4.59882565e+03 -1.27832420e+04 0.00000000e+00 + 5.70235578e+03 1.22097870e+04 0.00000000e+00 + 8.56287120e+03 -1.71647275e+04 0.00000000e+00 + 8.62473195e+03 -1.72754817e+04 0.00000000e+00 + 8.71206044e+03 -1.71457300e+04 0.00000000e+00 + 5.30123875e+03 9.31138496e+03 0.00000000e+00 + 5.18004607e+03 1.12516509e+04 0.00000000e+00 + 9.39755472e+03 -7.11887522e+03 0.00000000e+00 + 3.26149903e+03 1.19649329e+04 0.00000000e+00 + 7.41504600e+03 1.37610708e+04 0.00000000e+00 + 5.71710540e+03 -6.36222120e+03 0.00000000e+00 + 5.68914915e+03 -6.77609713e+03 0.00000000e+00 + 7.51501754e+03 -1.64997261e+04 0.00000000e+00 + 7.51307712e+03 -1.65676197e+04 0.00000000e+00 + 7.05174455e+03 -1.59715446e+04 0.00000000e+00 + 5.42531578e+03 8.61965337e+03 0.00000000e+00 + 4.47216965e+03 9.91873239e+03 0.00000000e+00 + 4.38214782e+03 9.93596302e+03 0.00000000e+00 + 5.92124199e+03 -4.85763513e+03 0.00000000e+00 + 7.92906516e+03 1.74295278e+04 0.00000000e+00 + 7.94830517e+03 -6.76476548e+03 0.00000000e+00 + 5.72564233e+03 -7.17528285e+03 0.00000000e+00 + 5.34947971e+03 -7.21785377e+03 0.00000000e+00 + 4.09997647e+03 1.08443850e+04 0.00000000e+00 + 4.20999175e+03 1.09564912e+04 0.00000000e+00 + 4.10321316e+03 1.10493824e+04 0.00000000e+00 + 7.24843576e+03 9.74628675e+03 0.00000000e+00 + 6.04359224e+03 -7.13469029e+03 0.00000000e+00 + 7.66697279e+03 1.70809554e+04 0.00000000e+00 + 7.65069721e+03 1.70885024e+04 0.00000000e+00 + 8.85289416e+03 -1.25877806e+04 0.00000000e+00 + 8.77080220e+03 -1.25184885e+04 0.00000000e+00 + 7.61726991e+03 8.94344185e+03 0.00000000e+00 + 7.45436674e+03 8.78713119e+03 0.00000000e+00 + 7.58356022e+03 -1.70394931e+04 0.00000000e+00 + 7.56340362e+03 -1.70638663e+04 0.00000000e+00 + 3.54901131e+03 1.27345937e+04 0.00000000e+00 + 8.42865223e+03 -1.18574723e+04 0.00000000e+00 + 8.69000839e+03 -1.18240741e+04 0.00000000e+00 + 7.63352567e+03 1.39095412e+04 0.00000000e+00 + 6.96002633e+03 7.16326967e+03 0.00000000e+00 + 7.07235105e+03 -1.13931638e+04 0.00000000e+00 + 8.17262934e+03 1.04996685e+04 0.00000000e+00 + 9.06515644e+03 -1.78242412e+04 0.00000000e+00 + 9.08842190e+03 -1.76896491e+04 0.00000000e+00 + 8.96154921e+03 -1.76295859e+04 0.00000000e+00 + 8.26613864e+03 -1.01115627e+04 0.00000000e+00 + 8.81424599e+03 -1.81101122e+04 0.00000000e+00 + 8.81156403e+03 -1.79816606e+04 0.00000000e+00 + 3.34291540e+03 1.20966745e+04 0.00000000e+00 + 3.56392008e+03 -1.21690637e+04 0.00000000e+00 + 6.90342153e+03 1.13171442e+04 0.00000000e+00 + 3.45437618e+03 -1.24850330e+04 0.00000000e+00 + 3.42387305e+03 -1.24635969e+04 0.00000000e+00 + 5.40495570e+03 1.34163986e+04 0.00000000e+00 + 5.49245629e+03 1.33348870e+04 0.00000000e+00 + 8.60328029e+03 9.53660824e+03 0.00000000e+00 + 8.71014163e+03 1.23944380e+04 0.00000000e+00 + 8.63223440e+03 1.24917880e+04 0.00000000e+00 + 7.21029659e+03 -1.66232339e+04 0.00000000e+00 + 6.58000504e+03 -6.86707437e+03 0.00000000e+00 + 7.50079633e+03 1.65945155e+04 0.00000000e+00 + 7.42627137e+03 1.65859946e+04 0.00000000e+00 + 5.39839760e+03 6.89587031e+03 0.00000000e+00 + 3.33861762e+03 1.13865201e+04 0.00000000e+00 + 3.33638535e+03 1.13231980e+04 0.00000000e+00 + 4.98010596e+03 6.86033848e+03 0.00000000e+00 + 4.56504809e+03 6.75593772e+03 0.00000000e+00 + 7.69598952e+03 -1.70332607e+04 0.00000000e+00 + 4.23578405e+03 8.88859877e+03 0.00000000e+00 + 4.04980648e+03 8.67831817e+03 0.00000000e+00 + 4.36796272e+03 8.90283054e+03 0.00000000e+00 + 5.98977787e+03 1.04410199e+04 0.00000000e+00 + 5.86378927e+03 1.07490434e+04 0.00000000e+00 + 7.61243120e+03 -1.64133418e+04 0.00000000e+00 + 7.60567191e+03 -1.59010421e+04 0.00000000e+00 + 4.01509262e+03 -1.10215328e+04 0.00000000e+00 + 7.08546884e+03 -1.60751801e+04 0.00000000e+00 + 5.45927810e+03 9.41104376e+03 0.00000000e+00 + 3.50241427e+03 -1.25180041e+04 0.00000000e+00 + 3.44382738e+03 -1.27083565e+04 0.00000000e+00 + 3.49459071e+03 -1.27477331e+04 0.00000000e+00 + 8.05718424e+03 -1.26195955e+04 0.00000000e+00 + 8.08127688e+03 -1.28738690e+04 0.00000000e+00 + 5.12191004e+03 8.54213638e+03 0.00000000e+00 + 5.04333989e+03 8.26821652e+03 0.00000000e+00 + 5.30143783e+03 8.47565190e+03 0.00000000e+00 + 3.91213058e+03 1.33236570e+04 0.00000000e+00 + 3.90510793e+03 1.32483081e+04 0.00000000e+00 + 7.17243274e+03 1.64021349e+04 0.00000000e+00 + 7.15744248e+03 1.63301800e+04 0.00000000e+00 + 7.20987795e+03 1.62755842e+04 0.00000000e+00 + 8.71456374e+03 1.71071294e+04 0.00000000e+00 + 4.88584645e+03 -8.18953482e+03 0.00000000e+00 + 7.61429236e+03 1.58931578e+04 0.00000000e+00 + 9.10313568e+03 -9.37532255e+03 0.00000000e+00 + 9.31557086e+03 -9.79791371e+03 0.00000000e+00 + 4.64778200e+03 -1.28412377e+04 0.00000000e+00 + 5.17043267e+03 9.09400009e+03 0.00000000e+00 + 5.72601594e+03 1.31333905e+04 0.00000000e+00 + 9.06515379e+03 1.78242561e+04 0.00000000e+00 + 9.03146280e+03 1.79399742e+04 0.00000000e+00 + 8.96237850e+03 1.78063352e+04 0.00000000e+00 + 6.00637728e+03 -1.31199474e+04 0.00000000e+00 + 7.63087197e+03 1.64147275e+04 0.00000000e+00 + 7.66655837e+03 1.65003914e+04 0.00000000e+00 + 7.59820382e+03 1.65311525e+04 0.00000000e+00 + 3.34345485e+03 -1.13474189e+04 0.00000000e+00 + 3.26149903e+03 -1.13811397e+04 0.00000000e+00 + 8.28605017e+03 -1.04936232e+04 0.00000000e+00 + 7.73005624e+03 -1.69822822e+04 0.00000000e+00 + 8.90829151e+03 -1.80042009e+04 0.00000000e+00 + 8.99527770e+03 -1.80388331e+04 0.00000000e+00 + 9.03146741e+03 -1.79399597e+04 0.00000000e+00 + 8.58961741e+03 1.03877218e+04 0.00000000e+00 + 5.12977549e+03 -8.35934333e+03 0.00000000e+00 + 4.30959850e+03 1.10630404e+04 0.00000000e+00 + 7.72885193e+03 6.44043782e+03 0.00000000e+00 + 7.75512197e+03 6.36151380e+03 0.00000000e+00 + 7.04139274e+03 -8.00307725e+03 0.00000000e+00 + 3.87781640e+03 1.31812969e+04 0.00000000e+00 + 7.19642572e+03 1.65264984e+04 0.00000000e+00 + 7.18605709e+03 1.64675326e+04 0.00000000e+00 + 7.25424403e+03 1.64850525e+04 0.00000000e+00 + 7.71738202e+03 -1.72178447e+04 0.00000000e+00 + 7.73320638e+03 -1.71855298e+04 0.00000000e+00 + 5.96890753e+03 -1.33153741e+04 0.00000000e+00 + 4.28044960e+03 1.14345448e+04 0.00000000e+00 + 8.19694384e+03 -1.63204788e+04 0.00000000e+00 + 9.08841925e+03 1.76896645e+04 0.00000000e+00 + 8.97139492e+03 1.76905076e+04 0.00000000e+00 + 6.60673935e+03 1.49422829e+04 0.00000000e+00 + 7.52551982e+03 1.15485753e+04 0.00000000e+00 + 3.63375916e+03 -1.21791203e+04 0.00000000e+00 + 3.63840924e+03 -1.21071416e+04 0.00000000e+00 + 6.60674033e+03 -1.49422850e+04 0.00000000e+00 + 7.74487177e+03 1.62785903e+04 0.00000000e+00 + 5.21996180e+03 -8.72981329e+03 0.00000000e+00 + 3.26149903e+03 1.12878249e+04 0.00000000e+00 + 3.26149903e+03 1.11938014e+04 0.00000000e+00 + 3.48980947e+03 1.24199079e+04 0.00000000e+00 + 3.41341941e+03 1.21614060e+04 0.00000000e+00 + 8.47556325e+03 -7.09289888e+03 0.00000000e+00 + 6.04125323e+03 1.02581575e+04 0.00000000e+00 + 4.29324194e+03 1.22905449e+04 0.00000000e+00 + 5.22871621e+03 8.76094811e+03 0.00000000e+00 + 9.13725345e+03 -8.27667903e+03 0.00000000e+00 + 3.29379360e+03 -1.22910525e+04 0.00000000e+00 + 3.84405314e+03 1.32606690e+04 0.00000000e+00 + 3.83176830e+03 1.32058173e+04 0.00000000e+00 + 7.11428188e+03 1.61677511e+04 0.00000000e+00 + 7.08546903e+03 1.60751809e+04 0.00000000e+00 + 7.18948675e+03 1.60882760e+04 0.00000000e+00 + 4.12112677e+03 -1.30933322e+04 0.00000000e+00 + 3.86462934e+03 1.33408607e+04 0.00000000e+00 + 5.12782055e+03 1.32898339e+04 0.00000000e+00 + 7.54001123e+03 -1.70404739e+04 0.00000000e+00 + 8.20331188e+03 1.77037745e+04 0.00000000e+00 + 3.42027509e+03 1.14735545e+04 0.00000000e+00 + 6.93876867e+03 -1.13164078e+04 0.00000000e+00 + 7.20388897e+03 1.65786535e+04 0.00000000e+00 + 7.39972268e+03 6.93932391e+03 0.00000000e+00 + 3.26149903e+03 -1.12878312e+04 0.00000000e+00 + 3.33943038e+03 -1.12452200e+04 0.00000000e+00 + 5.20870208e+03 -1.28033728e+04 0.00000000e+00 + 3.38091108e+03 -1.22374103e+04 0.00000000e+00 + 8.56341849e+03 -1.26354780e+04 0.00000000e+00 + 3.37456158e+03 -1.70118639e+03 0.00000000e+00 + 5.06793566e+03 -9.89896849e+03 0.00000000e+00 + 3.70939378e+03 -1.19688364e+04 0.00000000e+00 + 3.75364670e+03 -1.20327897e+04 0.00000000e+00 + 3.30808102e+03 1.22047907e+04 0.00000000e+00 + 3.26149903e+03 -1.22655552e+04 0.00000000e+00 + 7.92114654e+03 1.72102135e+04 0.00000000e+00 + 7.98145194e+03 1.72171377e+04 0.00000000e+00 + 7.53905013e+03 1.41388089e+04 0.00000000e+00 + 7.63130999e+03 1.71317726e+04 0.00000000e+00 + 7.61775714e+03 1.71182199e+04 0.00000000e+00 + 7.63250270e+03 1.71025799e+04 0.00000000e+00 + 7.64445557e+03 1.71208483e+04 0.00000000e+00 + 7.36410062e+03 1.67046291e+04 0.00000000e+00 + 7.40759804e+03 1.66676160e+04 0.00000000e+00 + 3.66450712e+03 1.21416247e+04 0.00000000e+00 + 1.33405537e+04 -3.89872591e+03 0.00000000e+00 + 4.78870367e+03 -8.97706370e+03 0.00000000e+00 + 7.60194964e+03 1.71024123e+04 0.00000000e+00 + 7.58399386e+03 1.70844565e+04 0.00000000e+00 + 3.65578542e+03 -1.19063384e+04 0.00000000e+00 + 6.38594916e+03 -6.33584938e+03 0.00000000e+00 + 6.17858037e+03 -6.18823296e+03 0.00000000e+00 + 8.85655882e+03 -1.24204078e+04 0.00000000e+00 + 3.62715449e+03 -1.22571490e+04 0.00000000e+00 + 4.52937476e+03 7.12694011e+03 0.00000000e+00 + 4.15029241e+03 -9.89291612e+03 0.00000000e+00 + 8.03108144e+03 1.70441609e+04 0.00000000e+00 + 7.94402280e+03 1.70610713e+04 0.00000000e+00 + 7.58690024e+03 7.05490675e+03 0.00000000e+00 + 5.03887059e+03 -7.99664065e+03 0.00000000e+00 + 7.56340861e+03 1.70638713e+04 0.00000000e+00 + 7.57974969e+03 1.70412877e+04 0.00000000e+00 + 7.58817146e+03 -1.14184709e+04 0.00000000e+00 + 7.47050042e+03 1.67199200e+04 0.00000000e+00 + 7.75581843e+03 1.14831361e+04 0.00000000e+00 + 5.55560514e+03 1.32312890e+04 0.00000000e+00 + 5.59284668e+03 1.31148053e+04 0.00000000e+00 + 4.46043529e+03 9.14329724e+03 0.00000000e+00 + 4.58560164e+03 9.21007575e+03 0.00000000e+00 + 7.87313513e+03 -1.61289818e+04 0.00000000e+00 + 7.17201625e+03 1.56100421e+04 0.00000000e+00 + 3.70598690e+03 -1.21111808e+04 0.00000000e+00 + 3.70369898e+03 -1.20580854e+04 0.00000000e+00 + 4.10060232e+03 9.26615508e+03 0.00000000e+00 + 7.11428169e+03 -1.61677503e+04 0.00000000e+00 + 7.19854664e+03 -1.61162719e+04 0.00000000e+00 + 8.13093198e+03 1.70322095e+04 0.00000000e+00 + 5.02336600e+03 8.89555638e+03 0.00000000e+00 + 4.97667504e+03 -9.08466942e+03 0.00000000e+00 + 5.08836512e+03 -8.91647845e+03 0.00000000e+00 + 4.88278124e+03 -8.79131941e+03 0.00000000e+00 + 4.52095251e+03 9.72636224e+03 0.00000000e+00 + 7.99071543e+03 1.74911781e+04 0.00000000e+00 + 3.78484907e+03 1.24957152e+04 0.00000000e+00 + 8.66826910e+03 -1.73692561e+04 0.00000000e+00 + 5.07621742e+03 -1.30952474e+04 0.00000000e+00 + 7.61775390e+03 -1.71182165e+04 0.00000000e+00 + 7.63442496e+03 -1.71009193e+04 0.00000000e+00 + 2.65861642e+03 -2.09201960e+03 0.00000000e+00 + 5.23242966e+03 -1.31464747e+04 0.00000000e+00 + 7.30929022e+03 9.03151787e+03 0.00000000e+00 + 7.17339189e+03 9.29304581e+03 0.00000000e+00 + 8.17864743e+03 1.68097518e+04 0.00000000e+00 + 3.49316657e+03 1.15638602e+04 0.00000000e+00 + 4.53199689e+03 8.98991763e+03 0.00000000e+00 + 4.33937900e+03 9.08640092e+03 0.00000000e+00 + 7.63130734e+03 -1.71317700e+04 0.00000000e+00 + 7.64717515e+03 -1.71194277e+04 0.00000000e+00 + 3.54337346e+03 1.16433714e+04 0.00000000e+00 + 3.26149903e+03 1.13811065e+04 0.00000000e+00 + 4.99474952e+03 -8.58708061e+03 0.00000000e+00 + 7.59977446e+03 -6.44066374e+03 0.00000000e+00 + 7.52033949e+03 -6.40507230e+03 0.00000000e+00 + 7.44649857e+03 -6.52595005e+03 0.00000000e+00 + 7.56993257e+03 -6.50502982e+03 0.00000000e+00 + 7.60650654e+03 -1.64990638e+04 0.00000000e+00 + 7.36959234e+03 -1.67066226e+04 0.00000000e+00 + 7.81480694e+03 1.16808257e+04 0.00000000e+00 + 7.72472498e+03 -1.57671033e+04 0.00000000e+00 + 4.63110764e+03 9.08576832e+03 0.00000000e+00 + 8.88428131e+03 1.80961504e+04 0.00000000e+00 + 8.82624526e+03 1.80883994e+04 0.00000000e+00 + 7.71047094e+03 1.63887317e+04 0.00000000e+00 + 8.80415488e+03 9.77216947e+03 0.00000000e+00 + 7.75773053e+03 1.64595093e+04 0.00000000e+00 + 3.40160701e+03 -1.17766794e+04 0.00000000e+00 + 7.75333363e+03 1.60012624e+04 0.00000000e+00 + 7.24250431e+03 -1.66805527e+04 0.00000000e+00 + 7.23913486e+03 -1.66985197e+04 0.00000000e+00 + 7.25956715e+03 -1.67096893e+04 0.00000000e+00 + 7.27182070e+03 -1.66784362e+04 0.00000000e+00 + 8.88539000e+03 -7.11257451e+03 0.00000000e+00 + 7.48232753e+03 1.66718220e+04 0.00000000e+00 + 8.84855673e+03 1.82164219e+04 0.00000000e+00 + 8.87890036e+03 1.82364481e+04 0.00000000e+00 + 8.73500511e+03 1.78990632e+04 0.00000000e+00 + 8.15254423e+03 -6.68667839e+03 0.00000000e+00 + 7.71803529e+03 1.71544037e+04 0.00000000e+00 + 7.69479508e+03 1.71555662e+04 0.00000000e+00 + 7.20407919e+03 1.61961756e+04 0.00000000e+00 + 7.13697839e+03 1.62525721e+04 0.00000000e+00 + 7.37534705e+03 6.65282926e+03 0.00000000e+00 + 7.49190121e+03 6.77670187e+03 0.00000000e+00 + 8.48370961e+03 1.17637194e+04 0.00000000e+00 + 8.62995088e+03 1.20484204e+04 0.00000000e+00 + 5.83268441e+03 -5.96253548e+03 0.00000000e+00 + 7.70009410e+03 1.65888323e+04 0.00000000e+00 + 7.21029659e+03 1.66232339e+04 0.00000000e+00 + 7.57348374e+03 -6.67416412e+03 0.00000000e+00 + 7.69635716e+03 -6.78112854e+03 0.00000000e+00 + 8.54108621e+03 1.14930333e+04 0.00000000e+00 + 8.14763433e+03 1.17579182e+04 0.00000000e+00 + 7.72020808e+03 -1.71045290e+04 0.00000000e+00 + 7.36393684e+03 1.29604967e+04 0.00000000e+00 + 7.49644053e+03 1.31302563e+04 0.00000000e+00 + 8.86071808e+03 1.81649271e+04 0.00000000e+00 + 7.81578555e+03 1.70856002e+04 0.00000000e+00 + 7.87207457e+03 1.70773458e+04 0.00000000e+00 + 4.81000019e+03 9.06447597e+03 0.00000000e+00 + 7.59405055e+03 6.86347967e+03 0.00000000e+00 + 8.49418673e+03 -1.70413617e+04 0.00000000e+00 + 7.73686912e+03 -1.32615572e+04 0.00000000e+00 + 3.33099505e+03 -1.27664870e+04 0.00000000e+00 + 3.28990316e+03 -1.27903658e+04 0.00000000e+00 + 4.98169219e+03 -1.23834187e+04 0.00000000e+00 + 7.96772640e+03 1.71419484e+04 0.00000000e+00 + 8.24781138e+03 -1.68494604e+04 0.00000000e+00 + 8.35353389e+03 -1.68265051e+04 0.00000000e+00 + 7.72129769e+03 -1.71584767e+04 0.00000000e+00 + 1.39094180e+04 -1.37101157e+03 0.00000000e+00 + 1.30898580e+04 -1.87045431e+03 0.00000000e+00 + 1.27963981e+04 -3.07154061e+03 0.00000000e+00 + 1.35969943e+04 -2.65243965e+03 0.00000000e+00 + 1.39094175e+04 1.37101392e+03 0.00000000e+00 + 1.35969938e+04 2.65244161e+03 0.00000000e+00 + 1.29312568e+04 2.49805039e+03 0.00000000e+00 + 1.31819383e+04 1.34855960e+03 0.00000000e+00 + 7.21801469e+03 1.66886583e+04 0.00000000e+00 + 7.21557121e+03 1.66599314e+04 0.00000000e+00 + 7.25192325e+03 1.66412529e+04 0.00000000e+00 + 7.24472235e+03 1.66746172e+04 0.00000000e+00 + 7.76827159e+03 -1.60219739e+04 0.00000000e+00 + 7.13697829e+03 -1.62525715e+04 0.00000000e+00 + 1.26041734e+04 3.67350285e+03 0.00000000e+00 + 1.19239408e+04 3.47169089e+03 0.00000000e+00 + 1.23244564e+04 2.33314027e+03 0.00000000e+00 + 1.23244567e+04 -2.33313929e+03 0.00000000e+00 + 9.07353553e+03 9.40280697e+03 0.00000000e+00 + 3.26149903e+03 1.11027167e+04 0.00000000e+00 + 7.64276284e+03 -1.71432255e+04 0.00000000e+00 + 7.65338647e+03 -1.71359217e+04 0.00000000e+00 + 5.43921943e+03 1.31948315e+04 0.00000000e+00 + 7.80823339e+03 1.70452306e+04 0.00000000e+00 + 8.80961525e+03 1.15914841e+04 0.00000000e+00 + 8.71759276e+03 1.17731594e+04 0.00000000e+00 + 7.71053834e+03 -1.55204691e+04 0.00000000e+00 + 8.29690457e+03 -1.69716776e+04 0.00000000e+00 + 9.44535400e+03 -8.71138427e+03 0.00000000e+00 + 5.14362060e+03 -1.31181061e+04 0.00000000e+00 + 4.20725769e+03 9.18289206e+03 0.00000000e+00 + 4.21308063e+03 9.04662614e+03 0.00000000e+00 + 1.25992926e+04 -1.15852647e+03 0.00000000e+00 + 1.32771197e+04 -6.45905784e+02 0.00000000e+00 + 1.40774313e+04 1.07737000e-03 0.00000000e+00 + 1.33050613e+04 5.58218458e+02 0.00000000e+00 + 7.67703485e+03 6.37665340e+03 0.00000000e+00 + 7.69405260e+03 6.38005215e+03 0.00000000e+00 + 7.65589674e+03 6.40862858e+03 0.00000000e+00 + 8.26506707e+03 -1.19056771e+04 0.00000000e+00 + 1.33405532e+04 3.89872846e+03 0.00000000e+00 + 7.28792770e+03 1.28403189e+04 0.00000000e+00 + 8.41918154e+03 -1.69165314e+04 0.00000000e+00 + 1.25992924e+04 1.15852775e+03 0.00000000e+00 + 7.69614016e+03 6.34289035e+03 0.00000000e+00 + 7.22953462e+03 -8.18989130e+03 0.00000000e+00 + 7.24564019e+03 -6.67142520e+03 0.00000000e+00 + 7.26116440e+03 -6.51005461e+03 0.00000000e+00 + 7.67329400e+03 1.67530223e+04 0.00000000e+00 + 7.72281883e+03 1.66793129e+04 0.00000000e+00 + 7.21945298e+03 -1.67089983e+04 0.00000000e+00 + 7.22028364e+03 -1.67207463e+04 0.00000000e+00 + 8.76988024e+03 1.23225247e+04 0.00000000e+00 + 8.72309562e+03 1.22220144e+04 0.00000000e+00 + 9.31005917e+03 8.88565845e+03 0.00000000e+00 + 8.91689251e+03 -1.81869040e+04 0.00000000e+00 + 8.95439515e+03 -1.81201412e+04 0.00000000e+00 + 8.89328468e+03 -1.80973426e+04 0.00000000e+00 + 8.88856659e+03 -1.81544555e+04 0.00000000e+00 + 8.14376710e+03 -6.84013827e+03 0.00000000e+00 + 9.14599974e+03 1.02351637e+04 0.00000000e+00 + 7.26295320e+03 1.67075908e+04 0.00000000e+00 + 7.21801469e+03 -1.66886583e+04 0.00000000e+00 + 8.99527084e+03 1.80388466e+04 0.00000000e+00 + 8.95438839e+03 1.81201548e+04 0.00000000e+00 + 7.60908756e+03 -6.86444569e+03 0.00000000e+00 + 7.64276480e+03 1.71432274e+04 0.00000000e+00 + 7.65241186e+03 1.71365020e+04 0.00000000e+00 + 7.37560531e+03 -6.67117041e+03 0.00000000e+00 + 5.02724807e+03 -7.24739102e+03 0.00000000e+00 + 7.26784821e+03 -1.66518142e+04 0.00000000e+00 + 9.62866231e+03 -9.21443649e+03 0.00000000e+00 + 9.67383639e+03 -9.59520180e+03 0.00000000e+00 + 1.26992004e+04 5.87660000e-04 0.00000000e+00 + 7.78173311e+03 1.71273640e+04 0.00000000e+00 + 4.90259952e+03 -1.23467481e+04 0.00000000e+00 + 8.18330755e+03 -1.74961312e+04 0.00000000e+00 + 3.32024677e+03 1.23555548e+04 0.00000000e+00 + 7.60569478e+03 6.46065313e+03 0.00000000e+00 + 8.92006253e+03 1.25186515e+04 0.00000000e+00 + 8.81278369e+03 1.24578359e+04 0.00000000e+00 + 8.89005464e+03 1.77963591e+04 0.00000000e+00 + 7.46899315e+03 -6.33724910e+03 0.00000000e+00 + 7.36255698e+03 -6.36242649e+03 0.00000000e+00 + 7.67068790e+03 -6.37646268e+03 0.00000000e+00 + 7.65232667e+03 -1.71527893e+04 0.00000000e+00 + 7.65623835e+03 -1.71457677e+04 0.00000000e+00 + 7.65232805e+03 1.71527907e+04 0.00000000e+00 + 7.65569915e+03 1.71463115e+04 0.00000000e+00 + 3.34749644e+03 1.10164133e+04 0.00000000e+00 + 7.12552549e+03 1.54907964e+04 0.00000000e+00 + 3.65328902e+03 1.11834151e+04 0.00000000e+00 + 3.83359490e+03 1.31174809e+04 0.00000000e+00 + 7.97906922e+03 1.16219269e+04 0.00000000e+00 + 7.58494546e+03 6.38003111e+03 0.00000000e+00 + 9.60660105e+03 -1.02215918e+04 0.00000000e+00 + 9.48987704e+03 9.70871717e+03 0.00000000e+00 + 9.84325322e+03 9.96976062e+03 0.00000000e+00 + 3.30198699e+03 1.10321702e+04 0.00000000e+00 + 4.18809183e+03 -9.31577692e+03 0.00000000e+00 + 4.25056381e+03 -9.34803202e+03 0.00000000e+00 + 7.24550549e+03 -1.66525133e+04 0.00000000e+00 + 3.33237993e+03 1.09493320e+04 0.00000000e+00 + 3.28060270e+03 1.09965016e+04 0.00000000e+00 + 3.28061014e+03 -1.09964648e+04 0.00000000e+00 + 3.26149903e+03 -1.10137540e+04 0.00000000e+00 + 7.67639722e+03 1.71508447e+04 0.00000000e+00 + 7.80416470e+03 -1.56492957e+04 0.00000000e+00 + 9.78042874e+03 9.21417235e+03 0.00000000e+00 + 7.17430272e+03 -6.31993417e+03 0.00000000e+00 + 7.29656990e+03 -6.17271757e+03 0.00000000e+00 + 8.85858014e+03 -1.81813050e+04 0.00000000e+00 + 7.56225067e+03 -6.34859147e+03 0.00000000e+00 + 7.53220892e+03 -6.32632050e+03 0.00000000e+00 + 7.21557121e+03 -1.66599314e+04 0.00000000e+00 + 4.10060203e+03 -9.26616537e+03 0.00000000e+00 + 7.25424860e+03 1.62476867e+04 0.00000000e+00 + 7.69616338e+03 -6.34289789e+03 0.00000000e+00 + 7.56810155e+03 -6.29680488e+03 0.00000000e+00 + 7.47253316e+03 -6.25733232e+03 0.00000000e+00 + 8.91688321e+03 1.81869160e+04 0.00000000e+00 + 8.92007056e+03 -1.25186434e+04 0.00000000e+00 + 7.66020990e+03 -1.71606725e+04 0.00000000e+00 + 7.66395981e+03 -1.71499726e+04 0.00000000e+00 + 7.66021069e+03 1.71606732e+04 0.00000000e+00 + 7.66217935e+03 1.71499969e+04 0.00000000e+00 + 7.24122137e+03 1.66960968e+04 0.00000000e+00 + 8.84736940e+03 -1.82728022e+04 0.00000000e+00 + 8.87890957e+03 -1.82364362e+04 0.00000000e+00 + 8.83611892e+03 -1.82172143e+04 0.00000000e+00 + 7.27238958e+03 -6.39459463e+03 0.00000000e+00 + 7.59947266e+03 6.30904402e+03 0.00000000e+00 + 7.21945298e+03 1.67089983e+04 0.00000000e+00 + 7.67367461e+03 -1.71582147e+04 0.00000000e+00 + 7.66662712e+03 -1.71670898e+04 0.00000000e+00 + 8.79739479e+03 -1.82009095e+04 0.00000000e+00 + 7.66662742e+03 1.71670901e+04 0.00000000e+00 + 7.67218879e+03 1.71577962e+04 0.00000000e+00 + 7.59950224e+03 -6.30905558e+03 0.00000000e+00 + 3.26149903e+03 1.10137990e+04 0.00000000e+00 + 4.09214103e+03 9.05387763e+03 0.00000000e+00 + 4.09214201e+03 -9.05388869e+03 0.00000000e+00 + 8.81227763e+03 -1.83127403e+04 0.00000000e+00 + 8.82505467e+03 -1.82981987e+04 0.00000000e+00 + 3.84707787e+03 -1.33475404e+04 0.00000000e+00 + 3.84707787e+03 1.33475405e+04 0.00000000e+00 + 7.22028364e+03 1.67207463e+04 0.00000000e+00 + + + 1 0 + 2 1 + 0 2 + 3 2 + 0 3 + 5 4 + 6 5 + 4 6 + 7 6 + 4 7 + 9 8 + 10 9 + 8 10 + 11 10 + 8 11 + 13 12 + 14 13 + 12 14 + 15 14 + 12 15 + 17 16 + 18 17 + 16 18 + 19 18 + 16 19 + 21 20 + 22 21 + 23 22 + 20 23 + 25 24 + 26 25 + 27 26 + 24 27 + 29 28 + 30 29 + 31 30 + 28 31 + 33 32 + 34 33 + 35 34 + 32 35 + 37 36 + 38 37 + 39 38 + 36 39 + 41 40 + 42 41 + 43 42 + 40 43 + 45 44 + 46 45 + 47 46 + 44 47 + 49 48 + 50 49 + 51 50 + 48 51 + 53 52 + 54 53 + 55 54 + 52 55 + 57 56 + 58 57 + 59 58 + 56 59 + 61 60 + 62 61 + 63 62 + 60 63 + 65 64 + 66 65 + 67 66 + 64 67 + 69 68 + 70 69 + 71 70 + 68 71 + 73 72 + 74 73 + 75 74 + 72 75 + 77 76 + 78 77 + 79 78 + 76 79 + 81 80 + 82 81 + 83 82 + 80 83 + 85 84 + 86 85 + 87 86 + 84 87 + 89 88 + 90 89 + 91 90 + 88 91 + 93 92 + 94 93 + 95 94 + 92 95 + 97 96 + 98 97 + 99 98 + 96 99 + 101 100 + 102 101 + 103 102 + 100 103 + 105 104 + 106 105 + 107 106 + 104 107 + 109 108 + 110 109 + 111 110 + 108 111 + 113 112 + 114 113 + 115 114 + 112 115 + 117 116 + 118 117 + 119 118 + 116 119 + 121 120 + 122 121 + 123 122 + 120 123 + 125 124 + 126 125 + 127 126 + 124 127 + 129 128 + 130 129 + 131 130 + 128 131 + 133 132 + 134 133 + 135 134 + 132 135 + 137 136 + 138 137 + 139 138 + 136 139 + 140 35 + 141 140 + 32 141 + 143 142 + 144 143 + 145 144 + 142 145 + 147 146 + 148 147 + 149 148 + 146 149 + 150 74 + 151 150 + 75 151 + 153 152 + 154 153 + 155 154 + 152 155 + 156 45 + 157 156 + 46 157 + 159 158 + 160 159 + 161 160 + 158 161 + 163 162 + 164 163 + 165 164 + 162 165 + 167 166 + 168 167 + 169 168 + 166 169 + 171 170 + 172 171 + 173 172 + 170 173 + 175 174 + 176 175 + 177 176 + 174 177 + 179 178 + 180 179 + 181 180 + 178 181 + 183 182 + 184 183 + 185 184 + 182 185 + 187 186 + 188 187 + 189 188 + 186 189 + 191 190 + 192 191 + 193 192 + 190 193 + 195 194 + 196 195 + 197 196 + 194 197 + 199 198 + 200 199 + 201 200 + 198 201 + 203 202 + 204 203 + 205 204 + 202 205 + 207 206 + 208 207 + 209 208 + 206 209 + 211 210 + 212 211 + 213 212 + 210 213 + 215 214 + 216 215 + 217 216 + 214 217 + 219 218 + 220 219 + 221 220 + 218 221 + 222 207 + 223 222 + 208 223 + 225 224 + 226 225 + 227 226 + 224 227 + 229 228 + 230 229 + 231 230 + 228 231 + 233 232 + 234 233 + 235 234 + 232 235 + 237 236 + 238 237 + 239 238 + 236 239 + 241 240 + 37 241 + 240 36 + 243 242 + 244 243 + 245 244 + 242 245 + 247 246 + 248 247 + 249 248 + 246 249 + 251 250 + 252 251 + 253 252 + 250 253 + 255 254 + 256 255 + 257 256 + 254 257 + 259 258 + 260 259 + 261 260 + 258 261 + 263 262 + 264 263 + 265 264 + 262 265 + 266 149 + 267 266 + 146 267 + 269 268 + 270 269 + 271 270 + 268 271 + 273 272 + 274 273 + 275 274 + 272 275 + 277 276 + 278 277 + 238 278 + 276 238 + 192 279 + 280 191 + 279 280 + 282 281 + 283 282 + 284 283 + 281 284 + 286 285 + 287 286 + 288 287 + 285 288 + 289 128 + 117 289 + 129 117 + 291 290 + 292 291 + 293 292 + 290 293 + 295 294 + 296 295 + 297 296 + 294 297 + 299 298 + 300 299 + 301 300 + 298 301 + 303 302 + 304 303 + 305 304 + 302 305 + 307 306 + 308 307 + 309 308 + 306 309 + 311 310 + 312 311 + 313 312 + 310 313 + 315 314 + 232 315 + 314 235 + 317 316 + 318 317 + 319 318 + 316 319 + 321 320 + 322 321 + 323 322 + 320 323 + 325 324 + 326 325 + 327 326 + 324 327 + 329 328 + 330 329 + 331 330 + 328 331 + 333 332 + 315 333 + 332 314 + 335 334 + 336 335 + 337 336 + 334 337 + 339 338 + 340 339 + 341 340 + 338 341 + 343 342 + 344 343 + 345 344 + 342 345 + 347 346 + 348 347 + 349 348 + 346 349 + 351 350 + 352 351 + 353 352 + 350 353 + 355 354 + 356 355 + 357 356 + 354 357 + 359 358 + 360 359 + 361 360 + 358 361 + 363 362 + 364 363 + 365 364 + 362 365 + 367 366 + 368 367 + 369 368 + 366 369 + 371 370 + 372 371 + 373 372 + 370 373 + 375 374 + 376 375 + 377 376 + 374 377 + 379 378 + 380 379 + 381 380 + 378 381 + 383 382 + 384 383 + 385 384 + 382 385 + 387 386 + 388 387 + 389 388 + 386 389 + 391 390 + 392 391 + 393 392 + 390 393 + 395 394 + 396 395 + 397 396 + 394 397 + 399 398 + 400 399 + 401 400 + 398 401 + 403 402 + 404 403 + 405 404 + 402 405 + 407 406 + 408 407 + 409 408 + 406 409 + 411 410 + 412 411 + 413 412 + 410 413 + 415 414 + 416 415 + 417 416 + 414 417 + 419 418 + 293 419 + 420 293 + 418 420 + 422 421 + 423 422 + 424 423 + 421 424 + 426 425 + 427 426 + 428 427 + 425 428 + 203 264 + 265 202 + 430 429 + 431 430 + 432 431 + 429 432 + 434 433 + 435 434 + 436 435 + 433 436 + 438 437 + 439 438 + 440 439 + 437 440 + 441 393 + 442 441 + 390 442 + 443 44 + 444 443 + 45 444 + 445 57 + 446 445 + 58 446 + 448 447 + 449 448 + 450 449 + 447 450 + 264 451 + 364 263 + 451 364 + 308 452 + 453 308 + 454 453 + 452 454 + 456 455 + 457 456 + 458 457 + 455 458 + 460 459 + 461 460 + 462 461 + 459 462 + 463 432 + 464 463 + 429 464 + 466 465 + 467 466 + 468 467 + 465 468 + 34 469 + 470 34 + 471 470 + 469 471 + 473 472 + 474 473 + 475 474 + 472 475 + 36 476 + 477 39 + 476 477 + 479 478 + 480 479 + 481 480 + 478 481 + 426 482 + 483 425 + 482 483 + 484 22 + 485 484 + 23 485 + 487 486 + 488 487 + 489 488 + 486 489 + 491 490 + 492 491 + 493 492 + 490 493 + 494 177 + 495 494 + 496 495 + 177 496 + 497 248 + 498 497 + 249 498 + 500 499 + 162 500 + 501 162 + 499 501 + 503 502 + 26 503 + 504 26 + 502 504 + 505 158 + 506 505 + 159 506 + 508 507 + 509 508 + 510 509 + 507 510 + 512 511 + 513 512 + 514 513 + 511 514 + 516 515 + 517 516 + 518 517 + 515 518 + 519 329 + 520 519 + 330 520 + 522 521 + 523 522 + 524 523 + 521 524 + 526 525 + 527 526 + 222 527 + 525 222 + 529 528 + 530 529 + 531 530 + 528 531 + 533 532 + 534 533 + 535 534 + 532 535 + 536 319 + 537 536 + 538 537 + 319 538 + 540 539 + 541 540 + 542 541 + 539 542 + 94 518 + 515 93 + 544 543 + 545 544 + 546 545 + 543 546 + 548 547 + 549 548 + 169 549 + 547 169 + 551 550 + 552 551 + 553 552 + 550 553 + 555 554 + 556 555 + 557 556 + 554 557 + 559 558 + 560 559 + 561 560 + 558 561 + 563 562 + 564 563 + 565 564 + 562 565 + 486 566 + 567 489 + 566 567 + 569 568 + 570 569 + 571 570 + 568 571 + 573 572 + 574 573 + 509 574 + 572 509 + 575 499 + 576 575 + 500 576 + 578 577 + 579 578 + 580 579 + 577 580 + 582 581 + 583 582 + 584 583 + 581 584 + 586 585 + 186 586 + 585 189 + 588 587 + 589 588 + 590 589 + 587 590 + 591 506 + 523 591 + 506 522 + 593 592 + 594 593 + 595 594 + 592 595 + 421 596 + 597 424 + 596 597 + 599 598 + 492 599 + 600 492 + 598 600 + 136 601 + 602 139 + 601 602 + 604 603 + 605 604 + 606 605 + 603 606 + 608 607 + 609 608 + 610 609 + 607 610 + 612 611 + 613 612 + 394 613 + 611 394 + 615 614 + 616 615 + 617 616 + 614 617 + 619 618 + 620 619 + 621 620 + 618 621 + 623 622 + 624 623 + 625 624 + 622 625 + 627 626 + 628 627 + 629 628 + 626 629 + 631 630 + 632 631 + 633 632 + 630 633 + 635 634 + 636 635 + 637 636 + 634 637 + 639 638 + 640 639 + 641 640 + 638 641 + 643 642 + 644 643 + 645 644 + 642 645 + 175 646 + 647 174 + 646 647 + 649 648 + 650 649 + 651 650 + 648 651 + 653 652 + 654 653 + 655 654 + 652 655 + 657 656 + 658 657 + 659 658 + 656 659 + 661 660 + 662 661 + 663 662 + 660 663 + 164 92 + 515 164 + 664 338 + 665 664 + 339 665 + 171 94 + 95 170 + 667 666 + 668 667 + 669 668 + 666 669 + 671 670 + 672 671 + 673 672 + 670 673 + 675 674 + 676 675 + 677 676 + 674 677 + 679 678 + 680 679 + 681 680 + 678 681 + 683 682 + 138 683 + 684 138 + 682 684 + 685 471 + 686 685 + 469 686 + 687 452 + 309 687 + 688 312 + 689 688 + 690 689 + 312 690 + 582 691 + 692 582 + 693 692 + 691 693 + 695 694 + 696 695 + 697 696 + 694 697 + 698 512 + 699 698 + 513 699 + 701 700 + 702 701 + 703 702 + 700 703 + 705 704 + 706 705 + 410 706 + 704 410 + 707 28 + 708 707 + 709 708 + 28 709 + 711 710 + 712 711 + 713 712 + 710 713 + 714 197 + 715 714 + 194 715 + 717 716 + 718 717 + 719 718 + 716 719 + 721 720 + 722 721 + 723 722 + 720 723 + 725 724 + 474 725 + 726 474 + 724 726 + 236 727 + 728 239 + 727 728 + 729 486 + 730 729 + 487 730 + 22 731 + 732 21 + 731 732 + 734 733 + 735 734 + 736 735 + 733 736 + 568 615 + 737 568 + 616 737 + 739 738 + 740 739 + 741 740 + 738 741 + 743 742 + 744 743 + 745 744 + 742 745 + 746 96 + 747 746 + 97 747 + 749 748 + 750 749 + 751 750 + 748 751 + 752 620 + 753 752 + 621 753 + 410 227 + 224 706 + 755 754 + 756 755 + 134 756 + 754 134 + 571 724 + 725 570 + 758 757 + 363 758 + 757 362 + 760 759 + 505 760 + 759 158 + 762 761 + 763 762 + 764 763 + 761 764 + 766 765 + 767 766 + 768 767 + 765 768 + 769 335 + 770 769 + 336 770 + 771 719 + 772 771 + 716 772 + 774 773 + 775 774 + 776 775 + 773 776 + 777 551 + 778 777 + 552 778 + 611 779 + 780 611 + 758 780 + 779 758 + 782 781 + 783 782 + 784 783 + 781 784 + 786 785 + 787 786 + 788 787 + 785 788 + 789 731 + 484 789 + 478 544 + 545 481 + 557 761 + 762 556 + 790 54 + 791 790 + 792 791 + 54 792 + 794 793 + 795 794 + 796 795 + 793 796 + 798 797 + 799 798 + 800 799 + 797 800 + 155 801 + 802 154 + 801 802 + 803 206 + 804 803 + 805 804 + 206 805 + 807 806 + 808 807 + 809 808 + 806 809 + 811 810 + 812 811 + 813 812 + 810 813 + 814 231 + 507 814 + 228 507 + 728 815 + 816 239 + 815 816 + 337 817 + 818 337 + 819 818 + 817 819 + 542 820 + 821 541 + 820 821 + 823 822 + 824 823 + 825 824 + 822 825 + 826 325 + 827 826 + 326 827 + 828 720 + 829 828 + 721 829 + 187 365 + 830 187 + 831 830 + 365 831 + 215 832 + 833 215 + 834 833 + 832 834 + 835 362 + 836 835 + 757 836 + 838 837 + 839 838 + 840 839 + 837 840 + 841 682 + 842 841 + 683 842 + 843 207 + 525 843 + 716 844 + 845 716 + 846 845 + 844 846 + 847 671 + 848 847 + 672 848 + 122 68 + 849 122 + 69 849 + 851 850 + 327 851 + 850 326 + 852 83 + 853 852 + 80 853 + 855 854 + 489 855 + 854 488 + 588 856 + 534 588 + 857 534 + 856 857 + 82 858 + 859 81 + 858 859 + 535 860 + 861 534 + 860 861 + 147 862 + 863 146 + 862 863 + 864 307 + 453 864 + 461 865 + 866 461 + 867 866 + 865 867 + 868 704 + 869 868 + 705 869 + 871 870 + 872 871 + 873 872 + 870 873 + 875 874 + 357 875 + 874 356 + 876 869 + 49 876 + 877 49 + 869 877 + 879 878 + 880 879 + 881 880 + 878 881 + 882 772 + 883 882 + 884 883 + 772 884 + 886 885 + 887 886 + 888 887 + 885 888 + 889 551 + 890 889 + 777 890 + 891 850 + 892 891 + 851 892 + 894 893 + 895 894 + 896 895 + 893 896 + 898 897 + 755 898 + 899 755 + 897 899 + 900 348 + 550 900 + 348 553 + 902 901 + 903 902 + 904 903 + 901 904 + 905 222 + 906 905 + 223 906 + 907 751 + 908 907 + 748 908 + 411 909 + 909 227 + 911 910 + 912 911 + 913 912 + 910 913 + 915 914 + 778 915 + 914 777 + 916 432 + 917 916 + 463 917 + 918 155 + 919 918 + 152 919 + 920 466 + 921 920 + 467 921 + 809 690 + 922 809 + 312 922 + 924 923 + 338 924 + 923 341 + 926 925 + 927 926 + 928 927 + 925 928 + 402 849 + 581 402 + 849 584 + 930 929 + 931 930 + 932 931 + 929 932 + 933 224 + 934 933 + 225 934 + 936 935 + 540 936 + 937 540 + 935 937 + 939 938 + 940 939 + 941 940 + 938 941 + 943 942 + 287 943 + 942 286 + 565 813 + 810 564 + 945 944 + 946 945 + 947 946 + 944 947 + 948 476 + 613 948 + 303 613 + 476 303 + 949 821 + 950 949 + 820 950 + 731 951 + 952 732 + 951 952 + 198 472 + 953 201 + 472 953 + 954 475 + 198 954 + 955 470 + 956 955 + 471 956 + 957 889 + 958 957 + 890 958 + 959 695 + 960 959 + 696 960 + 961 936 + 541 961 + 963 962 + 964 963 + 965 964 + 962 965 + 967 966 + 968 967 + 969 968 + 966 969 + 304 612 + 970 694 + 971 970 + 695 971 + 633 972 + 973 632 + 972 973 + 721 974 + 975 829 + 974 975 + 288 976 + 977 287 + 976 977 + 978 66 + 979 978 + 67 979 + 981 980 + 982 981 + 983 982 + 980 983 + 984 790 + 985 984 + 791 985 + 986 414 + 987 986 + 415 987 + 989 988 + 446 989 + 988 445 + 990 498 + 206 990 + 498 209 + 992 991 + 153 992 + 991 152 + 993 485 + 994 993 + 23 994 + 995 479 + 996 995 + 480 996 + 386 627 + 997 389 + 627 997 + 999 998 + 1000 999 + 1001 1000 + 998 1001 + 1002 622 + 1003 1002 + 623 1003 + 880 643 + 644 879 + 1004 168 + 547 1004 + 1006 1005 + 1007 1006 + 1008 1007 + 1005 1008 + 237 1009 + 1010 237 + 1011 1010 + 1009 1011 + 106 1012 + 848 106 + 1012 847 + 1014 1013 + 898 1014 + 1015 898 + 1013 1015 + 604 1016 + 1017 603 + 1016 1017 + 781 245 + 1018 781 + 242 1018 + 1020 1019 + 670 1020 + 1021 670 + 1019 1021 + 1022 772 + 845 1022 + 437 873 + 72 437 + 873 75 + 1023 916 + 1024 1023 + 917 1024 + 1026 1025 + 1027 1026 + 1028 1027 + 1025 1028 + 101 1029 + 1030 101 + 928 1030 + 1029 928 + 1032 1031 + 1033 1032 + 1034 1033 + 1031 1034 + 944 445 + 988 947 + 1036 1035 + 636 1036 + 638 636 + 1035 638 + 1038 1037 + 1039 1038 + 1040 1039 + 1037 1040 + 1042 1041 + 656 1042 + 1043 656 + 1041 1043 + 1045 1044 + 178 1045 + 1046 178 + 1044 1046 + 1047 927 + 1029 1047 + 1048 882 + 1049 1048 + 883 1049 + 1051 1050 + 1034 1051 + 1052 1034 + 1050 1052 + 1053 780 + 363 1053 + 1055 1054 + 1056 1055 + 1057 1056 + 1054 1057 + 1059 1058 + 1060 1059 + 1061 1060 + 1058 1061 + 1062 681 + 1063 1062 + 678 1063 + 1064 803 + 1065 1064 + 804 1065 + 1067 1066 + 299 1067 + 1066 298 + 403 122 + 1069 1068 + 1070 1069 + 1071 1070 + 1068 1071 + 1072 734 + 1073 1072 + 735 1073 + 1075 1074 + 1042 1075 + 1074 1041 + 1077 1076 + 1078 1077 + 1079 1078 + 1076 1079 + 1080 250 + 1081 1080 + 251 1081 + 1082 324 + 1083 1082 + 679 1083 + 324 679 + 1084 79 + 1085 1084 + 76 1085 + 1086 345 + 1087 1086 + 342 1087 + 313 1088 + 1088 922 + 1090 1089 + 389 1090 + 1091 389 + 1089 1091 + 1093 1092 + 1094 1093 + 1079 1094 + 1092 1079 + 1095 1007 + 1096 1095 + 1008 1096 + 1098 1097 + 840 1098 + 1097 839 + 1099 801 + 918 1099 + 1101 1100 + 1102 1101 + 243 1102 + 1100 243 + 982 1103 + 1104 981 + 1103 1104 + 1105 642 + 880 1105 + 1106 268 + 1107 1106 + 269 1107 + 249 208 + 1109 1108 + 1110 1109 + 1111 1110 + 1108 1111 + 1112 148 + 1113 1112 + 149 1113 + 1115 1114 + 216 1115 + 1116 216 + 1114 1116 + 729 1117 + 1117 566 + 372 1118 + 1119 371 + 1118 1119 + 1120 84 + 1121 1120 + 85 1121 + 1122 884 + 1022 1122 + 1124 1123 + 1125 1124 + 1126 1125 + 1123 1126 + 1128 1127 + 1129 1128 + 1130 1129 + 1127 1130 + 1131 890 + 914 1131 + 229 1132 + 1133 228 + 1132 1133 + 313 1134 + 1135 1088 + 1134 1135 + 1137 1136 + 350 1137 + 1136 353 + 1139 1138 + 1140 1139 + 1078 1140 + 1138 1078 + 491 1141 + 1142 490 + 1141 1142 + 1144 1143 + 1145 1144 + 1146 1145 + 1143 1146 + 284 1147 + 1148 283 + 1147 1148 + 1149 440 + 72 1149 + 434 1150 + 1151 433 + 1150 1151 + 785 1152 + 1153 785 + 1154 1153 + 1152 1154 + 1156 1155 + 1111 1156 + 1155 1110 + 1157 930 + 1158 1157 + 931 1158 + 1160 1159 + 1161 1160 + 1162 1161 + 1159 1162 + 1164 1163 + 1165 1164 + 1166 1165 + 1163 1166 + 1167 206 + 843 1167 + 1169 1168 + 1170 1169 + 1171 1170 + 1168 1171 + 1172 863 + 1173 1172 + 1174 1173 + 863 1174 + 451 1053 + 1176 1175 + 1177 1176 + 1178 1177 + 1175 1178 + 1180 1179 + 1181 1180 + 1182 1181 + 1179 1182 + 1184 1183 + 1185 1184 + 511 1185 + 1183 511 + 1186 528 + 1187 1186 + 529 1187 + 968 1065 + 1188 968 + 1189 1188 + 1065 1189 + 1139 1190 + 1191 1138 + 1190 1191 + 1193 1192 + 1037 1193 + 1194 1037 + 1192 1194 + 1196 1195 + 1197 1196 + 1198 1197 + 1195 1198 + 1199 33 + 470 1199 + 1200 91 + 1201 1200 + 88 1201 + 661 301 + 298 660 + 1203 1202 + 975 1203 + 1204 975 + 1202 1204 + 1206 1205 + 990 1206 + 1207 990 + 1205 1207 + 1208 725 + 475 1208 + 1092 1140 + 738 1209 + 1210 741 + 1209 1210 + 1212 1211 + 749 1212 + 1211 748 + 1213 1076 + 1214 1213 + 1215 1214 + 1076 1215 + 1217 1216 + 1218 1217 + 1219 1218 + 1216 1219 + 1221 1220 + 1096 1221 + 669 1096 + 1220 669 + 1223 1222 + 469 1223 + 1222 686 + 1224 784 + 1225 1224 + 781 1225 + 1227 1226 + 1228 1227 + 1229 1228 + 1226 1229 + 1128 479 + 1230 1128 + 995 1230 + 1232 1231 + 499 1232 + 1231 501 + 1233 1217 + 1234 1233 + 1218 1234 + 420 1011 + 1235 420 + 1009 1235 + 1236 924 + 664 1236 + 885 1092 + 1237 885 + 1093 1237 + 1238 189 + 1239 1238 + 585 1239 + 1240 598 + 1241 1240 + 599 1241 + 1243 1242 + 542 1243 + 1242 820 + 1245 1244 + 102 1245 + 1246 102 + 1244 1246 + 48 86 + 881 48 + 87 881 + 969 1064 + 285 1247 + 1248 285 + 1249 1248 + 1247 1249 + 1251 1250 + 1055 1251 + 1250 1054 + 1253 1252 + 144 1253 + 1254 144 + 1252 1254 + 1256 1255 + 1257 1256 + 1258 1257 + 1255 1258 + 1259 1197 + 1260 1259 + 1261 1260 + 1197 1261 + 1263 1262 + 350 1263 + 1262 1137 + 1264 841 + 1265 1264 + 842 1265 + 1266 490 + 1267 1266 + 1142 1267 + 1269 1268 + 310 1269 + 1270 310 + 1268 1270 + 1271 788 + 1153 1271 + 1273 1272 + 20 1273 + 1274 20 + 1272 1274 + 1276 1275 + 1277 1276 + 1278 1277 + 1275 1278 + 1279 974 + 722 1279 + 1281 1280 + 1282 1281 + 1283 1282 + 1280 1283 + 1284 501 + 1285 1284 + 1231 1285 + 946 378 + 1286 946 + 1287 1286 + 378 1287 + 1289 1288 + 978 1289 + 1290 978 + 1288 1290 + 1292 1291 + 1293 1292 + 1294 1293 + 1291 1294 + 1296 1295 + 1297 1296 + 1298 1297 + 1295 1298 + 1166 100 + 1030 1166 + 782 244 + 1300 1299 + 1301 1300 + 1302 1301 + 1299 1302 + 1304 1303 + 444 1304 + 1305 444 + 1303 1305 + 1306 455 + 1307 1306 + 456 1307 + 1308 1102 + 1309 1308 + 243 1309 + 1310 1047 + 1311 1310 + 1312 1311 + 1047 1312 + 1314 1313 + 1231 1314 + 1313 1285 + 1316 1315 + 1317 1316 + 1318 1317 + 1315 1318 + 797 739 + 740 800 + 807 750 + 751 806 + 811 1219 + 1319 811 + 1216 1319 + 694 1320 + 1321 697 + 1320 1321 + 1322 957 + 1323 1322 + 958 1323 + 1246 1029 + 837 309 + 306 840 + 1324 606 + 1325 1324 + 603 1325 + 1255 1326 + 1327 1255 + 374 1327 + 1326 374 + 1328 901 + 1329 1328 + 902 1329 + 1330 1254 + 1331 1330 + 1252 1331 + 1332 476 + 240 1332 + 1333 699 + 1334 1333 + 513 1334 + 1123 172 + 1335 1123 + 173 1335 + 379 183 + 1336 379 + 184 1336 + 1179 1191 + 1337 1179 + 1190 1337 + 1339 1338 + 1340 1339 + 1341 1340 + 1338 1341 + 136 1342 + 1343 601 + 1342 1343 + 961 1344 + 1345 936 + 1344 1345 + 855 1346 + 1347 855 + 1348 1347 + 1346 1348 + 1350 1349 + 1351 1350 + 1352 1351 + 1349 1352 + 253 714 + 1353 252 + 714 1353 + 1196 436 + 1354 1196 + 433 1354 + 1356 1355 + 1098 1356 + 1357 1098 + 1355 1357 + 1359 1358 + 1360 1359 + 1361 1360 + 1358 1361 + 1362 1052 + 1363 1362 + 1050 1363 + 1364 719 + 1365 1364 + 771 1365 + 1195 1359 + 1360 1198 + 1367 1366 + 911 1367 + 1366 910 + 323 1368 + 1258 323 + 1369 1258 + 1368 1369 + 1370 546 + 1371 1370 + 543 1371 + 1372 367 + 1373 1372 + 368 1373 + 1374 659 + 1043 1374 + 1375 1194 + 1376 1375 + 1192 1376 + 1377 185 + 1378 1377 + 1379 1378 + 185 1379 + 567 1380 + 1346 567 + 1381 1346 + 1380 1381 + 948 1271 + 1271 477 + 1382 1145 + 1383 1382 + 972 1383 + 1145 972 + 1385 1384 + 401 1385 + 1384 400 + 1387 1386 + 1388 1387 + 1389 1388 + 1386 1389 + 1051 390 + 391 1050 + 1386 1390 + 1347 1389 + 1390 1347 + 1301 798 + 799 1300 + 1391 1355 + 1392 1391 + 1356 1392 + 1088 808 + 1172 1393 + 267 1172 + 1394 267 + 1393 1394 + 1395 629 + 1396 1395 + 1397 1396 + 629 1397 + 1187 654 + 655 1186 + 192 1192 + 1193 279 + 1399 1398 + 1400 1399 + 1401 1400 + 1398 1401 + 633 1402 + 1402 1383 + 1403 868 + 876 1403 + 1405 1404 + 1406 1405 + 941 1406 + 1404 941 + 382 1407 + 867 385 + 1407 867 + 1409 1408 + 541 1409 + 1408 961 + 662 1410 + 1411 661 + 1410 1411 + 1413 1412 + 1414 1413 + 1415 1414 + 1412 1415 + 1416 211 + 1417 1416 + 212 1417 + 1164 1038 + 1039 1163 + 1419 1418 + 1033 1419 + 1418 1032 + 107 27 + 1420 107 + 24 1420 + 1422 1421 + 1423 1422 + 1424 1423 + 1421 1424 + 1259 436 + 784 712 + 713 783 + 391 1425 + 1426 1050 + 1425 1426 + 1427 938 + 1071 1427 + 939 1071 + 1429 1428 + 1430 1429 + 1431 1430 + 1428 1431 + 1433 1432 + 962 1433 + 1432 965 + 1434 1061 + 1435 1434 + 1058 1435 + 465 1436 + 1037 465 + 1436 1193 + 1437 1204 + 1438 1437 + 1202 1438 + 1439 443 + 1305 1439 + 1440 1143 + 1147 1440 + 1143 1148 + 1441 883 + 1442 1441 + 884 1442 + 1443 311 + 688 1443 + 428 736 + 733 427 + 1445 1444 + 494 1445 + 1446 494 + 1444 1446 + 1215 1406 + 938 1215 + 1447 930 + 1448 1447 + 1157 1448 + 1449 1145 + 1450 1449 + 1382 1450 + 1451 30 + 1452 1451 + 1453 1452 + 30 1453 + 1454 874 + 1455 1454 + 875 1455 + 974 255 + 1456 974 + 256 1456 + 193 1376 + 370 1112 + 774 370 + 1113 774 + 1457 686 + 1458 1457 + 1222 1458 + 1005 851 + 1459 1005 + 327 1459 + 641 1460 + 441 641 + 1461 441 + 1460 1461 + 1463 1462 + 1464 1463 + 1465 1464 + 1462 1465 + 1466 773 + 1113 1466 + 1468 1467 + 29 1468 + 1469 29 + 1467 1469 + 1471 1470 + 1472 1471 + 1473 1472 + 1470 1473 + 1475 1474 + 1476 1475 + 1477 1476 + 1474 1477 + 1478 1154 + 1260 1478 + 1152 1260 + 580 1479 + 1480 579 + 1479 1480 + 1482 1481 + 1483 1482 + 1484 1483 + 1481 1484 + 1485 1452 + 563 1485 + 1453 563 + 1487 1486 + 65 1487 + 1486 64 + 1290 1488 + 1488 66 + 1489 1398 + 1490 1489 + 1399 1490 + 1491 801 + 1492 1491 + 1099 1492 + 1213 1094 + 1493 1113 + 266 1493 + 1494 958 + 1131 1494 + 1496 1495 + 1427 1496 + 1497 1427 + 1495 1497 + 1493 1498 + 1498 1466 + 154 425 + 483 153 + 1456 1203 + 621 1464 + 1465 753 + 1499 554 + 1463 1499 + 555 1463 + 1500 1341 + 1501 1500 + 1338 1501 + 1503 1502 + 1504 1503 + 1505 1504 + 1502 1505 + 1100 1241 + 1506 1100 + 599 1506 + 1507 695 + 1508 1507 + 959 1508 + 1510 1509 + 1511 1510 + 1512 1511 + 1509 1512 + 1477 488 + 1513 1477 + 854 1513 + 1350 1514 + 1515 1349 + 1514 1515 + 1516 685 + 1517 1516 + 1518 1517 + 685 1518 + 1344 1027 + 1028 1345 + 1520 1519 + 89 1520 + 199 89 + 1519 199 + 1180 1368 + 320 1180 + 218 1521 + 360 218 + 1521 359 + 531 1522 + 1523 530 + 1522 1523 + 1485 1524 + 1525 1485 + 1526 1525 + 1524 1526 + 1527 1393 + 1173 1527 + 1529 1528 + 1530 1529 + 1531 1530 + 1528 1531 + 1532 665 + 1533 1532 + 339 1533 + 65 1534 + 1535 1487 + 1534 1535 + 949 1536 + 252 949 + 1536 251 + 1538 1537 + 1539 1538 + 1540 1539 + 1537 1540 + 1541 1474 + 1537 1541 + 1475 1537 + 1543 1542 + 1544 1543 + 1045 1544 + 1542 1045 + 1546 1545 + 1055 1546 + 1545 1251 + 1548 1547 + 1549 1548 + 1550 1549 + 1547 1550 + 1474 487 + 1042 1551 + 1552 1075 + 1551 1552 + 1470 776 + 773 1473 + 1554 1553 + 471 1554 + 1553 956 + 1555 1365 + 795 1555 + 1365 794 + 1330 1556 + 1557 1254 + 1556 1557 + 408 771 + 882 408 + 188 364 + 1558 1174 + 862 1558 + 1559 1090 + 997 1559 + 1560 1040 + 1194 1560 + 1561 1348 + 1381 1561 + 1562 1498 + 266 1562 + 1563 1562 + 267 1563 + 1564 1052 + 1565 1564 + 1362 1565 + 1566 951 + 789 1566 + 802 428 + 1567 889 + 1568 1567 + 1569 1568 + 889 1569 + 1570 1400 + 233 1570 + 1401 233 + 1571 1247 + 286 1571 + 1572 1122 + 845 1572 + 1573 986 + 1574 1573 + 987 1574 + 647 1341 + 1575 174 + 1341 1575 + 1576 613 + 395 1576 + 1577 902 + 1578 1577 + 903 1578 + 261 1579 + 1580 260 + 1579 1580 + 1582 1581 + 1583 1582 + 1584 1583 + 1581 1584 + 1585 876 + 50 1585 + 1338 1391 + 1586 1501 + 1391 1586 + 1587 1321 + 1588 1587 + 1320 1588 + 1590 1589 + 1591 1590 + 1592 1591 + 1589 1592 + 1594 1593 + 1595 1594 + 1596 1595 + 1593 1596 + 1598 1597 + 1599 1598 + 1600 1599 + 1597 1600 + 1602 1601 + 1603 1602 + 1319 1603 + 1601 1319 + 1604 393 + 1461 1604 + 1605 1453 + 31 1605 + 1607 1606 + 1608 1607 + 1609 1608 + 1606 1609 + 1610 668 + 1611 1610 + 1612 1611 + 668 1612 + 675 141 + 1613 675 + 32 1613 + 1614 105 + 848 1614 + 1615 1070 + 1616 1615 + 1617 1616 + 1070 1617 + 1339 1355 + 1618 360 + 1619 1618 + 361 1619 + 1620 212 + 1413 1620 + 213 1413 + 1622 1621 + 1277 1622 + 1621 1276 + 1624 1623 + 384 1624 + 1623 383 + 1625 1012 + 1626 1625 + 106 1626 + 1628 1627 + 1629 1628 + 1630 1629 + 1627 1630 + 1631 1605 + 1632 1631 + 31 1632 + 536 1633 + 1633 318 + 1634 1428 + 1151 1634 + 1635 1151 + 1428 1635 + 1356 306 + 307 1392 + 1636 469 + 35 1636 + 1321 55 + 52 697 + 1637 727 + 1638 1637 + 236 1638 + 1639 1487 + 1640 1639 + 1535 1640 + 667 593 + 594 666 + 1642 1641 + 1643 1642 + 1644 1643 + 1641 1644 + 1646 1645 + 658 1646 + 1645 657 + 1207 497 + 1648 1647 + 1649 1648 + 1650 1649 + 1647 1650 + 1651 261 + 1652 1651 + 258 1652 + 1457 1518 + 1025 1653 + 935 1028 + 1653 935 + 1445 67 + 64 1444 + 1655 1654 + 1361 1655 + 1373 1361 + 1654 1373 + 870 151 + 1656 1257 + 1369 1656 + 1658 1657 + 1583 1658 + 1657 1582 + 1251 1659 + 1660 1250 + 1659 1660 + 1661 1209 + 995 1661 + 1209 1230 + 1662 904 + 1663 1662 + 901 1663 + 767 1664 + 1665 766 + 1664 1665 + 1666 1425 + 392 1666 + 1390 854 + 1668 1667 + 1170 1668 + 1669 1170 + 1667 1669 + 1670 733 + 1671 1670 + 734 1671 + 1673 1672 + 127 1673 + 1672 126 + 1674 1077 + 1138 1674 + 1675 1363 + 1426 1675 + 1676 896 + 1677 1676 + 893 1677 + 1679 1678 + 1680 1679 + 1681 1680 + 1678 1681 + 1448 933 + 934 1447 + 1682 1606 + 1683 1682 + 1684 1683 + 1606 1684 + 1685 1663 + 1328 1685 + 1507 1686 + 1686 971 + 1294 1264 + 1687 1294 + 1265 1687 + 320 1191 + 1688 435 + 1259 1688 + 422 1233 + 1234 421 + 1689 642 + 1690 1689 + 1105 1690 + 1516 1691 + 1554 1516 + 1692 1554 + 1691 1692 + 1694 1693 + 1695 1694 + 1696 1695 + 1693 1696 + 1698 1697 + 1699 1698 + 1107 1699 + 1697 1107 + 1701 1700 + 1702 1701 + 1703 1702 + 1700 1703 + 1704 525 + 764 1704 + 526 764 + 1705 1434 + 1706 1705 + 1435 1706 + 1177 57 + 944 1177 + 1708 1707 + 1709 1708 + 1710 1709 + 1707 1710 + 1612 1220 + 1629 1612 + 1220 1628 + 1711 1405 + 1712 1711 + 1406 1712 + 1714 1713 + 1715 1714 + 1716 1715 + 1713 1716 + 1717 1428 + 1718 1717 + 1634 1718 + 1719 713 + 1720 1719 + 710 1720 + 1589 1721 + 1649 1592 + 1721 1649 + 1454 1722 + 1723 874 + 1722 1723 + 1725 1724 + 346 1725 + 1726 346 + 1724 1726 + 1727 835 + 1728 1727 + 836 1728 + 1730 1729 + 1565 1730 + 1419 1565 + 1729 1419 + 1641 1731 + 1732 1644 + 1731 1732 + 1733 340 + 1734 1733 + 341 1734 + 1736 1735 + 1737 1736 + 247 1737 + 1735 247 + 738 1738 + 1739 738 + 1740 1739 + 1738 1740 + 340 1741 + 1741 1533 + 1742 914 + 1743 1742 + 915 1743 + 594 1744 + 1095 666 + 1744 1095 + 1745 1364 + 1555 1745 + 1404 1327 + 375 1404 + 1746 1387 + 1358 1746 + 1388 1358 + 1747 400 + 1748 1747 + 1384 1748 + 1749 1291 + 1750 1749 + 1292 1750 + 1751 1136 + 1752 1751 + 1753 1752 + 1136 1753 + 1755 1754 + 1650 1755 + 1756 1650 + 1754 1756 + 1757 1627 + 1758 1757 + 1628 1758 + 1759 539 + 937 1759 + 1760 49 + 1761 1760 + 877 1761 + 1762 1309 + 244 1762 + 1712 1076 + 1674 1712 + 1024 1162 + 1159 1023 + 1176 945 + 1286 1176 + 1605 562 + 1764 1763 + 1765 1764 + 1766 1765 + 1763 1766 + 634 1767 + 1768 634 + 1769 1768 + 1767 1769 + 939 1617 + 1770 1546 + 1056 1770 + 1543 1746 + 1359 1543 + 1771 1734 + 923 1771 + 1169 1772 + 1773 1169 + 1129 1773 + 1772 1129 + 1774 1108 + 1775 1774 + 1109 1775 + 1777 1776 + 1778 1777 + 1604 1778 + 1776 1604 + 415 1411 + 1410 987 + 1779 1658 + 1780 1779 + 1583 1780 + 1781 814 + 508 1781 + 1782 1550 + 1783 1782 + 1547 1783 + 1785 1784 + 1333 1785 + 1784 699 + 1773 1786 + 1646 1773 + 1786 1645 + 1787 1354 + 1151 1787 + 1788 1223 + 1636 1788 + 1789 39 + 1154 1789 + 39 1153 + 1790 1500 + 1791 1790 + 1792 1791 + 1500 1792 + 1793 279 + 1436 1793 + 1794 1601 + 1795 1794 + 1602 1795 + 1796 1039 + 1560 1796 + 1798 1797 + 1799 1798 + 1800 1799 + 1797 1800 + 1802 1801 + 1439 1802 + 1801 443 + 1804 1803 + 1805 1804 + 1806 1805 + 1803 1806 + 1807 1663 + 1808 1807 + 1685 1808 + 1810 1809 + 1505 1810 + 1809 1504 + 1811 468 + 1164 1811 + 468 1038 + 1812 79 + 1813 1812 + 1084 1813 + 1814 1163 + 1796 1814 + 1815 1072 + 1816 1815 + 1073 1816 + 1639 859 + 859 1486 + 1723 1578 + 903 874 + 886 1140 + 1817 1159 + 113 1817 + 1160 113 + 1262 1753 + 1460 1778 + 1818 1755 + 1819 1818 + 1650 1819 + 910 1703 + 1700 913 + 1820 232 + 1401 1820 + 1221 1758 + 1821 1426 + 1822 1821 + 1425 1822 + 1824 1823 + 1825 1824 + 1826 1825 + 1823 1826 + 1828 1827 + 1829 1828 + 1830 1829 + 1827 1830 + 1790 1575 + 369 1261 + 1198 369 + 259 739 + 797 258 + 1756 1592 + 1831 663 + 1798 1831 + 660 1798 + 331 1470 + 1471 330 + 1832 1081 + 1536 1832 + 1834 1833 + 1452 1834 + 1833 1451 + 1835 625 + 1275 1835 + 622 1275 + 1836 1181 + 1837 1836 + 1182 1837 + 1839 1838 + 1829 1839 + 1840 1829 + 1838 1840 + 1841 37 + 1842 1841 + 38 1842 + 1719 1843 + 1844 1719 + 1845 1844 + 1843 1845 + 1846 1144 + 1449 1846 + 1466 1847 + 1847 1473 + 1388 1655 + 1849 1848 + 1850 1849 + 1851 1850 + 1848 1851 + 1852 1116 + 1853 1852 + 1114 1853 + 1492 1854 + 1855 1491 + 1854 1855 + 1857 1856 + 1858 1857 + 1859 1858 + 1856 1859 + 1303 1596 + 1860 1303 + 1593 1860 + 1275 1861 + 1862 1835 + 1861 1862 + 1863 322 + 1258 1863 + 1865 1864 + 1866 1865 + 1867 1866 + 1864 1867 + 1869 1868 + 1795 1869 + 1868 1794 + 1777 314 + 1870 1777 + 332 1870 + 1768 1871 + 1871 637 + 1387 210 + 211 1386 + 1292 126 + 1672 1750 + 1872 377 + 1326 1872 + 1874 1873 + 1875 1874 + 1876 1875 + 1873 1876 + 1877 1861 + 1276 1877 + 1482 1855 + 1878 1482 + 1854 1878 + 1762 110 + 111 1309 + 1567 550 + 959 1743 + 915 1508 + 1879 23 + 1274 1879 + 508 459 + 460 1781 + 1467 1684 + 1880 1467 + 1606 1880 + 1443 1881 + 1882 1443 + 1883 1882 + 1881 1883 + 1884 1834 + 1485 1884 + 1885 1472 + 1847 1885 + 1887 1886 + 1888 1887 + 1889 1888 + 1886 1889 + 1890 121 + 403 1890 + 1802 1527 + 1173 1801 + 271 1070 + 1891 271 + 1615 1891 + 680 1377 + 1377 1083 + 1892 1329 + 1577 1892 + 1893 816 + 1894 1893 + 815 1894 + 768 1750 + 1672 767 + 1823 1800 + 1797 1826 + 745 502 + 503 744 + 1896 1895 + 1897 1896 + 1898 1897 + 1895 1898 + 1237 1074 + 1899 1237 + 1075 1899 + 447 1900 + 1020 447 + 1900 1019 + 825 1901 + 1605 825 + 1901 562 + 1327 1863 + 368 1360 + 1903 1902 + 1904 1903 + 1905 1904 + 1902 1905 + 1906 1458 + 596 1906 + 1222 596 + 1115 1907 + 1908 1114 + 1907 1908 + 1910 1909 + 1623 1910 + 1911 1623 + 1909 1911 + 1026 1912 + 548 1026 + 1912 547 + 1913 1553 + 1692 1913 + 1416 1513 + 1390 1416 + 1914 885 + 1899 1914 + 1776 392 + 1916 1915 + 1831 1916 + 1917 1831 + 1915 1917 + 1683 1833 + 1918 1683 + 1834 1918 + 1919 297 + 1920 1919 + 294 1920 + 1921 377 + 1600 1921 + 1872 1600 + 1922 1655 + 1389 1922 + 1923 1535 + 1924 1923 + 1534 1924 + 1885 1824 + 1825 1472 + 1926 1925 + 347 1926 + 1927 347 + 1925 1927 + 1741 1188 + 1928 1741 + 1189 1928 + 1374 710 + 711 659 + 1930 1929 + 1333 1930 + 1929 1785 + 1504 1641 + 1642 1503 + 1539 776 + 331 1539 + 798 1652 + 1809 1731 + 1322 1569 + 888 1355 + 1339 887 + 197 250 + 1931 196 + 250 1931 + 1933 1932 + 1233 1933 + 1932 1217 + 1080 1423 + 1423 1931 + 690 1227 + 1228 689 + 1629 1934 + 1934 1611 + 1936 1935 + 1937 1936 + 1297 1937 + 1935 1297 + 1195 1542 + 1631 824 + 201 1938 + 1939 200 + 1938 1939 + 1940 1525 + 1941 1940 + 1526 1941 + 1384 1942 + 1943 1748 + 1942 1943 + 1944 1540 + 1475 1944 + 1945 615 + 569 1945 + 1946 1819 + 1647 1946 + 1947 1913 + 1691 1947 + 273 1948 + 1949 273 + 1950 1949 + 1948 1950 + 1952 1951 + 1561 1952 + 1953 1561 + 1951 1953 + 1266 1280 + 1954 1266 + 1281 1954 + 1956 1955 + 592 1956 + 1957 592 + 1955 1957 + 1958 1579 + 1651 1958 + 1959 21 + 1960 1959 + 732 1960 + 1146 973 + 1962 1961 + 1963 1962 + 1964 1963 + 1961 1964 + 623 986 + 1573 1003 + 962 1835 + 1862 1433 + 1965 1274 + 1966 1965 + 1272 1966 + 1968 1967 + 380 1968 + 1969 380 + 1967 1969 + 1970 1620 + 1414 1970 + 1667 544 + 478 1669 + 1972 1971 + 1973 1972 + 1974 1973 + 1971 1974 + 1975 1546 + 1976 1975 + 1770 1976 + 1977 1682 + 1918 1977 + 1979 1978 + 1568 1979 + 1978 1567 + 1981 1980 + 1982 1981 + 1983 1982 + 1980 1983 + 1984 1956 + 593 1984 + 1985 1417 + 1620 1985 + 321 1138 + 1986 503 + 27 1986 + 1987 802 + 1491 1987 + 1988 1603 + 1216 1988 + 1990 1989 + 1991 1990 + 1992 1991 + 1989 1992 + 1941 1868 + 1993 1941 + 1869 1993 + 1994 1218 + 1995 1994 + 1219 1995 + 1997 1996 + 1814 1997 + 1996 1163 + 940 1616 + 1998 1513 + 1417 1998 + 2000 1999 + 1558 2000 + 1999 1174 + 1789 2001 + 2001 38 + 1978 900 + 707 1632 + 140 2002 + 1788 140 + 2003 1788 + 2002 2003 + 2004 62 + 2005 2004 + 63 2005 + 1843 1495 + 2006 1843 + 1496 2006 + 2007 1293 + 1687 2007 + 1810 1973 + 1313 1810 + 1974 1313 + 823 1488 + 1288 823 + 2008 1884 + 1525 2008 + 1955 1799 + 1823 1955 + 2010 2009 + 2011 2010 + 2012 2011 + 2009 2012 + 1178 56 + 2013 1586 + 1392 2013 + 2015 2014 + 373 2015 + 2014 372 + 1996 100 + 2016 1103 + 2017 2016 + 982 2017 + 2018 1944 + 1476 2018 + 2019 1754 + 1818 2019 + 2021 2020 + 430 2021 + 2022 430 + 2020 2022 + 2023 832 + 216 2023 + 2025 2024 + 2026 2025 + 2027 2026 + 2024 2027 + 2028 982 + 2029 2028 + 983 2029 + 2030 1382 + 2031 2030 + 1383 2031 + 2032 281 + 2033 2032 + 282 2033 + 125 1293 + 2034 125 + 2007 2034 + 1673 1664 + 1947 1791 + 1659 1913 + 1791 1659 + 2035 399 + 1747 2035 + 1648 2036 + 1983 1648 + 2037 1983 + 2036 2037 + 2038 270 + 2039 2038 + 2040 2039 + 270 2040 + 2041 1856 + 1110 2041 + 1856 1109 + 2025 1569 + 1322 2024 + 2042 1368 + 1181 2042 + 2043 818 + 2044 2043 + 819 2044 + 1611 2045 + 2046 1610 + 2045 2046 + 1598 899 + 2047 1598 + 897 2047 + 2048 1708 + 2020 2048 + 1709 2020 + 2049 103 + 1996 2049 + 564 1524 + 2050 1411 + 416 2050 + 2051 1940 + 1993 2051 + 2052 1973 + 1505 2052 + 2053 1593 + 1902 2053 + 1594 1902 + 1980 2054 + 2055 1983 + 2054 2055 + 2056 349 + 1686 2056 + 346 1686 + 2057 1402 + 630 2057 + 1420 2058 + 1626 1420 + 2059 1626 + 2058 2059 + 396 1929 + 1930 395 + 1478 2001 + 2060 1499 + 1464 2060 + 1721 2036 + 1446 1836 + 176 1446 + 1837 176 + 2062 2061 + 2063 2062 + 2064 2063 + 2061 2064 + 2065 1323 + 1494 2065 + 84 1690 + 1105 87 + 1133 2066 + 2067 228 + 2066 2067 + 1900 857 + 2068 1019 + 857 2068 + 2069 960 + 2070 2069 + 696 2070 + 1656 1085 + 76 1257 + 1984 1915 + 1916 1956 + 2071 1656 + 1368 2071 + 2072 1486 + 858 2072 + 2073 1520 + 90 2073 + 2074 311 + 1882 2074 + 1916 1799 + 1726 971 + 115 1532 + 1533 114 + 2075 1030 + 925 2075 + 1524 1868 + 2076 1708 + 2077 2076 + 2048 2077 + 2079 2078 + 2080 2079 + 2044 2080 + 2078 2044 + 2081 648 + 2082 2081 + 649 2082 + 2083 2062 + 1671 2083 + 2063 1671 + 2084 1934 + 2085 2084 + 1629 2085 + 2086 336 + 818 2086 + 96 1847 + 1498 96 + 2087 1109 + 1857 2087 + 1451 1468 + 2088 955 + 1553 2088 + 268 1069 + 1711 1327 + 1246 1312 + 689 1881 + 473 2089 + 2090 472 + 2089 2090 + 1665 160 + 2091 766 + 160 2091 + 2092 405 + 581 2092 + 1853 1430 + 2093 1853 + 1431 2093 + 1041 2094 + 2095 1043 + 2094 2095 + 2096 1743 + 960 2096 + 1803 2097 + 2098 1806 + 2097 2098 + 2099 571 + 737 2099 + 2100 752 + 2101 2100 + 753 2101 + 911 1478 + 1260 1367 + 2102 1000 + 98 2102 + 1000 97 + 864 2013 + 1352 2103 + 2104 1352 + 2105 2104 + 2103 2105 + 1924 2106 + 2107 1924 + 1632 2107 + 2106 1632 + 2108 213 + 2109 2108 + 210 2109 + 2110 81 + 1639 2110 + 1601 810 + 2111 2045 + 1934 2111 + 1353 1409 + 821 1353 + 2112 1277 + 1002 2112 + 1278 1002 + 439 2113 + 2114 439 + 2115 2114 + 2113 2115 + 1035 1460 + 2116 467 + 1811 2116 + 2118 2117 + 2119 2118 + 2120 2119 + 2117 2120 + 1900 533 + 2046 663 + 1917 2046 + 2121 1084 + 2122 2121 + 1085 2122 + 2124 2123 + 709 2124 + 1779 709 + 2123 1779 + 2125 1658 + 2123 2125 + 2126 897 + 1015 2126 + 2127 644 + 2128 2127 + 645 2128 + 2129 2052 + 2130 2129 + 1505 2130 + 2131 893 + 2132 2131 + 894 2132 + 2133 1813 + 2121 2133 + 2134 720 + 2135 2134 + 828 2135 + 2137 2136 + 2138 2137 + 2139 2138 + 2136 2139 + 2050 301 + 1550 1691 + 1517 1550 + 2140 1422 + 1080 2140 + 2141 1517 + 1457 2141 + 1398 2142 + 2142 1820 + 1928 114 + 1716 1896 + 1897 1715 + 2143 1776 + 1870 2143 + 2144 829 + 1204 2144 + 2146 2145 + 1270 2146 + 2147 1270 + 2145 2147 + 2148 1635 + 1429 2148 + 2149 626 + 386 2149 + 2151 2150 + 1906 2151 + 2150 1458 + 1999 1801 + 496 1547 + 1548 495 + 1415 2026 + 2027 1414 + 763 151 + 870 762 + 2152 495 + 2153 2152 + 1548 2153 + 1057 1509 + 1510 1056 + 2141 1549 + 2154 1721 + 2155 2154 + 1589 2155 + 1073 1677 + 893 1816 + 2156 805 + 1167 2156 + 2157 1571 + 942 2157 + 2158 955 + 1975 2158 + 2088 1975 + 2160 2159 + 2161 2160 + 2162 2161 + 2159 2162 + 2163 1744 + 595 2163 + 52 2070 + 2164 819 + 1821 2164 + 817 1821 + 806 1227 + 2165 1813 + 2166 2165 + 2133 2166 + 2167 1928 + 1065 2167 + 1344 2168 + 2169 1027 + 2168 2169 + 163 576 + 1234 1906 + 1643 2051 + 2170 1642 + 2051 2170 + 1072 2083 + 2172 2171 + 398 2172 + 2173 398 + 2171 2173 + 1568 2174 + 2175 1979 + 2174 2175 + 77 1256 + 1827 2031 + 1402 1827 + 1783 1791 + 1947 1782 + 2177 2176 + 2178 2177 + 2179 2178 + 2176 2179 + 1551 657 + 2180 1551 + 1645 2180 + 2181 1970 + 2027 2181 + 2182 1940 + 1643 2182 + 2183 2066 + 1715 2183 + 2066 1714 + 2184 1374 + 2095 2184 + 2185 1305 + 1860 2185 + 2094 1094 + 1214 2094 + 2187 2186 + 1706 2187 + 1091 1706 + 2186 1091 + 1324 1767 + 2188 1324 + 2189 2188 + 1767 2189 + 2025 2174 + 2190 654 + 529 2190 + 2192 2191 + 170 2192 + 2191 173 + 1786 1130 + 2193 1786 + 1127 2193 + 1615 2194 + 2195 1891 + 2194 2195 + 2196 1663 + 2197 2196 + 1807 2197 + 2198 670 + 2199 2198 + 671 2199 + 2200 836 + 2201 2200 + 757 2201 + 1792 1660 + 803 1206 + 248 2202 + 2202 1737 + 1009 276 + 292 1235 + 276 292 + 853 1584 + 2203 853 + 1581 2203 + 2111 1574 + 1410 2111 + 2205 2204 + 1559 2205 + 2204 1090 + 2206 444 + 156 2206 + 2207 748 + 2208 2207 + 1211 2208 + 1859 932 + 929 1858 + 2209 2181 + 2024 2209 + 2124 2079 + 2080 2123 + 180 1412 + 2108 179 + 1412 2108 + 2210 1221 + 1008 2210 + 2212 2211 + 1298 2212 + 2213 1298 + 2211 2213 + 1314 1809 + 2026 2214 + 2215 2025 + 2214 2215 + 2216 2124 + 28 2216 + 1207 2217 + 2218 497 + 2217 2218 + 2219 401 + 2173 2219 + 2220 1707 + 2076 2220 + 2221 743 + 2222 2221 + 744 2222 + 2223 1459 + 324 2223 + 2224 2079 + 2216 2224 + 2225 1236 + 2226 2225 + 664 2226 + 2227 1640 + 1923 2227 + 2228 712 + 1224 2228 + 328 1538 + 1532 2118 + 2119 665 + 2229 1701 + 2230 2229 + 1702 2230 + 2232 2231 + 2233 2232 + 108 2233 + 2231 108 + 2143 1582 + 1666 2143 + 1657 1666 + 83 2234 + 2235 82 + 2234 2235 + 1545 2088 + 1913 1545 + 2236 1049 + 1441 2236 + 2195 1296 + 1935 2195 + 288 2175 + 2174 976 + 2238 2237 + 265 2238 + 2237 202 + 2045 662 + 332 2203 + 1581 1870 + 2239 850 + 523 2239 + 891 523 + 2240 2031 + 1828 2240 + 2241 1424 + 2242 2241 + 1421 2242 + 2244 2243 + 2245 2244 + 2246 2245 + 2243 2246 + 2247 2052 + 2248 2247 + 2129 2248 + 1010 1638 + 817 1675 + 2010 1883 + 2249 2010 + 1881 2249 + 2250 103 + 2059 2250 + 2049 2059 + 1797 2251 + 520 1826 + 2251 520 + 1858 1572 + 845 1857 + 2252 1596 + 1304 2252 + 2253 129 + 2254 2253 + 130 2254 + 2255 1183 + 2172 2255 + 1183 2171 + 1587 2256 + 2256 55 + 1889 1595 + 2252 1889 + 2257 1795 + 1603 2257 + 2258 1993 + 2259 2258 + 1869 2259 + 2260 1584 + 80 2260 + 1822 1657 + 2125 1822 + 1348 1922 + 2261 1985 + 1970 2261 + 2166 1489 + 754 2165 + 1489 754 + 651 1637 + 2262 650 + 1637 2262 + 2215 976 + 2263 1318 + 2035 2263 + 1315 2035 + 2264 997 + 628 2264 + 2265 1334 + 1317 2265 + 513 1317 + 532 1609 + 1682 532 + 2266 1694 + 2267 2266 + 1695 2267 + 2269 2268 + 2270 2269 + 417 2270 + 2268 417 + 2271 1415 + 180 2271 + 1530 1784 + 1929 1530 + 2272 2086 + 2043 2272 + 2274 2273 + 56 2274 + 2275 56 + 2273 2275 + 409 1365 + 2164 2125 + 2080 2164 + 1541 730 + 1147 2276 + 2277 1440 + 2276 2277 + 1323 2209 + 2278 726 + 2279 2278 + 724 2279 + 2281 2280 + 2282 2281 + 2283 2282 + 2280 2283 + 2055 1647 + 653 2284 + 1685 653 + 2284 1808 + 528 2285 + 2179 528 + 2285 2178 + 1354 1542 + 446 2286 + 2287 989 + 2286 2287 + 2289 2288 + 1072 2289 + 2288 2083 + 2135 1701 + 2229 2134 + 2291 2290 + 1690 2291 + 2290 1689 + 2292 2196 + 2293 2292 + 2197 2293 + 2295 2294 + 2296 2295 + 2297 2296 + 2294 2297 + 1670 2257 + 1988 1670 + 1961 300 + 2050 1961 + 2299 2298 + 2300 2299 + 2301 2300 + 2298 2301 + 646 1190 + 2302 646 + 1139 2302 + 2304 2303 + 929 2304 + 2305 929 + 2303 2305 + 246 223 + 2306 673 + 1021 2306 + 2307 1962 + 2308 2307 + 1450 2308 + 1962 1450 + 147 2309 + 1866 862 + 2309 1866 + 2310 246 + 1735 2310 + 58 2311 + 2311 2286 + 448 1609 + 533 448 + 966 2312 + 2313 966 + 2314 2313 + 2312 2314 + 2252 2206 + 2206 1888 + 1223 597 + 2315 2018 + 1998 2315 + 1476 1998 + 2316 822 + 1288 2316 + 1459 2210 + 2317 852 + 2203 2317 + 1788 424 + 1407 2318 + 2318 866 + 2272 191 + 280 2086 + 1408 2168 + 1488 1534 + 2319 2085 + 1630 2319 + 572 459 + 2320 1823 + 2321 2320 + 1824 2321 + 2322 1580 + 2323 2322 + 2324 2323 + 1580 2324 + 1301 2325 + 2325 1652 + 2326 1432 + 538 2326 + 1432 537 + 952 1728 + 2200 952 + 2327 557 + 2328 2327 + 554 2328 + 458 951 + 1566 457 + 2329 1718 + 2330 2329 + 1634 2330 + 718 2331 + 2332 717 + 2331 2332 + 1951 1980 + 2333 1951 + 1981 2333 + 2334 2230 + 2335 2334 + 1702 2335 + 2336 2167 + 804 2336 + 2337 1816 + 2131 2337 + 2339 2338 + 1695 2339 + 2338 2267 + 2340 1901 + 822 2340 + 1915 1610 + 2323 1645 + 1786 2322 + 2341 761 + 2327 2341 + 1981 2230 + 2334 2333 + 2063 2257 + 2258 1503 + 2170 2258 + 1988 427 + 2084 1574 + 2342 2302 + 1140 2342 + 2343 1335 + 2191 2343 + 1901 813 + 2345 2344 + 2266 2345 + 2346 2266 + 2344 2346 + 2347 1003 + 2348 2347 + 1573 2348 + 2255 514 + 2349 776 + 1540 2349 + 2018 2015 + 2350 1944 + 2015 2350 + 1688 1152 + 786 1688 + 2351 2153 + 1549 2351 + 2353 2352 + 2354 2353 + 2355 2354 + 2352 2355 + 2101 2114 + 2115 2100 + 2356 123 + 2357 2356 + 120 2357 + 2359 2358 + 2048 2359 + 2358 2077 + 2011 913 + 2360 2011 + 1700 2360 + 2303 1442 + 1122 2303 + 2109 1746 + 1544 2109 + 352 464 + 429 351 + 2361 1106 + 2362 2361 + 2363 2362 + 1106 2363 + 2364 1208 + 2295 2364 + 1208 2294 + 775 373 + 2365 2182 + 1644 2365 + 2366 239 + 2367 2366 + 816 2367 + 2368 2234 + 852 2368 + 2370 2369 + 1705 2370 + 2369 1434 + 838 1958 + 1873 838 + 1651 1873 + 2371 431 + 916 2371 + 2373 2372 + 2103 2373 + 2372 2105 + 2374 1385 + 2219 2374 + 2375 1560 + 1375 2375 + 2008 1918 + 317 1143 + 1144 316 + 905 2300 + 2376 905 + 2377 2376 + 2300 2377 + 2271 2214 + 2378 163 + 515 2378 + 1541 1839 + 1829 730 + 1337 1837 + 2350 2349 + 1859 2379 + 2380 932 + 2379 2380 + 2381 2192 + 95 2381 + 687 1874 + 1479 452 + 1874 1479 + 1908 1430 + 2382 174 + 1790 2382 + 2148 1787 + 2320 1957 + 2134 2383 + 2383 723 + 2084 2348 + 2385 2384 + 2386 2385 + 2387 2386 + 2384 2387 + 2388 435 + 786 2388 + 2341 1704 + 864 2389 + 2390 2013 + 2389 2390 + 2392 2391 + 1828 2392 + 2391 2240 + 2393 1767 + 2394 2393 + 634 2394 + 2290 2395 + 2132 2290 + 2395 2131 + 2396 280 + 1793 2396 + 2397 1515 + 2398 2397 + 1514 2398 + 2399 2215 + 2400 2399 + 2214 2400 + 2401 478 + 1128 2401 + 2403 2402 + 2404 2403 + 2405 2404 + 2402 2405 + 837 1874 + 2389 1054 + 1250 2390 + 1618 221 + 2407 2406 + 2408 2407 + 1119 2408 + 2406 1119 + 1562 99 + 2409 2324 + 1579 2409 + 1963 1449 + 2135 2360 + 2410 1067 + 2411 2410 + 299 2411 + 2413 2412 + 2249 2413 + 2414 2249 + 2412 2414 + 1268 1437 + 2415 1268 + 1438 2415 + 2417 2416 + 1865 2417 + 2418 1865 + 2416 2418 + 2419 2406 + 2420 2419 + 2421 2420 + 2406 2421 + 2422 1762 + 782 2422 + 2423 1784 + 1531 2423 + 2424 1362 + 2425 2424 + 1363 2425 + 1982 2383 + 2229 1982 + 1733 1188 + 2237 2426 + 2426 205 + 71 123 + 2427 71 + 2356 2427 + 2428 125 + 2429 2428 + 2034 2429 + 2430 2347 + 2431 2430 + 2432 2431 + 2347 2432 + 2151 2433 + 2434 2151 + 2435 2434 + 2433 2435 + 2436 1724 + 2437 2436 + 1725 2437 + 2438 1990 + 2439 2438 + 1991 2439 + 2440 1465 + 872 2440 + 1462 872 + 2441 1855 + 1483 2441 + 2442 1563 + 1394 2442 + 1652 1876 + 2443 329 + 2410 2443 + 519 2410 + 2213 1937 + 2444 2244 + 2445 2444 + 2245 2445 + 2447 2446 + 2338 2447 + 2446 2267 + 77 1326 + 2448 1385 + 2449 2448 + 2374 2449 + 2450 316 + 1846 2450 + 2451 844 + 717 2451 + 2452 145 + 2453 2452 + 142 2453 + 2454 1586 + 2390 2454 + 2407 2209 + 2065 2407 + 2455 2443 + 2411 2455 + 59 2456 + 2456 2311 + 2457 2396 + 1436 2457 + 2459 2458 + 1618 2459 + 2458 221 + 2460 655 + 1892 2460 + 652 1892 + 2081 1894 + 815 648 + 2360 1883 + 858 1181 + 1836 2072 + 1325 1769 + 2335 910 + 366 2335 + 1366 366 + 2461 241 + 1841 2461 + 649 2176 + 2177 2082 + 2462 970 + 1726 2462 + 2463 272 + 1949 2463 + 2464 2096 + 2069 2464 + 2309 2417 + 466 2457 + 2064 2259 + 1795 2064 + 2465 1888 + 156 2465 + 1481 645 + 642 1484 + 751 1226 + 440 2466 + 2466 2113 + 1205 2467 + 2467 2217 + 2414 2009 + 2468 2289 + 1815 2468 + 2469 99 + 1563 2469 + 2337 2468 + 514 1316 + 2470 1630 + 2471 2470 + 1627 2471 + 2472 1731 + 1314 2472 + 2406 2416 + 2417 2421 + 2473 2090 + 2474 2473 + 2089 2474 + 2030 2308 + 1622 988 + 989 1621 + 2475 1393 + 2476 2475 + 1527 2476 + 2477 1049 + 2478 2477 + 2236 2478 + 2480 2479 + 1241 2480 + 2479 1240 + 78 1872 + 2481 2313 + 2482 2481 + 2314 2482 + 2412 2461 + 1841 2414 + 2483 2071 + 2042 2483 + 2446 2345 + 2484 0 + 2485 2484 + 1 2485 + 375 940 + 2486 1424 + 2487 2486 + 2488 2487 + 1424 2488 + 78 1599 + 1261 1366 + 1778 235 + 1225 1281 + 1282 1224 + 2489 577 + 2490 2489 + 578 2490 + 2491 5 + 2492 2491 + 6 2492 + 2493 1583 + 2260 2493 + 2494 2360 + 828 2494 + 570 2495 + 2496 569 + 2495 2496 + 1066 1798 + 1502 2061 + 2497 1502 + 2062 2497 + 1999 44 + 2498 1747 + 2499 2498 + 1748 2499 + 2500 1907 + 2501 2500 + 1115 2501 + 2502 2122 + 1656 2502 + 780 397 + 2258 2061 + 376 2194 + 1616 376 + 2503 2481 + 1206 2503 + 2481 1205 + 2504 2372 + 2505 2504 + 2373 2505 + 2506 1570 + 234 2506 + 2507 1317 + 2263 2507 + 2271 2508 + 2508 2400 + 2448 1942 + 2498 2263 + 2509 2499 + 1943 2509 + 1968 2432 + 2348 1968 + 2510 595 + 1957 2510 + 2511 919 + 991 2511 + 2512 921 + 2513 2512 + 467 2513 + 2435 2316 + 1289 2435 + 2514 2243 + 2444 2514 + 2515 1595 + 1886 2515 + 2516 1044 + 1542 2516 + 2517 605 + 2518 2517 + 606 2518 + 2520 2519 + 59 2520 + 2519 2456 + 2521 1565 + 2424 2521 + 2522 1155 + 2523 2522 + 1156 2523 + 2524 2180 + 2323 2524 + 2342 887 + 1340 2342 + 2525 2074 + 2494 2525 + 1882 2494 + 2526 2068 + 856 2526 + 1440 973 + 1679 1199 + 955 1679 + 190 1607 + 1608 193 + 2409 2524 + 858 2483 + 2528 2527 + 2529 2528 + 2530 2529 + 2527 2530 + 2532 2531 + 130 2532 + 2531 2254 + 1444 2072 + 1175 2533 + 1752 1175 + 2533 1751 + 2534 1525 + 2182 2534 + 2535 899 + 1599 2535 + 2023 2509 + 1943 832 + 2058 2536 + 2536 2250 + 2099 2279 + 1016 2537 + 2538 1017 + 2537 2538 + 1967 2084 + 2319 1967 + 1117 1827 + 2057 1117 + 2539 1334 + 2540 2539 + 2265 2540 + 2541 1316 + 2255 2541 + 2542 843 + 2543 2542 + 525 2543 + 2544 1614 + 672 2544 + 194 1439 + 2185 194 + 2391 2545 + 2308 2240 + 2545 2308 + 2150 2141 + 1046 1429 + 2546 1046 + 1430 2546 + 2547 946 + 2548 2547 + 947 2548 + 2550 2549 + 241 2550 + 1966 241 + 2549 1966 + 2508 2551 + 2552 2400 + 2551 2552 + 2553 2223 + 1082 2553 + 2554 925 + 2555 2554 + 926 2555 + 2155 2556 + 254 2155 + 2557 254 + 2556 2557 + 2558 2336 + 805 2558 + 759 1949 + 41 759 + 1950 41 + 1855 895 + 896 1491 + 1840 2392 + 2560 2559 + 2561 2560 + 2562 2561 + 2559 2562 + 2366 278 + 967 1771 + 1771 2312 + 2563 1948 + 274 2563 + 2564 2137 + 2565 2564 + 2138 2565 + 2037 2383 + 2566 925 + 2567 2566 + 2554 2567 + 2296 131 + 2568 2295 + 131 2568 + 2570 2569 + 2058 2570 + 2569 2536 + 2571 1423 + 2486 2571 + 779 2201 + 2502 2234 + 2572 2122 + 2234 2572 + 1229 2550 + 2412 1228 + 2550 2412 + 2247 2381 + 1972 2247 + 2573 1972 + 2381 2573 + 2574 1186 + 2460 2574 + 2575 1333 + 2539 2575 + 1932 1988 + 894 2441 + 1483 2132 + 2576 2524 + 2577 2576 + 2409 2577 + 1689 1483 + 1915 667 + 1994 1906 + 2310 2298 + 2299 246 + 2551 2546 + 1908 2551 + 1538 1839 + 1676 1987 + 2578 2276 + 2579 2578 + 1147 2579 + 954 2294 + 2580 1905 + 1594 2580 + 2361 1069 + 1907 2552 + 2581 2140 + 1081 2581 + 2566 1811 + 1165 2566 + 1116 2509 + 2582 1958 + 839 2582 + 2583 950 + 1242 2583 + 1948 999 + 2584 1948 + 1000 2584 + 2194 2585 + 2585 1296 + 2586 2445 + 2587 2586 + 2245 2587 + 1761 85 + 86 1760 + 2588 2582 + 1097 2588 + 796 2344 + 2589 795 + 2344 2589 + 904 356 + 1089 1705 + 1660 1501 + 2454 1660 + 943 2500 + 1556 943 + 2501 1556 + 2133 2590 + 2142 2166 + 2590 2142 + 1074 1094 + 979 2152 + 2591 979 + 2153 2591 + 2542 2156 + 1512 577 + 2489 1511 + 2592 1210 + 1661 2592 + 2593 888 + 1914 2593 + 1171 2228 + 1282 1171 + 2028 2594 + 2595 2028 + 2596 2595 + 2594 2596 + 2597 78 + 1812 2597 + 1460 234 + 2598 6 + 2599 2598 + 7 2599 + 2601 2600 + 2538 2601 + 2600 1017 + 2602 1742 + 2096 2602 + 1959 1273 + 1403 2603 + 2604 1403 + 119 2604 + 2603 119 + 2480 2161 + 2162 2479 + 1745 718 + 2605 3 + 2606 2605 + 0 2606 + 1332 302 + 1622 2548 + 566 2607 + 2607 1380 + 2436 2608 + 2609 1724 + 2608 2609 + 2610 856 + 589 2610 + 2408 2261 + 2181 2408 + 2612 2611 + 560 2612 + 2613 560 + 2611 2613 + 1165 2075 + 1002 2430 + 2431 2112 + 2614 723 + 2037 2614 + 2615 2340 + 2316 2615 + 2040 1935 + 1936 2039 + 1986 2222 + 2617 2616 + 1817 2617 + 2618 1817 + 2616 2618 + 2399 977 + 2619 1730 + 2521 2619 + 1506 242 + 2065 2416 + 1445 2152 + 517 2387 + 2384 516 + 2620 1923 + 2107 2620 + 334 1675 + 2621 1264 + 1291 2621 + 269 2622 + 2622 1699 + 2188 2518 + 2623 2337 + 2395 2623 + 2625 2624 + 2404 2625 + 2624 2403 + 1103 2626 + 2627 1104 + 2626 2627 + 574 2183 + 1897 574 + 693 2628 + 2520 693 + 2628 2519 + 2629 2513 + 2554 2629 + 2513 2567 + 1787 2516 + 1974 1284 + 2455 2391 + 1840 2455 + 2631 2630 + 2394 2631 + 2630 2393 + 2632 2367 + 1893 2632 + 2633 1555 + 2589 2633 + 2450 538 + 2634 1342 + 137 2634 + 2343 2468 + 2623 2343 + 2636 2635 + 1886 2636 + 2635 2515 + 2638 2637 + 2639 2638 + 2590 2639 + 2637 2590 + 2640 1020 + 2198 2640 + 2038 2622 + 2415 2146 + 1783 2382 + 2168 1902 + 1903 2169 + 2641 1904 + 2580 2641 + 2642 199 + 2643 2642 + 200 2643 + 2644 1062 + 2645 2644 + 1063 2645 + 1282 1668 + 2646 847 + 2647 2646 + 1012 2647 + 2426 2564 + 2565 205 + 1495 1720 + 2184 1497 + 1720 2184 + 2482 2467 + 2648 2372 + 2649 2648 + 2504 2649 + 2650 2322 + 2193 2650 + 2651 272 + 2652 2651 + 2463 2652 + 2653 1335 + 2623 2653 + 2150 2351 + 1245 2250 + 2654 1245 + 2536 2654 + 2655 2510 + 2320 2655 + 2656 1021 + 2068 2656 + 2658 2657 + 2659 2658 + 2117 2659 + 2657 2117 + 590 2534 + 2365 590 + 1818 1380 + 2607 2019 + 1994 2433 + 2583 2621 + 1749 2583 + 2660 1421 + 2140 2660 + 2662 2661 + 664 2662 + 2661 2226 + 2663 1106 + 1697 2663 + 2664 1930 + 2575 2664 + 1272 240 + 2309 2420 + 1283 1667 + 2582 2409 + 2008 2665 + 860 1918 + 2665 860 + 2667 2666 + 1960 2667 + 2666 1959 + 2669 2668 + 991 2669 + 2668 2511 + 1519 2297 + 954 1519 + 2670 2544 + 673 2670 + 1408 2053 + 2671 575 + 2672 2671 + 576 2672 + 2673 2594 + 2029 2673 + 2136 1184 + 1185 2139 + 2475 2442 + 2674 1004 + 1912 2674 + 1337 175 + 98 2487 + 2488 2102 + 2675 2186 + 2676 2675 + 2187 2676 + 607 1047 + 2677 607 + 1310 2677 + 2678 2047 + 2679 2678 + 897 2679 + 2664 1576 + 1985 2315 + 2681 2680 + 355 2681 + 2680 354 + 2104 74 + 2682 2104 + 150 2682 + 2684 2683 + 1848 2684 + 2685 1848 + 2683 2685 + 2686 2078 + 1880 2686 + 2687 1880 + 2078 2687 + 1283 543 + 2688 404 + 1707 2688 + 405 1707 + 2689 581 + 2273 2689 + 582 2273 + 2353 1978 + 1249 2353 + 1979 1249 + 2690 2552 + 2500 2690 + 691 2691 + 2691 2628 + 2315 2014 + 2690 2399 + 2419 371 + 775 2350 + 2692 2619 + 769 2692 + 2521 769 + 2362 1068 + 2693 1273 + 2666 2693 + 2694 1965 + 2207 2694 + 2695 2207 + 1965 2695 + 912 1842 + 2001 912 + 1757 2696 + 2697 1757 + 2553 2697 + 2696 2553 + 2699 2698 + 2555 2699 + 2700 2555 + 2698 2700 + 217 1557 + 2501 217 + 2702 2701 + 578 2702 + 2701 2490 + 2704 2703 + 2705 2704 + 2205 2705 + 2703 2205 + 165 1284 + 1971 165 + 2706 934 + 226 2706 + 333 2317 + 1494 2418 + 2696 1459 + 204 451 + 1953 1922 + 1633 2033 + 282 318 + 2707 985 + 290 2707 + 791 290 + 2708 1397 + 626 2708 + 2659 1160 + 1161 2658 + 2581 2709 + 43 2581 + 2710 43 + 2709 2710 + 2154 1279 + 2711 2154 + 722 2711 + 2712 1729 + 2619 2712 + 1912 2169 + 1903 2674 + 2693 240 + 1739 1230 + 482 422 + 2713 483 + 422 2713 + 2715 2714 + 1764 2715 + 2716 1764 + 2714 2716 + 1976 1678 + 1678 2158 + 2717 1846 + 1963 2717 + 275 1007 + 1744 275 + 2097 2557 + 2556 2098 + 334 2425 + 1875 1480 + 2718 2186 + 2719 2718 + 2720 2719 + 2186 2720 + 2721 2448 + 2722 2721 + 2449 2722 + 195 2476 + 1802 195 + 746 2321 + 1885 746 + 2527 167 + 168 2530 + 1033 1564 + 335 2424 + 2723 2242 + 2660 2723 + 2724 150 + 763 2724 + 2725 2120 + 2726 2725 + 2727 2726 + 2120 2727 + 2728 2306 + 2656 2728 + 2729 1887 + 2465 2729 + 2224 2687 + 2706 1442 + 2304 2706 + 2730 2368 + 2317 2730 + 2731 561 + 2732 2731 + 558 2732 + 2529 2367 + 2632 2528 + 2687 1469 + 2733 1860 + 2053 2733 + 579 2734 + 2734 2702 + 909 2478 + 1441 909 + 120 2595 + 2596 2357 + 2736 2735 + 2204 2736 + 2737 2204 + 2735 2737 + 639 635 + 482 1933 + 2739 2738 + 2606 2739 + 2738 2605 + 2599 2447 + 2338 2598 + 2641 2635 + 2404 2641 + 2635 2625 + 872 438 + 2114 872 + 2717 2740 + 2740 2450 + 2741 2502 + 2071 2741 + 608 927 + 631 1754 + 2019 630 + 458 1728 + 2742 1709 + 350 2742 + 1709 1263 + 2714 2743 + 2744 2716 + 2743 2744 + 2041 2379 + 2745 2128 + 1481 2745 + 2662 2119 + 2725 2662 + 2746 2365 + 1732 2746 + 2747 2664 + 2748 2747 + 2575 2748 + 1247 2352 + 2241 2584 + 2102 2241 + 1838 328 + 2443 1838 + 2749 1621 + 2287 2749 + 2750 2149 + 387 2750 + 2751 2465 + 157 2751 + 2753 2752 + 1015 2753 + 2752 2126 + 2742 2022 + 760 2463 + 2639 2121 + 2572 2639 + 2411 2545 + 1860 715 + 2526 1624 + 1624 2656 + 2754 711 + 2228 2754 + 1120 2291 + 2755 110 + 1845 2755 + 1762 1845 + 2756 1243 + 539 2756 + 2363 109 + 2755 2363 + 2757 2272 + 2686 2757 + 2043 2686 + 2253 116 + 1833 1467 + 283 317 + 2758 1340 + 647 2758 + 2759 2512 + 2629 2759 + 1409 2733 + 1739 1127 + 2760 1536 + 950 2760 + 1711 322 + 2761 188 + 1238 2761 + 2277 632 + 1299 2762 + 2763 1302 + 2762 2763 + 2765 2764 + 1989 2765 + 2766 1989 + 2764 2766 + 2074 1269 + 2640 2375 + 450 2640 + 1375 450 + 2767 2144 + 1437 2767 + 608 2555 + 770 920 + 920 2692 + 2762 2768 + 2702 2762 + 2768 2701 + 2669 676 + 677 2668 + 812 1995 + 2769 674 + 1613 2769 + 624 2270 + 414 624 + 861 587 + 259 1738 + 2770 2466 + 1149 2770 + 1221 2696 + 2771 2451 + 2332 2771 + 449 1608 + 2678 2212 + 2772 2047 + 2212 2772 + 2773 2321 + 747 2773 + 1330 942 + 2525 2767 + 1268 2525 + 2032 1804 + 1805 281 + 2652 591 + 891 2652 + 2735 2774 + 2370 2737 + 2774 2370 + 2305 1572 + 2293 2004 + 2005 2292 + 2697 2471 + 220 2569 + 2775 219 + 2569 2775 + 2777 2776 + 142 2777 + 2776 2453 + 2703 2736 + 1064 2503 + 2778 1756 + 631 2778 + 2779 1053 + 204 2779 + 2434 2351 + 826 1063 + 2780 826 + 678 2780 + 2097 257 + 2562 2297 + 1520 2562 + 2016 1890 + 404 2016 + 2781 2176 + 650 2781 + 1490 132 + 133 1489 + 2782 1131 + 1742 2782 + 2783 1150 + 2784 2783 + 434 2784 + 2785 111 + 2231 2785 + 1942 834 + 2786 2238 + 262 2786 + 963 2270 + 625 963 + 2580 2515 + 1112 2419 + 2420 148 + 2787 793 + 2788 2787 + 794 2788 + 2395 2789 + 2789 2653 + 1286 2533 + 1125 1120 + 1121 1124 + 610 63 + 60 609 + 1987 736 + 2593 1357 + 2791 2790 + 2792 2791 + 2793 2792 + 2790 2793 + 878 1395 + 1396 881 + 2680 610 + 2677 2680 + 2794 615 + 2795 2794 + 1945 2795 + 1331 2157 + 2161 1102 + 1308 2160 + 2186 388 + 304 779 + 2105 73 + 2329 2507 + 2263 1718 + 2546 181 + 2700 2629 + 2796 1497 + 2095 2796 + 2797 124 + 2428 2797 + 2127 2283 + 2280 644 + 2396 336 + 2798 2070 + 53 2798 + 2800 2799 + 1938 2800 + 2799 1939 + 1208 2495 + 2801 2783 + 2265 2801 + 2783 2540 + 1376 449 + 2642 88 + 384 2728 + 2593 1097 + 2512 2712 + 2619 921 + 2802 2402 + 2803 2802 + 2403 2803 + 2645 827 + 2804 2645 + 2239 2804 + 827 2239 + 262 1238 + 1239 2786 + 2278 2474 + 2089 726 + 2434 2591 + 2251 2410 + 2805 788 + 948 2805 + 2754 658 + 277 2625 + 2636 277 + 2806 2005 + 610 2806 + 2807 1926 + 348 2807 + 2000 2514 + 47 2000 + 2444 47 + 2507 2801 + 2498 1717 + 2809 2808 + 2560 2809 + 2532 2560 + 2808 2532 + 2782 2418 + 2810 2775 + 2570 2810 + 2752 2679 + 2540 2748 + 291 1886 + 2811 291 + 1887 2811 + 2812 2800 + 2813 2812 + 1938 2813 + 2144 2494 + 2637 1820 + 2814 2163 + 2510 2814 + 2815 1945 + 2496 2815 + 1832 2709 + 589 2746 + 2816 2610 + 2746 2816 + 992 2713 + 2817 992 + 2818 2817 + 2713 2818 + 2563 2814 + 2814 999 + 42 158 + 1738 2650 + 2193 1740 + 1844 783 + 2820 2819 + 2518 2820 + 2819 2517 + 2057 2607 + 2615 2433 + 1995 2615 + 2821 1263 + 1710 2821 + 300 2545 + 2778 1591 + 580 454 + 305 2666 + 2201 305 + 2667 2201 + 2822 1992 + 878 2822 + 1992 1395 + 2388 2823 + 2784 2388 + 2824 2784 + 2823 2824 + 604 2825 + 2825 2537 + 2464 2587 + 2246 2464 + 2826 2691 + 2827 2826 + 691 2827 + 407 2828 + 2808 406 + 2828 2808 + 2723 1950 + 1948 2242 + 2604 704 + 708 2107 + 1646 1168 + 2218 2202 + 2759 2829 + 2829 2712 + 692 2275 + 1528 2565 + 2138 1531 + 2777 2721 + 2722 2776 + 2830 2798 + 2831 2830 + 2832 2831 + 2798 2832 + 1825 330 + 302 2693 + 2828 1049 + 2531 2828 + 2477 2531 + 2744 931 + 2380 2744 + 2514 1867 + 1864 2243 + 2112 2548 + 1031 2188 + 2833 1031 + 2189 2833 + 742 558 + 559 745 + 278 2624 + 2772 1597 + 2834 1745 + 2633 2834 + 1001 747 + 1104 1499 + 2060 981 + 1613 1680 + 1681 2769 + 2508 181 + 2835 1552 + 2576 2835 + 1551 2576 + 2362 2006 + 1496 1068 + 2261 2014 + 812 2340 + 1717 2093 + 2836 113 + 1928 2836 + 2758 2302 + 2837 2098 + 1590 2837 + 2556 1590 + 2831 2586 + 2587 2830 + 2307 300 + 2839 2838 + 2373 2839 + 2838 2505 + 2248 2192 + 2781 2840 + 1522 2781 + 2840 1523 + 2841 2579 + 284 2841 + 2676 1435 + 2795 2676 + 1058 2795 + 2288 2497 + 556 871 + 1462 556 + 2842 1814 + 2843 2842 + 1796 2843 + 2069 2830 + 1867 1558 + 1992 628 + 226 1441 + 2844 2254 + 2477 2844 + 2845 1921 + 1597 2845 + 2730 2638 + 2572 2730 + 2846 2685 + 2819 2846 + 2847 2819 + 2685 2847 + 2849 2848 + 2839 2849 + 2848 2838 + 2845 1295 + 2585 2845 + 2850 376 + 1921 2850 + 1775 846 + 2451 1775 + 2054 1946 + 2630 1051 + 2833 2393 + 1051 2833 + 1576 2805 + 2375 2843 + 2473 2812 + 2813 2090 + 2653 1126 + 2851 2211 + 2678 2851 + 875 1310 + 1311 1455 + 2358 2543 + 1704 2358 + 985 2852 + 2832 984 + 2852 2832 + 1964 416 + 2268 1964 + 357 2677 + 33 1680 + 1850 2698 + 2699 1849 + 1125 2789 + 2789 2291 + 130 2559 + 2659 112 + 2520 2275 + 2854 2853 + 2855 2854 + 2856 2855 + 2853 2856 + 1006 892 + 2752 2851 + 2220 2857 + 2857 2688 + 2778 2277 + 2276 1591 + 2858 2060 + 621 2858 + 2003 423 + 2847 605 + 1732 2859 + 2859 2816 + 2743 1158 + 2499 2093 + 2860 2689 + 2274 2860 + 2246 2602 + 2861 2846 + 2820 2861 + 2183 510 + 510 2067 + 2617 2167 + 2336 2616 + 157 2586 + 2831 2751 + 2445 46 + 1971 92 + 2092 1710 + 2862 1765 + 2863 2862 + 1766 2863 + 51 1396 + 2708 51 + 652 1328 + 2858 980 + 2471 1379 + 182 2471 + 639 2394 + 2087 846 + 2378 2384 + 2672 2378 + 2385 2672 + 2627 554 + 381 2432 + 204 1528 + 1529 2779 + 1557 143 + 43 2660 + 2148 1044 + 387 2718 + 2864 2750 + 2718 2864 + 1168 2754 + 2865 2670 + 2306 2865 + 2154 255 + 2269 964 + 2740 2269 + 2326 2740 + 964 2326 + 2852 2729 + 2751 2852 + 1149 2648 + 2649 2770 + 108 1697 + 1698 2233 + 2190 2284 + 2457 770 + 2110 2260 + 2497 2130 + 118 2750 + 2866 118 + 2864 2866 + 2867 399 + 1315 2867 + 1289 2591 + 2200 1960 + 1898 573 + 2868 50 + 2708 2868 + 2354 2807 + 900 2354 + 2870 2869 + 2871 2870 + 2872 2871 + 2869 2872 + 2756 682 + 2873 2756 + 841 2873 + 2208 994 + 1879 2208 + 1244 1311 + 409 2788 + 2874 2675 + 2795 2874 + 1674 322 + 1059 2794 + 1248 2175 + 2559 2296 + 1150 2330 + 2486 2475 + 2476 2571 + 1270 1134 + 2875 18 + 2876 2875 + 19 2876 + 2631 640 + 442 2630 + 640 442 + 2198 2843 + 1763 2379 + 2877 1763 + 2041 2877 + 2857 554 + 2626 2857 + 2878 137 + 684 2878 + 2325 1875 + 2220 2328 + 2657 2727 + 2879 90 + 2880 2879 + 91 2880 + 2881 2766 + 2882 2881 + 2764 2882 + 1086 2883 + 2611 1086 + 2884 2611 + 2883 2884 + 2282 2439 + 1991 2281 + 2885 1232 + 2886 2885 + 499 2886 + 2887 2624 + 2366 2887 + 702 2720 + 2675 702 + 2006 2755 + 2888 2719 + 702 2888 + 2216 1469 + 2438 2765 + 2578 1590 + 2571 196 + 423 2818 + 2774 2889 + 2889 2369 + 2890 1343 + 2891 2890 + 1342 2891 + 2766 628 + 2885 2892 + 2893 2885 + 1911 2893 + 2892 1911 + 2235 2483 + 698 1185 + 2603 2750 + 2261 1118 + 2301 1514 + 2894 2301 + 1350 2894 + 2895 2289 + 2896 2895 + 2468 2896 + 1089 2737 + 1280 1371 + 1749 2760 + 2834 2331 + 2897 2862 + 2522 2897 + 2863 2522 + 2898 1696 + 2899 2898 + 1693 2899 + 2829 1850 + 2900 2829 + 1851 2900 + 2747 2805 + 2472 2859 + 2618 1023 + 2405 1904 + 2884 2775 + 2901 2884 + 2810 2901 + 2856 1343 + 2890 2855 + 496 2382 + 2902 2616 + 2558 2902 + 1336 1287 + 2874 701 + 69 583 + 907 2549 + 1229 907 + 2643 1201 + 2903 2470 + 182 2903 + 112 2118 + 2493 2227 + 2620 2493 + 349 552 + 2547 381 + 2904 1211 + 2905 2904 + 1212 2905 + 2903 1969 + 2319 2903 + 2500 977 + 2906 1380 + 1819 2906 + 2899 2809 + 2561 2899 + 1693 2907 + 2907 2809 + 1794 564 + 2772 1295 + 2567 2116 + 2017 2595 + 121 2017 + 2163 274 + 2893 2472 + 1231 2893 + 2901 2613 + 104 1986 + 2815 2874 + 996 2592 + 787 2823 + 689 2413 + 493 1506 + 2882 2704 + 2705 2881 + 2747 787 + 1830 729 + 2909 2908 + 430 2909 + 2908 2021 + 912 2012 + 2009 1842 + 2606 2398 + 2910 2739 + 2398 2910 + 2549 2695 + 1036 1570 + 2506 1035 + 1371 1267 + 1142 1370 + 2106 1488 + 824 2106 + 2699 609 + 60 1849 + 756 1014 + 2912 2911 + 2913 2912 + 2914 2913 + 2911 2914 + 2916 2915 + 2917 2916 + 2918 2917 + 2915 2918 + 833 2777 + 143 833 + 1969 183 + 2621 2873 + 2920 2919 + 2921 2920 + 2922 2921 + 2919 2922 + 2873 1242 + 2620 1780 + 2923 1262 + 2821 2923 + 793 1694 + 2346 793 + 2924 70 + 2427 2924 + 2694 1879 + 1878 2745 + 2868 2603 + 2603 1585 + 367 2334 + 2926 2925 + 2927 2926 + 2917 2927 + 2925 2917 + 2913 2428 + 2928 2913 + 2429 2928 + 2749 1877 + 1512 454 + 1952 2054 + 2879 2338 + 2339 90 + 2002 2818 + 2364 700 + 700 2495 + 2929 2544 + 2865 2929 + 2196 355 + 355 1662 + 2827 70 + 2924 2826 + 2648 73 + 24 2570 + 2405 2674 + 1895 105 + 1614 1898 + 2799 2791 + 2792 1939 + 2810 25 + 504 2810 + 1032 2518 + 2530 2803 + 2887 2529 + 2803 2887 + 2930 2753 + 1013 2930 + 2932 2931 + 2849 2932 + 2931 2848 + 2933 2817 + 2002 2933 + 2934 1520 + 2898 2934 + 2073 2898 + 1735 2739 + 2739 2298 + 2647 1997 + 2842 2647 + 2110 2227 + 315 2637 + 2638 333 + 2935 382 + 2892 2935 + 383 2892 + 407 1048 + 2304 1447 + 2910 2301 + 2547 2431 + 2923 2689 + 2860 1262 + 1920 2935 + 2936 1919 + 2935 2936 + 2147 1135 + 2885 2936 + 109 2663 + 179 1544 + 2721 834 + 2682 1351 + 2771 1774 + 2937 2274 + 1178 2937 + 2717 2268 + 2938 2558 + 2156 2938 + 220 2654 + 708 1780 + 2939 1832 + 2760 2939 + 2801 2330 + 2686 1607 + 190 2757 + 2440 2101 + 2904 994 + 2578 2940 + 2940 2837 + 2905 993 + 2941 605 + 2942 2941 + 2847 2942 + 2912 2943 + 2944 2911 + 2943 2944 + 2915 2945 + 2946 2918 + 2945 2946 + 2948 2947 + 2731 2948 + 2949 2731 + 2947 2949 + 426 1932 + 765 2939 + 1749 765 + 1727 455 + 831 835 + 455 831 + 2779 397 + 2950 1006 + 275 2950 + 1766 1155 + 40 2723 + 230 2951 + 2925 229 + 2951 2925 + 2877 1155 + 1372 2333 + 2952 2130 + 2288 2952 + 967 1733 + 984 53 + 2695 908 + 2938 2908 + 2953 2938 + 2909 2953 + 2928 2943 + 2954 2927 + 2918 2954 + 2955 2948 + 2732 2955 + 2914 2797 + 2951 2916 + 2956 1353 + 715 2956 + 2574 2285 + 1693 2787 + 2788 2907 + 2022 351 + 412 2478 + 2957 548 + 2958 2957 + 549 2958 + 2526 1910 + 2389 1509 + 2711 2036 + 703 2959 + 2960 703 + 2568 2960 + 2959 2568 + 2962 2961 + 2871 2962 + 2961 2870 + 2499 1852 + 2963 296 + 2964 2963 + 297 2964 + 453 1509 + 61 1848 + 2056 778 + 1418 2820 + 2965 1614 + 2929 2965 + 1654 2333 + 2646 2199 + 2160 2231 + 2232 2159 + 2883 1521 + 219 2883 + 2967 2966 + 2968 2967 + 2969 2968 + 2966 2969 + 682 2970 + 2970 2878 + 2971 385 + 865 2971 + 2681 2292 + 2806 2681 + 1060 2972 + 614 1059 + 2972 614 + 2299 906 + 1454 1619 + 361 1722 + 2973 2869 + 2961 2973 + 2970 2634 + 2785 1308 + 2866 289 + 141 2933 + 2975 2974 + 2862 2975 + 2974 1765 + 2881 2264 + 1772 2401 + 676 2933 + 600 1141 + 2923 2092 + 2139 2423 + 2891 2976 + 1653 2890 + 2976 1653 + 2846 1851 + 2790 2977 + 2978 2793 + 2977 2978 + 2469 2487 + 1311 2459 + 1618 1455 + 2965 573 + 2971 2728 + 2076 2327 + 1864 2602 + 1061 2921 + 2922 1060 + 413 116 + 2253 412 + 2610 1910 + 2711 2614 + 2355 1926 + 583 2827 + 2964 2886 + 575 2964 + 2844 412 + 2149 2868 + 2726 2967 + 2968 2725 + 2811 2707 + 2979 1653 + 2957 2979 + 1025 2957 + 2458 2654 + 2534 2665 + 2980 276 + 2636 2980 + 2945 2911 + 2944 2946 + 406 2907 + 2981 983 + 2872 2981 + 980 2872 + 2880 2598 + 535 1977 + 2588 1914 + 2835 2588 + 1899 2835 + 2759 2698 + 2983 2982 + 2091 2983 + 2982 766 + 2974 2715 + 2487 2442 + 651 728 + 2984 2954 + 2946 2984 + 2943 2984 + 2049 1625 + 2542 2908 + 1844 2422 + 1927 1725 + 2359 2021 + 2542 2359 + 2985 2073 + 2339 2985 + 143 214 + 1953 1654 + 2986 2906 + 1946 2986 + 2900 1418 + 1729 2900 + 2733 2956 + 2669 2817 + 504 2613 + 2651 2950 + 2371 2618 + 2902 2371 + 2987 2503 + 969 2987 + 263 2761 + 289 2888 + 2960 128 + 2888 2960 + 2822 2281 + 560 502 + 168 2802 + 1018 493 + 2988 1018 + 490 2988 + 2989 1086 + 2612 2989 + 1244 2458 + 2386 2990 + 2991 2385 + 2990 2991 + 2992 1763 + 2716 2992 + 2510 998 + 2895 2129 + 2952 2895 + 2836 2617 + 2994 2993 + 2855 2994 + 2993 2854 + 2853 8 + 601 2853 + 2995 601 + 8 2995 + 2997 2996 + 2932 2997 + 2996 2931 + 2077 2341 + 2977 2998 + 2999 2978 + 2998 2999 + 1014 135 + 3000 1013 + 135 3000 + 2986 1381 + 1307 586 + 186 1306 + 2941 2825 + 701 2496 + 1759 2891 + 2634 1759 + 2256 792 + 2585 2850 + 2867 2172 + 1508 2056 + 2199 2842 + 1352 2839 + 1625 1997 + 3001 879 + 2280 3001 + 2573 92 + 1920 1407 + 2707 2729 + 2963 2671 + 2991 296 + 2671 2991 + 2816 1909 + 2867 2541 + 1736 2738 + 2588 2577 + 2748 2823 + 1713 743 + 2221 1716 + 781 1954 + 3002 755 + 2535 3002 + 294 2318 + 413 2604 + 2896 2191 + 2248 2896 + 3003 2325 + 1302 3003 + 2251 1066 + 618 980 + 2369 2921 + 2597 2535 + 2971 2865 + 2926 1132 + 2849 1349 + 1515 2932 + 2651 892 + 591 760 + 3002 2165 + 3004 2893 + 1909 3004 + 587 2665 + 2179 1522 + 3005 345 + 2989 3005 + 2402 1004 + 2380 2992 + 2741 2235 + 2609 2462 + 2377 2894 + 1351 2377 + 2886 1919 + 3006 42 + 2710 3006 + 2861 2900 + 3007 2971 + 3008 3007 + 865 3008 + 2697 1378 + 3009 2930 + 3000 3009 + 2988 1954 + 2600 1768 + 1325 2600 + 2773 2655 + 3004 2859 + 3010 1588 + 3011 3010 + 1320 3011 + 1087 1521 + 2719 2866 + 291 2980 + 2683 2942 + 1772 1669 + 2982 2709 + 2939 2982 + 1676 735 + 2949 14 + 2989 2949 + 14 3005 + 2934 2561 + 3012 2981 + 2869 3012 + 1001 2655 + 1082 1378 + 404 2626 + 3000 3013 + 3014 3009 + 3013 3014 + 342 359 + 3015 145 + 3016 3015 + 2452 3016 + 1529 396 + 2796 938 + 2940 1806 + 2958 2855 + 2855 2979 + 3017 2880 + 1200 3017 + 2376 2682 + 2724 2376 + 2970 539 + 970 3011 + 2540 2824 + 3018 2860 + 2937 3018 + 3011 2609 + 2608 3010 + 2364 2959 + 3019 572 + 2965 3019 + 3012 2029 + 2650 260 + 3020 166 + 3021 3020 + 167 3021 + 527 763 + 419 791 + 792 418 + 2969 3022 + 2661 2968 + 3022 2661 + 2813 953 + 2889 2920 + 1214 2796 + 2734 3003 + 2763 2734 + 3015 1253 + 2480 1101 + 3024 3023 + 2993 3024 + 3023 2854 + 1805 2841 + 3012 3025 + 3025 2673 + 3007 2929 + 2040 1891 + 132 3013 + 2222 1896 + 2601 1871 + 1925 2437 + 1895 1986 + 1696 2985 + 3026 1588 + 2608 3026 + 3027 2264 + 2705 3027 + 2978 1200 + 1201 2793 + 3007 3019 + 3028 2995 + 9 3028 + 618 2871 + 1752 2937 + 3019 462 + 2976 937 + 2973 3025 + 3027 1559 + 3030 3029 + 2993 3030 + 3029 3024 + 3020 549 + 2876 3031 + 2897 2875 + 3031 2897 + 521 3032 + 2804 524 + 3032 2804 + 3034 3033 + 2997 3034 + 3033 2996 + 2998 3035 + 3036 2999 + 3035 3036 + 2612 2731 + 1515 3034 + 3003 1480 + 3006 2091 + 161 3006 + 3008 462 + 2792 2643 + 3037 2972 + 2922 3037 + 431 2953 + 3018 1753 + 2313 2987 + 3023 8 + 2953 2902 + 3036 1200 + 2983 2710 + 2782 1864 + 2822 3001 + 3039 3038 + 3022 3039 + 3040 3022 + 3038 3040 + 3041 3020 + 2994 3041 + 3021 2994 + 2947 13 + 2522 18 + 2990 295 + 3032 2644 + 3042 344 + 3005 3042 + 2940 2841 + 2958 3041 + 2919 3043 + 3043 3037 + 698 2423 + 2966 3039 + 3031 2975 + 3044 2484 + 3045 3044 + 2485 3045 + 2262 2840 + 830 1306 + 3046 2661 + 3040 3046 + 324 2780 + 3047 2491 + 3048 3047 + 2492 3048 + 1952 2986 + 2484 2398 + 2880 2492 + 3048 3017 + 3036 3048 + 1812 3002 + 3029 3049 + 3049 3023 + 3046 2225 + 3034 3044 + 3045 3033 + 527 2376 + 3035 3047 + 2397 3044 + 3050 2930 + 3014 3050 + 2955 13 + 15 3042 + 619 2962 + 3051 2942 + 2684 3051 + 3052 792 + 1587 3052 + 3028 602 + 343 358 + 3021 3030 + 3049 11 + 2523 17 + 3053 2225 + 3054 3053 + 3046 3054 + 3038 3054 + 3055 1135 + 2145 3055 + 3051 2825 + 62 2684 + 3026 3052 + 3056 2768 + 1299 3056 + 3057 2972 + 3043 3057 + 3057 617 + + + 0 1 2 + 3 4 2 + 5 6 7 + 8 9 7 + 10 11 12 + 13 14 12 + 15 16 17 + 18 19 17 + 20 21 22 + 23 24 22 + 25 26 27 28 + 29 30 31 32 + 33 34 35 36 + 37 38 39 40 + 41 42 43 44 + 45 46 47 48 + 49 50 51 52 + 53 54 55 56 + 57 58 59 60 + 61 62 63 64 + 65 66 67 68 + 69 70 71 72 + 73 74 75 76 + 77 78 79 80 + 81 82 83 84 + 85 86 87 88 + 89 90 91 92 + 93 94 95 96 + 97 98 99 100 + 101 102 103 104 + 105 106 107 108 + 109 110 111 112 + 113 114 115 116 + 117 118 119 120 + 121 122 123 124 + 125 126 127 128 + 129 130 131 132 + 133 134 135 136 + 137 138 139 140 + 141 142 143 144 + 40 145 146 147 + 148 149 150 151 + 152 153 154 155 + 79 156 157 158 + 159 160 161 162 + 50 163 164 165 + 166 167 168 169 + 170 171 172 173 + 174 175 176 177 + 178 179 180 181 + 182 183 184 185 + 186 187 188 189 + 190 191 192 193 + 194 195 196 197 + 198 199 200 201 + 202 203 204 205 + 206 207 208 209 + 210 211 212 213 + 214 215 216 217 + 218 219 220 221 + 222 223 224 225 + 226 227 228 229 + 215 230 231 232 + 233 234 235 236 + 237 238 239 240 + 241 242 243 244 + 245 246 247 248 + 249 250 41 251 + 252 253 254 255 + 256 257 258 259 + 260 261 262 263 + 264 265 266 267 + 268 269 270 271 + 272 273 274 275 + 276 277 278 155 + 279 280 281 282 + 283 284 285 286 + 287 288 289 290 + 291 199 292 293 + 294 295 296 297 + 298 299 300 301 + 302 303 304 133 + 305 306 307 308 + 309 310 311 312 + 313 314 315 316 + 317 318 319 320 + 321 322 323 324 + 325 326 327 328 + 329 330 244 331 + 332 333 334 335 + 336 337 338 339 + 340 341 342 343 + 344 345 346 347 + 348 349 329 350 + 351 352 353 354 + 355 356 357 358 + 359 360 361 362 + 363 364 365 366 + 367 368 369 370 + 371 372 373 374 + 375 376 377 378 + 379 380 381 382 + 383 384 385 386 + 387 388 389 390 + 391 392 393 394 + 395 396 397 398 + 399 400 401 402 + 403 404 405 406 + 407 408 409 410 + 411 412 413 414 + 415 416 417 418 + 419 420 421 422 + 423 424 425 426 + 427 428 429 430 + 431 432 433 434 + 435 436 437 438 + 439 440 441 442 + 443 444 445 446 + 447 210 448 274 + 449 450 451 452 + 453 454 455 456 + 457 458 459 460 + 410 461 462 463 + 49 464 465 466 + 62 467 468 469 + 470 471 472 473 + 474 273 475 476 + 477 478 479 480 + 481 482 483 484 + 485 486 487 488 + 452 489 490 491 + 492 493 494 495 + 496 497 498 499 + 500 501 502 503 + 504 44 505 506 + 507 508 509 510 + 511 443 512 513 + 514 515 516 27 + 517 518 519 520 + 521 522 523 524 + 525 526 527 528 + 529 530 531 258 + 532 533 534 535 + 536 537 538 539 + 540 541 542 166 + 543 544 545 546 + 547 548 549 550 + 551 552 553 554 + 555 556 557 345 + 558 559 560 561 + 562 563 564 565 + 566 567 568 569 + 570 571 572 573 + 574 575 576 577 + 578 579 580 581 + 554 582 98 583 + 584 585 586 587 + 588 589 590 591 + 592 593 594 595 + 596 597 598 599 + 600 601 602 603 + 604 605 606 607 + 608 520 609 610 + 611 612 613 614 + 615 616 617 618 + 619 620 621 532 + 622 623 624 625 + 626 627 628 629 + 630 631 197 632 + 633 634 635 636 + 637 638 559 639 + 640 641 642 643 + 644 442 645 646 + 647 648 649 650 + 651 144 652 653 + 654 655 656 657 + 658 659 660 661 + 662 663 664 665 + 666 667 668 669 + 670 671 672 673 + 674 675 676 677 + 678 679 680 681 + 682 683 684 685 + 686 687 688 689 + 690 691 692 693 + 694 695 696 697 + 698 182 699 700 + 701 702 703 704 + 705 706 707 708 + 709 710 711 712 + 713 714 715 716 + 583 97 717 718 + 355 719 720 721 + 722 178 723 99 + 724 725 726 727 + 728 729 730 731 + 732 733 734 735 + 736 737 738 739 + 740 741 742 743 + 744 745 746 499 + 323 477 747 748 + 749 750 751 752 + 753 754 755 756 + 757 758 759 760 + 548 761 762 763 + 764 765 766 767 + 768 769 770 771 + 772 773 774 775 + 776 777 778 779 + 780 781 782 205 + 783 784 785 786 + 787 788 789 790 + 791 792 793 794 + 795 248 796 797 + 517 798 799 800 + 801 26 802 803 + 804 805 806 807 + 808 809 810 667 + 811 812 813 814 + 815 816 817 818 + 819 820 821 101 + 822 823 824 825 + 672 826 827 828 + 236 829 770 830 + 831 832 833 834 + 791 835 613 836 + 837 838 379 839 + 840 841 540 842 + 843 844 845 846 + 847 848 849 850 + 851 852 853 352 + 786 854 855 856 + 857 858 859 860 + 861 862 863 593 + 864 865 866 867 + 868 869 870 871 + 872 873 874 875 + 876 877 514 801 + 878 510 879 585 + 880 598 881 843 + 882 883 884 885 + 886 887 888 889 + 890 891 892 893 + 894 161 895 896 + 897 898 899 900 + 901 902 903 904 + 905 906 907 908 + 240 909 910 911 + 912 796 913 914 + 915 916 917 918 + 919 580 920 921 + 922 923 924 925 + 926 927 928 341 + 787 929 930 931 + 932 933 934 935 + 936 937 938 939 + 940 941 942 839 + 943 944 945 946 + 947 948 949 740 + 565 230 950 951 + 952 953 954 955 + 956 957 958 729 + 73 959 960 961 + 962 963 342 964 + 965 966 967 88 + 968 969 519 970 + 971 972 973 974 + 975 86 976 977 + 978 572 979 980 + 981 152 982 983 + 478 322 984 985 + 986 987 988 989 + 990 991 992 768 + 993 994 995 996 + 997 998 373 999 + 1000 1001 1002 1003 + 1004 1005 1006 1007 + 1008 1009 1010 1011 + 1012 1013 1014 1015 + 861 1016 1017 1018 + 962 1019 1020 1021 + 1022 1023 1024 1025 + 1026 1027 1028 1029 + 1030 1031 595 1032 + 1033 1034 1035 1036 + 1037 1038 1039 231 + 825 1040 1041 1042 + 1043 427 829 1044 + 1045 1046 1047 1048 + 1049 1050 862 1051 + 1052 1053 1054 489 + 162 1055 1056 1057 + 493 1058 1059 1060 + 752 1061 1062 1063 + 1064 1065 358 1066 + 1067 1068 1069 1070 + 1071 1072 629 1073 + 1074 1075 1076 1077 + 1078 1079 1080 233 + 1081 1082 1083 1084 + 1085 1086 1087 1088 + 1089 1090 299 1091 + 1092 606 1093 908 + 1094 1095 1096 1097 + 1098 1099 1100 1101 + 1102 1103 1104 921 + 1105 803 1106 1107 + 1108 209 1109 1110 + 503 1111 1112 1108 + 498 1113 1114 1115 + 1116 1117 1118 1017 + 1119 1120 1121 758 + 1122 1123 579 1082 + 1124 1125 1126 1127 + 1128 1129 1130 1131 + 663 1132 318 1100 + 757 1133 1134 1135 + 1136 684 1137 1138 + 1139 931 1140 1141 + 1142 300 1143 1144 + 71 1145 1146 1147 + 1148 1149 1150 1151 + 883 1152 1153 1154 + 431 1155 1156 1157 + 1158 1159 468 1160 + 1161 1162 217 1163 + 1164 1165 159 1166 + 516 1167 1168 1169 + 1170 1171 1172 508 + 1173 406 1174 1175 + 1176 1177 1178 1179 + 674 1180 1181 1182 + 695 1183 1005 1184 + 591 176 1185 1186 + 1187 1188 1189 1190 + 1191 1192 1193 1194 + 1195 1196 957 1197 + 1198 1199 1200 1201 + 1202 654 1203 1204 + 255 1205 1206 1207 + 1208 1209 1210 1211 + 953 856 1212 1213 + 1214 1215 80 1216 + 1217 1218 1219 1053 + 1220 1221 1222 1223 + 1224 1225 1226 1227 + 1228 1229 1230 1231 + 1232 1097 1233 1160 + 1234 1235 1236 1237 + 1238 1239 1240 1241 + 1242 1243 1244 1245 + 1246 1247 1248 1249 + 1069 1250 1251 1227 + 1252 1253 1254 1009 + 1255 1256 1257 1258 + 866 1259 1260 838 + 1261 1262 1263 1264 + 1265 1266 1267 1268 + 1269 1270 1271 739 + 1272 1273 1274 898 + 1275 1276 313 1277 + 1278 419 1071 960 + 1279 1280 1281 1282 + 805 1283 1284 1285 + 1286 1287 1242 1288 + 1289 1290 1291 1292 + 260 1293 1294 1295 + 1296 1297 1298 1299 + 1300 1301 1302 84 + 362 1303 1304 1305 + 1306 327 1063 1307 + 1308 1309 1310 1311 + 1312 1313 1314 1315 + 1316 1317 1318 1189 + 1319 1320 945 1321 + 894 1322 1323 1055 + 1324 1325 1326 1327 + 1328 1149 1329 1330 + 1331 1332 1183 694 + 279 1333 1334 1335 + 1163 216 1336 531 + 1337 1338 1339 1340 + 1341 1342 1343 154 + 1344 1345 1346 1347 + 1348 798 608 1349 + 1350 388 1351 1352 + 89 1353 1354 1355 + 1011 1356 1357 1212 + 1358 1359 1360 1361 + 1362 1363 1364 1365 + 1051 1018 1366 1367 + 1368 237 1369 1370 + 1371 1306 1372 1373 + 1374 1375 370 1376 + 1377 1378 1379 1380 + 1381 521 1382 1383 + 1384 1385 1386 1387 + 1388 296 1389 1390 + 1391 1392 1215 460 + 1393 453 1394 1395 + 1396 1397 1398 1399 + 1400 1401 1339 1402 + 1075 1403 1404 1405 + 1406 1407 1408 1409 + 1410 1411 1412 1413 + 1414 1415 950 214 + 1416 1417 1418 1419 + 1420 1421 1422 1423 + 1260 1424 476 380 + 1425 1426 1427 1428 + 1429 1430 1431 1432 + 1433 1434 1435 1436 + 566 1437 1438 1439 + 1440 1441 1442 1443 + 1444 1377 1445 1446 + 1447 1448 1449 1450 + 1451 1452 1453 1454 + 38 1455 1456 497 + 1457 1458 1459 96 + 1460 713 1461 316 + 1462 1463 1464 1465 + 1466 1467 1468 1469 + 792 1470 1471 502 + 1291 1379 1472 1315 + 1473 814 1474 1475 + 1476 1477 822 1478 + 1479 1480 1481 1482 + 1483 1484 1485 1486 + 1487 1488 1489 1490 + 1491 1492 746 1493 + 871 1494 1495 1496 + 1497 1498 1499 1500 + 1501 1502 1503 1170 + 1504 1505 535 1506 + 1507 1508 1509 1484 + 1194 1510 1511 1512 + 719 1065 1513 1514 + 1515 1516 1517 1312 + 1518 1519 1520 632 + 647 1521 1522 1523 + 1524 1525 919 1526 + 1527 1528 1529 1530 + 91 1531 1532 1533 + 1273 1534 1130 1440 + 1535 1536 1537 1538 + 1539 1540 1261 1541 + 1542 1543 1544 1545 + 1546 1547 1548 1549 + 1550 1551 1552 1553 + 1554 1555 1375 1556 + 1557 1558 1559 948 + 1382 1560 1561 1562 + 1563 1564 1565 1566 + 1397 875 1567 1568 + 1569 1570 1571 1572 + 1573 1574 1575 1576 + 788 1139 1577 1578 + 1579 1580 1581 1582 + 1506 1583 1584 1585 + 1586 1587 1588 1589 + 1590 1591 1592 1593 + 1594 1595 1596 1597 + 1598 1599 1600 1601 + 105 1602 1603 1225 + 1604 868 1205 254 + 1605 1606 1607 1608 + 1609 1610 1611 1612 + 1613 1614 1615 481 + 1326 1616 1617 1618 + 1619 1620 1621 1622 + 1623 1624 1585 1625 + 1626 1627 1628 1629 + 1630 893 1631 812 + 824 1632 901 1633 + 1486 1634 1635 1636 + 1637 760 1638 1639 + 1117 1640 1641 1642 + 106 1224 1643 1529 + 324 1644 946 1645 + 1646 1647 1648 657 + 1649 1650 1651 1652 + 1033 1653 1654 1655 + 1656 1657 1658 1545 + 251 504 1659 1660 + 763 1661 1662 1663 + 180 1664 1665 1666 + 1667 1668 1669 191 + 1670 1671 1672 1446 + 1673 1674 1675 1676 + 1677 651 1678 1679 + 1680 1122 1681 1682 + 1683 1684 1685 1686 + 1687 1688 1689 1690 + 1691 262 1692 1693 + 1694 1695 1696 456 + 1697 1698 1699 1700 + 1701 1702 1703 1704 + 1258 1705 1706 1707 + 1708 1709 1710 854 + 1711 1454 1712 1702 + 1713 1714 1045 1715 + 1716 1717 1718 1719 + 587 1720 1721 1722 + 384 1723 1724 1725 + 1244 712 1726 1727 + 1728 1729 1730 1450 + 1731 1732 1733 1734 + 1735 1736 1737 1738 + 1739 1098 506 1740 + 1741 1742 1743 1744 + 1745 1746 417 1747 + 1748 1749 1750 1751 + 407 1752 1255 1753 + 1754 1751 1755 1756 + 1757 1606 1758 891 + 1759 1760 1761 1697 + 903 1762 1307 1062 + 1763 1764 1765 1766 + 1767 1768 1769 1770 + 1771 1438 1772 707 + 1773 291 1774 1447 + 1775 1776 1777 1778 + 1779 1136 1743 1780 + 991 1781 1782 1000 + 1783 1784 1785 1786 + 1787 402 1788 1789 + 1790 1791 1123 1792 + 1793 714 1794 1795 + 1796 1797 1798 1799 + 1800 1801 1802 219 + 1803 1410 1804 1239 + 1805 1806 1229 1807 + 32 1808 1809 1810 + 1811 1812 1813 1814 + 1694 1815 1550 1452 + 1816 870 1817 778 + 1818 1753 1819 1820 + 1085 1821 1822 1823 + 1824 1825 1826 1827 + 1828 1829 1127 1830 + 1831 1832 1833 1268 + 1834 1835 1448 1836 + 1837 1838 1839 1465 + 465 1840 1841 1611 + 1842 1843 1390 1844 + 1683 1736 609 969 + 1010 1845 1846 1847 + 326 1848 1849 749 + 1850 445 1851 807 + 1852 1853 1854 1855 + 1785 1856 1857 1088 + 1858 1859 1860 1403 + 1861 1862 1863 1741 + 1864 1865 1866 1867 + 997 1868 1869 1870 + 1871 1872 1873 265 + 1773 1730 1874 200 + 1342 1875 1876 1877 + 1878 1879 1880 1493 + 1881 1882 1883 963 + 1884 1885 1886 1887 + 1888 1889 1890 1891 + 857 1892 1893 1877 + 1894 1895 1896 1897 + 1898 1899 1900 1901 + 1902 1903 1904 1905 + 1399 1906 1907 1908 + 1909 624 1910 1911 + 1912 1913 1914 1915 + 1866 1916 1917 1918 + 1919 1920 69 1921 + 1922 1592 1145 1923 + 1924 1925 1926 1775 + 1927 1928 1929 1322 + 1292 1314 1930 1479 + 1931 1932 276 1343 + 1118 1933 1934 1366 + 1935 1936 1937 1938 + 1939 1931 1893 1940 + 1941 160 1942 512 + 1141 1463 1943 1872 + 1890 1944 828 1945 + 1946 1947 1948 596 + 1949 1950 1951 1676 + 1952 1953 1954 1955 + 1956 1957 1958 1523 + 1959 1960 1961 1119 + 1962 1963 1964 1965 + 1966 1967 1968 970 + 1969 1687 1970 1971 + 1972 1973 1974 1975 + 1222 1976 1682 1977 + 1978 1979 1980 1981 + 1716 1982 1983 339 + 1984 1985 376 1986 + 1987 568 1988 1989 + 1990 1991 1992 1993 + 1763 1994 1995 1421 + 1996 1997 1998 1999 + 2000 2001 2002 721 + 2003 1920 2004 2005 + 2006 2007 261 2008 + 2009 2010 2011 2012 + 1902 2013 2014 2015 + 2016 2017 2018 2019 + 2020 2021 1540 2022 + 2023 2024 2025 2026 + 1966 518 2027 1905 + 2028 1287 2029 2030 + 2031 1901 2032 860 + 2033 2034 1115 2035 + 2036 2037 887 2038 + 2039 1656 2040 2041 + 855 2042 2043 1008 + 2044 195 932 381 + 1423 2045 2046 983 + 1309 2047 2048 1174 + 1241 2049 2050 1449 + 2051 2052 1737 1686 + 1932 1939 2053 2054 + 277 2054 2055 2056 + 2057 2058 2059 1705 + 2060 2061 876 1105 + 446 2062 895 1941 + 2063 2064 2065 2066 + 1777 2067 2068 2069 + 298 1535 2070 2071 + 1213 1357 2072 2073 + 1156 2074 2075 2076 + 2077 699 2078 2079 + 2080 2081 411 664 + 1034 2082 2083 2084 + 2085 270 2086 2087 + 2088 2089 2090 2091 + 2092 2093 54 1001 + 2094 1951 2095 2096 + 2097 2098 2099 1639 + 2100 2101 2102 2103 + 2104 2105 2106 2107 + 2108 2109 2110 2111 + 2112 2113 2114 2115 + 461 2116 2117 1886 + 2118 2119 35 1867 + 2120 2121 2122 2123 + 2124 2125 2126 2127 + 2128 2129 2130 147 + 110 2131 2132 1196 + 2133 2134 2135 2136 + 2137 1673 2094 1759 + 377 2138 2139 2140 + 220 2141 2142 2143 + 2144 2145 1574 2146 + 2147 2148 400 2149 + 1195 2150 2151 2152 + 2153 2154 2155 2156 + 2157 2158 2159 2119 + 2160 574 334 2161 + 2162 2163 2164 2165 + 321 2166 1761 2167 + 2168 2169 39 496 + 2170 1638 2171 60 + 795 2172 2173 2174 + 2004 2175 2176 2177 + 641 2178 724 2179 + 2180 2181 2182 2183 + 2184 2185 710 2186 + 1161 530 2187 1468 + 2188 2189 2190 2191 + 2192 2193 2194 271 + 1975 2195 1878 745 + 2196 1223 2197 2198 + 72 2199 1852 2200 + 2201 2202 2203 2204 + 1216 158 2205 996 + 1548 2206 2207 1718 + 2208 2209 2089 2210 + 2211 1539 2212 2213 + 2214 2215 1503 2216 + 2217 2218 2219 1036 + 2220 848 2221 2222 + 1818 2223 2224 408 + 1756 1684 968 2225 + 2226 2227 2228 2229 + 804 2230 2231 2232 + 2233 2234 131 2235 + 1290 2236 2237 1380 + 1707 2238 2239 1819 + 1025 2240 2241 2242 + 2243 2244 2245 2246 + 2247 1859 2248 1079 + 2249 2250 2251 2252 + 2253 2254 1653 2219 + 2255 1959 1135 2256 + 2257 2258 2259 1558 + 2260 1983 1429 1670 + 2261 2262 1815 455 + 1508 2263 439 2264 + 1331 2265 2266 2267 + 2268 2269 2270 2271 + 2272 2273 2274 2275 + 2276 2277 2278 2279 + 2280 2281 2282 2283 + 562 2284 2285 2286 + 2287 2288 2289 1832 + 1232 467 2290 2291 + 2292 2293 2294 2295 + 2296 2297 2154 2298 + 1784 2299 2300 2301 + 2302 2303 2304 2305 + 2162 2306 2307 2308 + 2309 2310 2311 779 + 2312 2103 2313 2314 + 2315 1868 2316 2317 + 2318 2319 2320 2321 + 2322 2323 2324 941 + 2325 2326 2327 2328 + 2329 2183 2330 2331 + 357 2332 2333 2334 + 2335 2336 2337 2338 + 2339 2340 2341 2342 + 2343 356 2002 2344 + 1049 2345 2346 2347 + 2348 2179 2349 2350 + 1709 2351 2352 2036 + 2353 2354 391 1651 + 1749 2355 2356 2357 + 1747 2358 2359 2360 + 1594 2361 2362 2363 + 2364 2365 2366 2367 + 2368 2369 2370 2371 + 2153 2372 2373 2374 + 578 2375 2376 1083 + 1002 2377 2378 2379 + 1618 2380 2381 253 + 2382 2383 2236 1289 + 2384 1218 2385 1409 + 1095 2386 2387 1587 + 604 2388 2118 1918 + 2389 2390 2391 2392 + 2393 2394 2395 2396 + 1823 1281 2136 2397 + 1262 2021 2398 2399 + 1701 2356 2400 2401 + 2334 2402 2403 1066 + 2404 2405 2406 2407 + 1337 2408 2409 2410 + 2411 2412 2413 2414 + 2415 1157 2416 1795 + 2417 2418 2419 2209 + 910 2420 2421 543 + 2422 2423 2424 2026 + 2425 2426 1661 2427 + 2428 2429 2184 2430 + 1394 1696 2431 2432 + 1492 2433 2434 2168 + 2435 2436 1398 2437 + 2438 2439 2440 2441 + 1774 2442 2443 1836 + 2444 2445 2446 2112 + 2447 2448 2049 1240 + 2449 2450 2451 2452 + 2453 2454 1840 2455 + 2456 2457 2458 2459 + 2460 2461 2462 2253 + 2463 2464 1954 2465 + 2466 2467 1803 2468 + 1300 2469 2470 2471 + 2472 2473 2447 1804 + 2474 2475 2476 1284 + 2477 2175 1919 2478 + 2479 2316 2480 2084 + 1515 1472 2481 1012 + 1406 2482 2483 2484 + 2367 2485 1556 1374 + 2413 2486 1887 2117 + 2369 2487 2488 2489 + 2283 2490 1048 2491 + 2069 241 2492 2493 + 1487 2298 2374 2494 + 2495 2496 2497 1820 + 2498 2499 2500 2501 + 2502 2503 2504 2505 + 2079 2506 2438 1949 + 2507 2508 1453 1553 + 2509 268 2510 1630 + 2511 2370 2190 2313 + 2512 2513 2514 716 + 2515 346 2516 1898 + 2517 2518 2008 1295 + 2519 2520 1865 2521 + 2522 2523 2524 677 + 2525 2526 2527 1431 + 2528 2529 2530 2531 + 2532 2533 2534 42 + 2535 2536 2537 2538 + 2539 2540 1861 1385 + 2541 1892 2032 2542 + 1704 2202 2543 2357 + 2544 2545 2546 2547 + 1347 2548 2549 2550 + 2551 1928 2552 2553 + 2554 2555 2556 2557 + 2558 2559 2560 2107 + 2561 2523 2562 2563 + 1717 338 2564 2565 + 2566 2567 2568 2569 + 2570 2571 2445 2572 + 2573 2574 2575 350 + 2576 2394 689 2577 + 218 2578 1748 2579 + 2580 2363 2581 2235 + 394 2582 2583 1652 + 2584 2585 2586 2587 + 2561 2588 2589 1573 + 2590 2591 2592 2553 + 2593 2380 2594 115 + 592 2595 2063 1016 + 2596 1961 2597 2347 + 2598 2599 1571 28 + 485 2600 2421 2601 + 2252 2602 2603 2604 + 2605 2606 2607 2608 + 1916 2520 2609 2610 + 1900 2611 2612 2542 + 2613 2614 2615 2616 + 1278 126 2617 2618 + 1995 2619 2453 2620 + 2621 2622 2623 2133 + 2624 737 1298 2625 + 1655 2626 2627 2082 + 2628 2629 2630 914 + 2581 2631 849 2632 + 2452 2633 2501 2634 + 2635 817 2636 536 + 2637 2638 2639 2640 + 2641 2642 2643 1286 + 2644 2645 1208 2646 + 2647 2648 2388 2649 + 1650 1549 2565 2650 + 1703 2651 1725 2203 + 2652 2653 2654 2655 + 1880 2656 2657 2658 + 2659 1344 2660 2661 + 2662 2663 2664 2665 + 2666 2667 588 2668 + 2033 2669 2670 2270 + 1968 2671 2672 2225 + 2673 2674 2642 1516 + 409 2675 2414 2116 + 2676 2677 2678 2679 + 2680 2681 2682 2519 + 312 2683 2684 2685 + 2686 2687 2688 2582 + 2689 2690 1750 2543 + 2005 2691 2692 2693 + 2499 2694 2611 2695 + 2696 2697 2698 2699 + 2700 2701 2702 1442 + 2703 1726 2704 776 + 2705 2706 2426 2707 + 2708 1953 2709 2180 + 2515 2031 2710 2711 + 2510 2194 2712 890 + 2713 2465 2708 2329 + 1640 1116 2066 2714 + 2137 2715 1014 2716 + 2717 204 2718 2719 + 2720 2721 1507 2722 + 2723 1293 2719 2724 + 2725 751 2726 1498 + 2727 2297 2126 2728 + 2729 2730 2731 2732 + 2016 2733 1711 2401 + 2648 924 2734 2157 + 2735 208 2736 2737 + 2738 2739 2740 1992 + 2741 2360 2742 2743 + 2012 2744 2745 2015 + 2746 2747 611 808 + 2489 2748 2749 2191 + 2271 2670 2750 2751 + 2752 2753 2754 2755 + 2756 2757 2758 2759 + 2760 2761 2762 1579 + 2763 2764 2765 2766 + 2767 2768 2192 2085 + 2769 2770 2771 802 + 1744 1138 2772 1386 + 2773 2774 2775 2776 + 2777 1182 2778 2074 + 2562 2779 1829 2780 + 2781 2782 2783 1572 + 2784 2785 2786 2787 + 2142 2788 2789 1797 + 878 2790 2229 2791 + 2792 2793 2794 2795 + 2398 2796 2797 2798 + 2681 2250 2799 2800 + 2801 2802 2064 2803 + 2804 2805 2806 2807 + 640 2764 2808 2809 + 1802 2810 2811 2141 + 2260 1445 2812 336 + 537 2813 2814 31 + 1927 896 2815 2816 + 2166 1645 1320 1698 + 2114 2817 2818 1636 + 2819 2820 2821 2822 + 2823 2824 2825 2570 + 1485 2826 2827 2828 + 2829 2830 2472 2831 + 2397 2135 2832 1086 + 1801 2671 2833 2834 + 2835 2836 2045 2837 + 2838 2435 43 2839 + 2595 1031 2840 2803 + 36 2159 2841 772 + 2842 2843 2844 2845 + 2846 2847 2848 67 + 1935 2849 2850 2851 + 1596 2852 2853 2258 + 2794 2854 2855 2856 + 2857 2858 1593 1922 + 2610 2859 2860 1991 + 2633 2451 2861 2862 + 2863 2864 2865 2866 + 2867 1427 2290 61 + 2096 2868 2869 1760 + 2870 2871 389 2872 + 1413 1602 2873 2831 + 2874 2875 2876 1328 + 2745 2877 2878 1903 + 2879 2880 2487 2368 + 2881 2882 2883 2884 + 278 1764 1420 982 + 223 936 2885 2886 + 2887 2888 2889 2890 + 2891 2892 2893 1150 + 2894 2895 2896 1742 + 294 2897 2898 2899 + 2900 2901 2902 2852 + 2220 2903 2233 2632 + 2904 2750 2905 2906 + 416 2907 2908 2358 + 2909 2910 2911 2912 + 2913 2914 2915 2916 + 2917 2918 1338 2919 + 2714 2920 2887 2921 + 2922 2923 1430 1982 + 917 2924 2925 2926 + 2927 2125 2928 2929 + 2930 2931 2932 1029 + 2933 2934 2935 2293 + 2873 108 2936 2937 + 1990 2938 605 1917 + 2939 2940 432 2415 + 2941 2942 2824 2739 + 2464 2854 2943 2944 + 2104 2945 2946 2947 + 2948 2807 2949 2950 + 366 2951 2952 2953 + 1779 2954 2955 685 + 2956 2957 2958 2959 + 2705 2960 412 2961 + 2962 1906 2436 2838 + 2963 2964 1889 1947 + 2189 2909 2965 2314 + 2966 2967 2968 2526 + 2969 2970 2971 2972 + 2973 2974 1933 1642 + 2975 92 2976 2267 + 1754 2672 1800 2579 + 2977 1369 2978 2979 + 2980 2646 2981 2982 + 2983 2984 2985 1121 + 1302 2986 2206 2987 + 2988 2808 2989 2676 + 1719 2207 2990 2991 + 2992 2993 977 2478 + 2994 2995 94 1979 + 2996 2997 2606 1848 + 2861 2998 2989 2763 + 2999 2320 2953 2256 + 3000 119 3001 2001 + 1972 744 2034 2269 + 1070 1226 3002 3003 + 1993 2740 2823 3004 + 2933 3005 3006 3007 + 3008 3009 3010 3011 + 3012 3013 3014 701 + 3015 3016 3017 2970 + 2727 3018 3019 3020 + 916 353 3021 3022 + 2541 3023 3024 1940 + 3025 3026 2554 2919 + 1895 3027 1864 34 + 3028 3029 2035 1114 + 1280 3030 282 2621 + 2353 3031 2299 1783 + 1643 1251 1622 3032 + 750 1849 2605 3033 + 3034 500 3035 3036 + 3037 2221 3038 3039 + 3040 3041 1072 422 + 3042 3043 3044 1826 + 3045 1245 3046 3047 + 2596 3048 3049 1120 + 3050 2459 3051 3052 + 614 3053 3054 809 + 827 3055 3056 3057 + 1907 3058 1714 3059 + 3060 3061 102 3062 + 2869 3063 984 2167 + 3064 3065 3066 3067 + 3068 3069 3070 3071 + 221 3072 3073 3074 + 976 3075 3076 2477 + 1635 905 3077 2115 + 2927 3078 3079 2728 + 3080 3081 920 1791 + 3082 3083 3084 1575 + 3085 3086 3087 3088 + 693 1884 3089 1237 + 2466 494 3090 3091 + 3092 3093 3094 3095 + 2980 973 571 3096 + 2512 3097 3098 2678 + 1301 3099 3100 3101 + 3102 3103 3104 3105 + 2417 3106 3107 3105 + 3108 3109 1200 1026 + 696 3110 3111 3112 + 2944 3113 3114 3115 + 3116 3117 3118 1022 + 2471 3119 3120 3099 + 929 3121 3122 3123 + 3124 3125 3126 3127 + 2939 1794 1460 3128 + 2268 3129 3130 1973 + 1812 3131 3132 2723 + 3133 3134 2195 1974 + 3135 1778 2493 3136 + 3001 3137 2701 2344 + 2638 3138 2304 3139 + 2411 3140 3141 2574 + 1140 3142 3143 1464 + 3144 3145 3146 3147 + 2165 3148 3149 1824 + 678 3150 3151 1173 + 3152 3153 2656 3154 + 1422 2620 3155 2837 + 2023 3156 527 3157 + 2889 3158 1798 3159 + 2205 3160 844 3161 + 3162 3163 3164 3157 + 3165 1263 3166 1962 + 3133 3130 2025 3167 + 2312 3168 3169 3170 + 2242 3171 2476 3172 + 900 3173 3174 1414 + 1091 2071 3175 3176 + 3177 3178 3179 3028 + 2382 1482 1856 2301 + 3180 3181 3182 3183 + 642 2348 3184 3185 + 2985 3186 2171 759 + 3187 3188 3189 918 + 904 1061 2725 3190 + 3191 3192 3193 3119 + 1443 2702 3194 3195 + 3196 1976 3197 3198 + 533 621 3199 170 + 644 2657 3200 2264 + 3201 2181 3202 3203 + 2232 3016 3204 1283 + 3205 3206 3207 3208 + 3209 2802 3210 3211 + 1547 3212 81 2987 + 2896 3213 3214 1780 + 2904 3215 2423 3216 + 3217 3218 3219 3220 + 2186 3221 3222 3223 + 709 1243 2028 3221 + 2789 3224 3225 3159 + 3201 2941 3226 3227 + 3228 3229 2303 3230 + 1727 3231 3232 3046 + 3233 3234 2559 1612 + 3235 3236 1480 1930 + 3237 3238 3239 3240 + 3241 3242 3243 3244 + 3209 3245 2920 2065 + 1439 1771 3246 3247 + 3248 3249 181 3250 + 1365 3251 3252 3253 + 3254 2623 3255 3256 + 2460 3257 3258 3259 + 3260 3261 3262 728 + 3263 3264 3265 942 + 2906 2213 3266 2440 + 1162 1467 3267 897 + 3268 257 2337 3269 + 3270 1512 3271 3272 + 3273 3274 3275 2091 + 2416 2076 3276 3277 + 3278 3279 2047 3280 + 163 466 3281 3282 + 3283 3284 3285 1478 + 1077 3286 2556 3287 + 3225 3288 3289 2890 + 3009 3290 3102 3291 + 3292 187 3293 3294 + 1318 1488 3295 3296 + 3297 3298 3299 3300 + 3216 2422 3129 2751 + 1623 2855 2463 3301 + 3302 2888 3303 3304 + 2513 2677 2998 2450 + 3305 3306 775 3103 + 3307 2187 3308 3309 + 3207 418 3310 3311 + 3312 3313 3005 2292 + 3314 3315 3316 816 + 343 1883 3317 3318 + 3305 3290 3319 3320 + 1514 3321 3322 3323 + 2177 3324 3325 2691 + 1816 3326 3327 1494 + 2010 3328 347 2711 + 3093 3329 2000 3330 + 3331 3332 3333 2281 + 3334 3335 3336 3337 + 3338 3339 3340 2210 + 3341 87 3342 3343 + 2669 3029 3344 3345 + 1845 1254 3346 3347 + 2732 1599 3348 3349 + 3211 3350 1142 3351 + 3352 3353 448 3354 + 715 3355 2929 3097 + 3275 3356 2575 3357 + 3358 3359 3360 1019 + 3213 3361 3362 2502 + 3363 3364 3365 1814 + 3366 3367 3368 3369 + 3370 3371 3372 3113 + 3373 1192 245 2174 + 2239 3374 3189 2495 + 2608 3375 3376 3377 + 3378 3379 3380 2936 + 1793 3277 3078 3355 + 3381 2634 3382 3383 + 2073 3384 2555 3385 + 2558 3386 3387 1609 + 134 3388 3389 3390 + 3391 3392 3205 3393 + 3394 2097 2170 3395 + 2106 3396 3397 3386 + 2113 2446 3398 3399 + 2825 3400 3401 3402 + 967 3273 3403 3404 + 2208 3405 3406 3106 + 1755 2690 3407 1685 + 2811 3408 3409 2788 + 3410 3192 3411 3412 + 3413 703 3414 3415 + 3416 3303 3245 3351 + 1629 3417 3418 3419 + 3420 3421 679 1175 + 1663 3422 3423 3424 + 3140 2675 2224 3339 + 2123 3425 3426 2249 + 3427 3428 3429 2273 + 3430 3431 3432 3433 + 3434 3435 3292 1799 + 2707 2425 3436 3437 + 3438 3439 2924 3022 + 3440 3441 3442 3443 + 425 2042 1710 3444 + 3107 3445 3446 3291 + 2027 800 3447 2013 + 3448 1843 3449 3450 + 3289 3451 1641 2921 + 794 3452 3453 3454 + 3455 3456 3457 3458 + 2910 2188 3459 2949 + 3460 3461 2462 3462 + 3463 3464 3219 3465 + 1451 2733 3466 1695 + 3467 1159 3468 3469 + 3470 3471 3204 3472 + 3331 3473 3122 3474 + 3475 3476 2266 3477 + 3258 3478 3479 3480 + 3481 3482 3483 3484 + 2817 3399 3485 3486 + 3128 315 3487 3488 + 3489 3490 3491 3492 + 1444 3493 3494 3495 + 3496 3497 3498 3499 + 3500 259 1336 232 + 731 3501 3502 1210 + 3503 3504 3505 3506 + 3507 981 3508 3509 + 2497 3405 3340 2223 + 3510 3511 2338 256 + 3512 469 3467 3513 + 570 3425 3514 3515 + 1740 505 2437 1568 + 3516 3517 3518 3519 + 3520 3397 2615 3521 + 646 3522 1491 2658 + 2878 3523 3524 3525 + 922 3526 3527 2858 + 3296 3528 1882 1190 + 966 3529 3530 3274 + 3522 645 3531 2433 + 3532 1789 988 3533 + 3534 3438 3535 292 + 1680 3196 3536 1792 + 2003 3537 1923 70 + 3020 3538 3539 2155 + 618 544 2600 3540 + 2498 3541 3542 3543 + 3544 3545 3546 3547 + 3548 1757 2712 3549 + 3550 3551 576 3552 + 3263 2324 3553 3554 + 599 3555 3556 3557 + 2060 3558 483 3559 + 3560 3561 3562 2308 + 3563 784 3564 3565 + 2804 3566 3567 3568 + 3333 3569 3570 3571 + 1274 3195 3572 3573 + 3172 3574 3575 3116 + 3576 3577 3429 3578 + 2647 3579 3580 925 + 2679 3098 2928 3581 + 3582 3545 3583 2430 + 880 3584 3585 3555 + 3586 3568 3587 3569 + 2231 3485 3588 3017 + 2709 3589 3590 3202 + 2230 1851 3591 3486 + 2152 2957 1809 111 + 2088 3357 3141 3338 + 3592 3018 3079 3276 + 3495 3593 3594 1378 + 3250 1666 3595 3596 + 607 1092 3597 2649 + 3598 3599 3600 3601 + 3602 3603 3604 2778 + 1436 550 3605 3391 + 3606 3607 2011 2710 + 3608 2877 3609 3610 + 1396 3611 3612 872 + 3164 3613 3614 2024 + 3615 3616 3617 3618 + 3087 3619 3056 3620 + 3621 3622 3623 128 + 437 307 3271 1511 + 3624 3625 3007 3626 + 3627 3628 3629 2491 + 1847 3630 3631 1356 + 2400 3632 3633 2017 + 3634 368 3635 491 + 3636 3637 3638 3639 + 3640 3641 3481 3642 + 1876 390 3643 858 + 2182 3227 3644 3645 + 3646 3647 3648 913 + 2022 2211 2905 3345 + 965 3341 3649 3650 + 3651 3652 2287 3653 + 2768 3654 3655 3656 + 1052 451 3657 3658 + 3659 3660 3067 3661 + 3310 1746 3662 3663 + 2050 3664 3665 1728 + 2682 3666 2859 2609 + 1384 3667 332 3668 + 3669 3670 3671 3672 + 3302 3673 3434 3158 + 171 3674 3675 718 + 2529 3676 3447 3677 + 1432 2527 3678 1671 + 3607 3679 3609 2744 + 3203 3590 3400 2942 + 3680 3286 3681 3682 + 3249 3683 3684 723 + 3685 747 3686 3687 + 3688 2660 2550 3042 + 3689 3690 2506 2078 + 2432 3691 3148 2164 + 2862 2766 3692 3541 + 3693 3121 790 3694 + 3604 3695 3592 2075 + 3696 3697 3698 3699 + 3612 2261 3700 3701 + 846 2285 3702 3584 + 3703 3063 3704 3705 + 3706 3707 3362 3708 + 2393 3709 3710 3711 + 3712 3713 3117 3714 + 293 3715 3716 2442 + 3717 3718 3719 1971 + 3720 3721 3722 3304 + 3723 3724 1501 507 + 3725 3726 3727 3728 + 3729 1644 748 3685 + 1541 3730 3705 3731 + 2138 1985 229 3732 + 3733 3734 3735 3736 + 2053 3024 104 3737 + 3547 3738 3739 2087 + 1862 3740 2774 3506 + 2280 3629 3741 3473 + 1276 3742 3743 3744 + 3745 3746 3747 3748 + 3749 3750 3751 1838 + 3752 3753 3754 3755 + 3756 3757 3758 3759 + 1604 2381 3760 3761 + 1904 3525 2833 1967 + 3436 3762 3763 1998 + 1706 3764 3765 3766 + 3693 3767 3768 3474 + 2578 3074 3632 2355 + 2700 3769 2332 2343 + 3770 3354 213 3771 + 3621 3772 3773 3774 + 3775 3776 3777 2901 + 3778 3779 3780 3781 + 3782 3783 3784 3785 + 3188 3445 3406 2496 + 2318 3786 3787 3788 + 2820 3789 3790 3791 + 3792 3793 3794 1891 + 3795 3796 1913 2590 + 2056 3797 3798 1765 + 2587 3799 2193 3656 + 3800 3801 3802 555 + 3299 1600 2731 3803 + 263 1691 780 2717 + 2584 3655 943 3729 + 3367 3804 3805 3806 + 3807 3808 3578 3809 + 1649 3810 3212 1546 + 3662 3811 3812 3813 + 2539 3668 3814 3815 + 952 3816 3817 783 + 3818 3819 3820 151 + 3821 3822 3704 2868 + 3823 3824 2973 3451 + 3825 3826 3743 3801 + 3827 63 3512 3828 + 3829 3830 2443 3716 + 3831 3832 3732 3833 + 3834 3835 3836 708 + 2630 3837 3012 3838 + 3375 3839 3628 2864 + 2525 3840 2993 3841 + 1647 3241 2396 3842 + 3843 3844 3845 1715 + 2532 250 3846 3847 + 3217 3848 3014 3849 + 1134 3850 3851 2999 + 283 3852 3853 2753 + 2983 3049 3854 3855 + 3509 2567 3753 3856 + 1834 3830 3857 492 + 3187 2926 3010 3446 + 3402 3858 3859 2571 + 3521 3860 3861 3282 + 697 3862 1915 3863 + 1497 3864 1633 3190 + 3865 459 3085 3866 + 3867 1469 3307 3868 + 3747 3376 2863 3869 + 3471 3870 3871 2474 + 2055 3737 3872 3873 + 2475 3871 3874 3574 + 1627 3875 549 3424 + 3876 3877 3878 2156 + 2713 3879 3880 3301 + 3752 3881 3759 3882 + 3036 3883 3884 3885 + 1863 3505 3886 2894 + 3887 2144 3888 1158 + 1994 3889 3890 3891 + 3892 3893 3894 3346 + 3895 3896 1522 3897 + 2583 3898 82 3810 + 3518 3899 3900 3901 + 3847 3902 3748 3903 + 2991 3904 3905 2922 + 3906 3809 3428 3599 + 0 3907 3908 3909 + 1087 3910 2354 1786 + 3911 3912 3913 3914 + 3915 3898 2688 2110 + 3059 1713 3916 1552 + 3917 2412 2573 331 + 1580 3918 1495 3919 + 3920 3921 3922 622 + 3923 3924 3925 6 + 3926 3927 3403 2090 + 3741 3928 3929 3123 + 3251 1364 2406 2428 + 3930 612 3931 3932 + 1461 2514 3933 1277 + 2969 3934 3935 3936 + 464 3937 3155 2455 + 3938 3939 3940 2359 + 2659 3941 3942 3943 + 3944 3945 2986 3101 + 414 3946 865 665 + 1952 3934 3947 3589 + 3254 3948 3949 2134 + 3950 3951 1466 3952 + 3953 3954 3955 3659 + 1576 3084 1180 2524 + 242 2068 3956 3957 + 3586 3332 3768 2805 + 3958 3959 3417 1628 + 3960 3673 3722 3961 + 3962 3811 1745 2741 + 2908 3418 3963 3938 + 3940 3964 3965 2742 + 3603 3781 3966 3967 + 3968 3969 2765 643 + 3970 3971 1166 1057 + 1060 3972 3973 3974 + 3975 3976 1590 3527 + 3804 3366 3977 3978 + 1006 1332 2976 1533 + 2616 3396 3979 3980 + 1094 2291 1426 2386 + 2019 1246 3981 3982 + 3983 3984 3985 656 + 3986 3987 3827 3988 + 2059 3989 3990 3764 + 1400 3991 3992 3993 + 3223 3994 3995 3582 + 2716 3996 3997 1674 + 3998 3999 4000 2997 + 2982 4001 4002 974 + 1387 2772 4003 1842 + 4004 4005 1113 1456 + 2121 4006 201 4007 + 3995 4008 3738 3546 + 2832 3949 392 3910 + 2923 3905 4009 3840 + 4010 4011 4012 4013 + 4014 4015 3390 4016 + 3841 4017 1855 2966 + 4018 4019 2365 4020 + 4021 4022 3226 2738 + 2930 4023 4024 2109 + 3965 4025 2885 4026 + 4027 2959 3379 4028 + 4029 3053 835 3454 + 4030 1204 4031 4032 + 4033 4034 3538 3019 + 3214 4035 4036 2954 + 4037 4038 4039 3422 + 3605 3875 4040 4041 + 951 4042 4043 4044 + 958 2132 4045 4046 + 1841 4047 4048 3233 + 4049 3708 4050 4051 + 1879 3134 4052 3154 + 4053 4054 4055 1825 + 1096 4056 4057 4058 + 4059 4060 4061 4062 + 4063 3961 4064 4065 + 3318 4066 4067 1296 + 4068 4069 4070 1067 + 4071 4072 4073 4074 + 899 3573 4075 4076 + 2754 4077 4078 4079 + 1024 4080 2552 4081 + 3707 4082 2530 2503 + 2895 3886 4050 3361 + 4083 4084 4085 4086 + 4087 3646 247 289 + 4088 1128 3516 4089 + 4090 4091 284 2752 + 4092 4093 4094 3125 + 2806 3767 4095 2911 + 4068 4096 4097 4098 + 4099 3482 4100 4101 + 4102 4103 4027 4104 + 1813 4105 4106 3911 + 837 3265 4107 867 + 4108 3944 4109 4110 + 4111 1499 4112 4113 + 4114 4115 4116 4117 + 3834 1772 4118 4119 + 1662 4120 4121 4037 + 1483 2818 4122 2722 + 3796 4123 3118 4124 + 4008 4125 4126 4127 + 3863 1914 4128 2265 + 2124 725 4129 3581 + 1509 3200 4130 2826 + 4131 3510 4132 3489 + 4055 4133 4134 3688 + 2014 3676 4135 2009 + 2816 4136 2240 4081 + 3448 4137 4138 4139 + 3642 4140 1111 1471 + 2655 4141 4142 2947 + 4143 3636 1333 3030 + 2661 4134 4065 4144 + 3132 4145 4146 1294 + 2467 4147 4148 1411 + 2886 4025 4149 1346 + 3654 4150 4151 944 + 1104 4152 4153 1526 + 1177 4154 4155 4156 + 4157 3256 3348 4158 + 4159 4160 4161 3806 + 4162 2378 4163 90 + 4151 4164 4165 1321 + 4166 888 4167 4168 + 1035 2480 999 4169 + 3239 2288 4170 1311 + 2095 4171 4172 3821 + 4173 4174 4175 3942 + 4176 3193 4177 4178 + 3045 3235 4179 1288 + 4180 4181 4182 3163 + 1415 3174 4183 4042 + 3920 4184 1964 4185 + 3859 2971 3588 3398 + 3902 3846 4060 4113 + 4186 4187 2214 1475 + 1015 4188 4189 2673 + 3327 4190 4191 3919 + 4192 4193 4194 4195 + 2469 83 4196 4197 + 3695 3967 2784 4033 + 3917 243 4198 2486 + 4199 4200 4201 8 + 4202 4203 4031 4204 + 2346 4205 4206 3048 + 4207 2769 25 1570 + 4208 4209 4210 4211 + 3182 4212 3895 4213 + 785 4214 2351 1708 + 4 4215 4216 4217 + 317 4218 1659 1101 + 1233 4058 4219 3887 + 4220 610 1735 4221 + 4222 3786 4223 4224 + 971 4225 4226 634 + 3409 4227 4228 3224 + 4229 4230 4231 4232 + 4148 4096 3003 4233 + 4228 3734 3823 3288 + 3779 4234 3083 4235 + 4236 4237 4095 3694 + 3580 4238 4239 3526 + 2729 4240 2915 4241 + 3316 4242 2813 2636 + 4243 4244 4245 4246 + 3416 1144 4247 3720 + 2326 4248 4249 3989 + 1610 3387 3520 3281 + 252 4250 1957 1327 + 3733 3881 4251 3824 + 2199 1147 4180 4252 + 4253 552 4254 3699 + 2692 4255 4256 3069 + 915 3374 4257 354 + 2257 4258 4259 1597 + 4260 1335 2278 4261 + 1646 3985 4262 3242 + 4263 4264 3714 3575 + 4265 4266 3726 4267 + 4268 1330 4269 4270 + 3229 4271 4272 3139 + 4273 4274 3986 4275 + 4276 4277 4098 4278 + 2431 3466 3982 4279 + 1625 1584 4280 2856 + 4281 4282 4082 3706 + 4283 4284 3710 4285 + 2628 3648 4286 4287 + 4288 4289 4167 2037 + 335 577 4290 3814 + 2441 3266 4171 1950 + 1677 4291 4292 141 + 4293 4294 4263 3874 + 4295 4296 3980 4297 + 4298 4299 4300 4301 + 3260 1209 4302 4303 + 2913 280 4260 4304 + 4305 3750 1566 3145 + 2439 3690 4306 3215 + 4307 3198 4308 2652 + 4141 2654 4309 4310 + 4000 3928 3839 2607 + 4311 4312 4313 207 + 4314 4315 4316 1270 + 4191 1418 2227 4317 + 4318 4319 4320 1197 + 4321 3771 4322 4093 + 4323 1938 4324 4325 + 3900 3952 3867 4326 + 3953 4327 4328 4329 + 3583 4330 4331 3252 + 4332 4333 4334 3852 + 4294 3595 4335 4336 + 3614 4337 4052 3167 + 4338 4339 4340 4028 + 4341 4342 3692 3969 + 4343 4344 2981 1211 + 4345 4346 4347 4348 + 3644 4022 4349 4350 + 4351 2880 4352 4221 + 3782 4353 4130 3153 + 4259 4354 4355 2361 + 4356 4357 3131 1811 + 4358 4359 3323 4360 + 4361 4362 2279 1334 + 2706 4363 4364 4120 + 4129 2178 2809 2988 + 2783 4061 249 4365 + 4366 3856 3882 3758 + 4317 2226 4367 1581 + 3739 4368 4150 2767 + 4369 3666 4370 4371 + 4372 4373 2770 4374 + 4375 4376 3971 4377 + 4378 4379 4140 3484 + 730 4046 4380 4381 + 2946 4382 3536 4307 + 620 4383 4384 4385 + 4192 4386 4387 2892 + 3822 4172 2212 3731 + 4388 3127 4389 1434 + 1766 3798 4390 3889 + 1186 4391 4392 2668 + 183 4393 3678 2968 + 4394 3061 4395 3913 + 4396 4397 4398 3237 + 1619 4399 4400 4401 + 2932 4402 4403 4404 + 2961 2081 4405 4363 + 3524 4406 2810 2834 + 4407 4408 371 4409 + 4410 4411 4412 156 + 4413 4414 4415 4416 + 4417 4418 4419 4420 + 4367 2790 584 4421 + 4422 4423 4424 421 + 626 4425 4426 4427 + 2801 4428 4429 4430 + 4431 4432 3941 4144 + 4433 756 4273 4434 + 3608 2870 4435 3523 + 4436 4431 4064 3721 + 3736 1351 4437 3756 + 3610 4438 3643 2871 + 4439 4440 4441 4249 + 1279 4442 3637 4143 + 3477 4128 4124 3713 + 4207 4443 4444 4374 + 4445 4446 4447 4448 + 2311 4325 3231 2703 + 2534 4449 4450 2839 + 4451 4452 4453 4454 + 4455 4456 4457 4458 + 4459 4460 4175 2041 + 4461 4462 3922 4463 + 4464 4465 4466 4467 + 2795 4280 4468 4469 + 4470 4471 234 1080 + 3530 4472 348 3356 + 4251 3755 4473 2974 + 4454 4066 3317 4474 + 474 4475 211 447 + 3407 4476 2758 2051 + 4477 2161 4478 2899 + 859 4438 3679 3606 + 4479 4480 4481 1154 + 1770 4482 4483 681 + 4484 4346 4485 1407 + 4486 4487 4488 4489 + 4490 4491 4492 1578 + 4493 4494 4248 2325 + 4308 4495 4392 4496 + 1569 4365 4497 4443 + 4498 2340 1473 2216 + 4460 224 1345 3943 + 4499 513 4500 4501 + 4502 4503 4504 4505 + 4506 2797 3178 4507 + 2540 4508 4509 3740 + 1316 4510 4511 2350 + 4074 4512 3052 4513 + 3766 4514 4257 2238 + 3687 1911 4515 2585 + 4516 4517 4518 4519 + 3812 4520 4521 4522 + 2619 3891 4523 4524 + 3543 4525 4526 2694 + 3916 3845 386 2507 + 4527 4013 4528 175 + 2296 1490 726 2127 + 2058 4529 1806 2327 + 4530 351 4514 3765 + 4531 4532 4356 3365 + 3160 157 4533 4534 + 4535 4536 4537 4538 + 4343 3502 4539 4540 + 2614 4541 4542 3860 + 3008 4420 4543 3319 + 3496 3630 4544 4545 + 3650 4546 4547 3529 + 603 4548 4549 4550 + 4286 4551 4011 4552 + 2603 1897 4553 4419 + 2560 4554 4555 2945 + 4556 623 4462 4557 + 3347 3894 4558 4559 + 4194 4560 3623 4561 + 4562 4563 4564 4565 + 687 4566 690 1236 + 2721 4567 4499 2263 + 4568 4569 4216 4570 + 4571 4200 4572 3808 + 4573 4574 4266 4575 + 458 4576 4577 3086 + 4578 4508 3815 4579 + 2990 3945 4580 4581 + 1250 4582 658 4399 + 2879 4583 682 4584 + 3553 4585 3558 1107 + 4586 4587 1555 4588 + 3344 3179 2796 2020 + 4589 4505 4590 4591 + 3680 4592 2917 2557 + 2843 145 2169 2434 + 4593 4594 3862 3112 + 3094 4595 4596 4535 + 4524 202 4047 2454 + 2330 3645 4597 4598 + 4599 4600 4601 4364 + 1538 4429 3615 4602 + 4156 4603 4604 3060 + 206 1112 4379 1981 + 3800 344 4605 4606 + 3468 3888 4607 4608 + 3151 4609 4610 403 + 4611 4612 164 3861 + 4613 4614 3109 4615 + 2935 2884 4616 4586 + 3853 4617 840 4077 + 4618 4619 4109 3100 + 4281 4049 4620 3826 + 3234 4048 782 4621 + 4622 4001 4344 4623 + 4624 4625 3326 777 + 2975 3476 4626 1353 + 2593 4627 4628 4629 + 1525 4630 4631 581 + 4627 114 4632 4633 + 4634 4635 4636 3439 + 121 4637 3388 304 + 4638 2521 3027 1894 + 4639 295 4478 333 + 1675 4640 4641 2077 + 3973 4642 4643 4276 + 1790 4382 4555 4644 + 1362 4645 4498 1502 + 385 2651 1712 2508 + 2006 4646 4647 1103 + 2650 2564 4648 3031 + 1518 196 4649 4650 + 4003 1137 4651 3449 + 4652 1608 4653 4654 + 4655 4656 4657 4658 + 2996 325 1564 4659 + 3665 4660 4661 4662 + 1837 3143 4663 4664 + 1068 4070 4665 4582 + 4666 852 4440 4667 + 4668 4669 4461 4670 + 734 4671 4375 4672 + 2828 4673 906 1634 + 732 4674 4675 2129 + 3432 4676 4677 434 + 972 633 4678 979 + 2339 4679 2509 811 + 3865 4680 4681 1391 + 4451 4682 2494 2373 + 1013 2481 3594 3996 + 3564 3817 4683 4684 + 2122 4685 471 3514 + 4686 4402 4687 4688 + 4689 4690 820 4525 + 2039 4174 1089 4691 + 3749 4664 4692 4693 + 4694 2897 4695 2457 + 3360 638 4696 4697 + 4698 4565 4699 4700 + 3287 3384 4701 3498 + 4702 3479 4703 2847 + 3878 4704 4452 2372 + 4705 227 4706 4707 + 4708 4709 3820 4710 + 4711 4467 3278 4563 + 1272 3267 3951 4712 + 4713 4714 4583 2371 + 2680 4638 2602 2251 + 4475 1424 4715 4716 + 3152 4337 4717 3783 + 4718 4719 4720 1271 + 4512 4073 267 4721 + 1978 4378 4722 4723 + 4724 4725 420 2618 + 4726 4727 702 3848 + 4728 1925 4729 137 + 1367 4730 4731 2345 + 4530 3990 4441 851 + 1393 4732 4733 4734 + 116 4735 4736 3337 + 4026 939 4737 2743 + 4738 4739 275 3353 + 676 4676 4740 4741 + 4742 4310 4573 4297 + 4743 1341 4744 3757 + 886 4745 4746 4747 + 4748 4264 4336 4749 + 2387 1425 4018 4750 + 1354 4751 1359 4752 + 4753 660 4754 68 + 2062 1850 4755 2815 + 1700 4756 4188 2715 + 4757 4758 4759 4760 + 4761 1007 4762 1768 + 4763 4764 4400 661 + 4765 4766 4767 2746 + 4768 1657 4691 3176 + 4769 3181 4770 1616 + 1238 1835 495 2468 + 3240 1310 405 4771 + 864 4772 1132 662 + 4773 3066 4410 78 + 4774 3560 4775 3959 + 189 4776 4054 1248 + 4777 4457 4069 4277 + 3232 4324 4778 4779 + 129 4780 4781 3775 + 4782 3110 4783 3458 + 3535 3021 4784 3715 + 57 3186 4785 4786 + 4787 4788 2737 4789 + 3930 4790 1470 836 + 4176 4300 4618 3120 + 4791 4792 4039 4793 + 4662 472 4794 1729 + 1980 93 4795 4311 + 2148 4623 4540 4796 + 1319 4797 4756 1699 + 4798 3972 4799 4494 + 4800 4801 4802 3725 + 4803 4804 4805 4806 + 4807 4739 4808 1519 + 4809 3452 4810 3885 + 4182 4811 4717 3613 + 556 3802 4812 3383 + 1567 4813 4814 1739 + 2704 711 4815 4624 + 4575 4816 4817 4295 + 4818 4819 4753 2848 + 4820 4821 364 2697 + 4822 4823 4824 3978 + 3423 4792 4825 3958 + 4826 3963 4775 2307 + 4827 4828 4829 4830 + 4473 4831 4730 1934 + 720 4359 4595 3330 + 4102 4707 4832 4833 + 4404 4834 4615 3108 + 4601 4835 4038 4121 + 2613 4836 4837 4838 + 4839 4840 4841 4788 + 930 3929 4842 3142 + 4178 3136 4843 4301 + 4844 4845 3968 3185 + 4846 4847 3931 2747 + 4146 4486 4848 2517 + 4849 4226 4850 4851 + 4852 4853 4854 4855 + 4856 4090 4154 4857 + 46 4078 842 4858 + 4331 4859 2342 4860 + 1817 4861 2536 2309 + 2777 1155 4677 675 + 4862 4863 3984 4864 + 4036 1349 4220 4865 + 2827 4353 4866 4867 + 4588 4868 4869 2294 + 4620 4870 314 3744 + 2511 2102 4871 4713 + 4872 1909 3686 480 + 4873 4874 4875 4372 + 4142 4742 3979 2105 + 3975 4239 4866 3785 + 4876 4877 4761 4878 + 3914 4395 4604 3363 + 4879 4880 4881 4882 + 4883 1202 4030 4884 + 4885 4886 3368 4161 + 3825 4606 2531 4282 + 4433 4887 4888 4889 + 4890 423 4891 4892 + 2755 4893 4531 4894 + 1781 990 4895 4209 + 3772 127 959 76 + 3070 4896 773 2841 + 4897 2429 2405 1416 + 3308 529 3268 4898 + 1692 2007 1102 3081 + 4899 4642 4798 4900 + 3443 4901 754 4427 + 4094 4902 1999 4903 + 4521 4904 4708 4905 + 4906 4907 4908 4909 + 1899 2516 4910 2695 + 4873 4444 4911 320 + 4912 4913 4914 3892 + 1076 4915 4916 3681 + 2569 4917 3977 4918 + 4919 3082 2145 4219 + 4920 4921 4922 3243 + 4894 3364 4603 4155 + 2900 1595 2580 130 + 4923 818 4924 600 + 4265 4925 288 4816 + 2108 4926 4687 2931 + 4288 2352 4927 4928 + 821 4929 1178 3062 + 4930 1329 4931 2963 + 3858 3401 3947 2972 + 2245 4932 4675 4933 + 4063 4133 4776 4934 + 2030 4935 4936 4937 + 4938 4442 4939 2851 + 3408 4406 4435 4940 + 4941 4673 4867 4238 + 1827 3044 4942 2306 + 4943 4944 3137 118 + 4945 4640 3997 3593 + 4946 4947 4948 4513 + 1551 2262 3611 1908 + 4913 4892 4830 4014 + 4949 4907 4950 4160 + 2773 3487 4951 3503 + 4952 4953 3955 4954 + 4955 3371 4114 3683 + 4956 4957 1989 4958 + 4139 4959 4960 1388 + 4961 4962 4963 1833 + 3015 3936 4964 3472 + 994 4965 4966 3794 + 4967 4968 4969 2473 + 4885 4950 4970 3855 + 3508 2046 4971 2568 + 4972 4878 1767 680 + 1796 3294 3072 2143 + 3994 3222 4937 4125 + 1846 4973 4471 4544 + 4974 4975 4914 4016 + 2687 4976 4977 2111 + 3412 834 138 4729 + 4619 4299 4978 4979 + 4980 4981 4982 4983 + 4984 4985 4952 4986 + 1598 4987 4988 4158 + 4989 4990 2686 393 + 3816 955 4991 4992 + 2950 3459 2749 4993 + 4994 4285 4995 4996 + 1099 4814 4997 2080 + 3664 2448 4969 4998 + 4999 3883 5000 4840 + 3597 907 4941 3579 + 1361 5001 4335 1665 + 3297 5002 5003 4686 + 1620 5004 1870 5005 + 4044 5006 5007 2284 + 5008 1153 5009 5010 + 433 5011 5012 3433 + 5013 998 5004 4401 + 2130 4932 5014 37 + 5015 2545 5016 4455 + 5017 4751 4626 5018 + 4083 5019 4015 4829 + 3515 470 2644 3096 + 3499 4701 2072 3631 + 117 5020 4484 2484 + 2835 3937 52 4823 + 5021 4274 755 4901 + 5022 5023 5024 5025 + 1881 1021 5026 1187 + 4834 4403 5003 5027 + 5028 3312 4423 5029 + 3450 5030 4871 5031 + 1944 2964 5032 5033 + 3531 441 5034 2844 + 4864 3983 5035 4982 + 5036 4598 4851 5037 + 5038 4591 4915 1405 + 4942 5039 3939 4826 + 3440 4426 5040 5041 + 3244 4922 4995 3709 + 4071 4948 2100 3170 + 3854 4206 5042 4886 + 5043 5044 4862 4981 + 5045 3228 2979 5046 + 3572 5047 4243 5048 + 4949 5049 4612 5050 + 3805 4824 51 5051 + 5052 4469 172 717 + 3040 4424 2295 5053 + 2391 5054 5055 5056 + 5057 5058 4482 1769 + 2626 1654 5059 3836 + 4931 1148 5060 5032 + 1874 4794 4685 4007 + 1734 5061 5062 193 + 3711 5063 4566 686 + 2410 4991 5064 3025 + 3696 5065 5066 5067 + 5068 4269 4930 1946 + 397 2785 3966 5069 + 5070 4716 5071 1996 + 149 5072 2040 1544 + 5073 4487 4145 4357 + 4279 3981 5074 3691 + 2349 727 1489 1317 + 1888 4966 597 1948 + 5075 4610 5076 5077 + 4190 4625 5078 1419 + 4381 5079 5080 3501 + 1871 5081 4490 1577 + 5082 5083 5084 5085 + 4611 4542 5086 5087 + 4328 5088 4681 5089 + 2276 5090 3336 5091 + 4911 4497 1660 4218 + 3460 5092 3246 706 + 1282 1822 1936 4939 + 853 5093 3829 4784 + 85 3404 5094 3075 + 4159 5051 165 5049 + 3115 5095 3935 1955 + 5096 5097 5098 5076 + 188 3435 3960 4934 + 2907 5099 5100 3419 + 3784 4811 5101 3976 + 2771 5102 3554 1106 + 5103 2639 4272 616 + 55 5104 5105 5058 + 4821 5106 5107 1030 + 5108 5109 5110 5111 + 2925 4636 4417 3011 + 947 5112 5113 5114 + 1169 5115 5116 2598 + 3032 1621 5117 1530 + 2038 4747 5118 3444 + 4962 4397 5119 5120 + 2300 4648 5121 2383 + 4970 4906 4785 2984 + 4766 5122 1265 4963 + 5123 1536 301 3350 + 3483 5124 4086 4722 + 2163 3562 5125 1395 + 4734 4880 3700 454 + 5126 4106 5127 3890 + 1371 5128 1565 328 + 5129 5130 5131 23 + 5132 4283 5133 5134 + 4660 4998 5135 4303 + 2641 4179 1313 1517 + 4592 5136 5137 5138 + 4270 5068 5139 5140 + 5141 5142 742 142 + 3799 2586 5143 3549 + 3557 5144 5028 5139 + 5145 4348 3095 4538 + 5146 5147 5148 95 + 5149 5150 5151 4658 + 5152 5153 5154 5155 + 5156 3456 5157 3791 + 1505 5158 5159 5160 + 5161 5162 4087 4925 + 4519 5163 5164 4396 + 5165 2850 2538 4628 + 5163 4518 5166 5167 + 3320 4543 4553 5168 + 5169 3789 2819 4656 + 5170 4137 5031 2101 + 2724 2718 5171 4105 + 4501 4855 5172 440 + 3161 881 4965 993 + 3026 5064 954 3385 + 5173 4700 3651 5174 + 1679 5175 5176 5177 + 4972 5178 4657 2822 + 5179 5180 5181 5182 + 235 4973 4559 1044 + 4009 5183 3342 975 + 1435 5184 761 547 + 123 5096 5185 4211 + 1350 5186 4940 2872 + 1969 5187 5188 5189 + 3870 5190 5191 5192 + 557 3382 2500 4910 + 1672 4393 698 3493 + 4699 5193 4170 3652 + 1124 2779 2522 4741 + 4421 1722 5194 1582 + 4647 5195 4355 4152 + 3563 5196 4927 4214 + 5197 5198 5199 5055 + 2962 4450 1046 3058 + 5200 5201 5202 2275 + 4507 3177 4005 2243 + 5203 5204 5205 2546 + 4599 4405 4997 5206 + 5036 5207 3879 2331 + 2385 5208 4245 2482 + 4309 5209 3727 4574 + 1844 1389 4639 3667 + 4832 5210 5211 5212 + 5213 5024 5214 5175 + 5215 3156 2424 4306 + 4075 5048 5216 5217 + 395 1589 5218 1668 + 5164 765 5219 5119 + 1073 628 5220 961 + 4059 5221 5222 4111 + 911 546 5046 2978 + 5223 4312 4795 1459 + 3877 5224 5225 5062 + 4576 457 1214 995 + 3329 5226 120 3000 + 3325 5227 5228 4255 + 5229 365 1032 594 + 1586 398 5230 4056 + 1476 5231 5232 5233 + 2787 5234 5235 4034 + 4432 4436 4247 5236 + 2488 4351 5237 5238 + 5239 5240 4084 4828 + 4897 5078 4815 2185 + 4173 5236 1143 1090 + 5241 5202 5239 5242 + 5243 2444 3077 1093 + 5244 4926 4977 4987 + 3091 5245 4097 4147 + 4560 5246 5247 125 + 3184 4511 285 5248 + 3880 5249 5250 1624 + 5251 5211 5154 4232 + 1808 2814 5252 112 + 4767 5120 5253 4846 + 2215 4187 5254 1171 + 873 3701 4879 5255 + 3746 5256 3033 3377 + 523 648 1958 5257 + 1308 5193 4564 3280 + 3149 5074 1249 4053 + 5258 5150 5259 4465 + 874 5260 5206 4813 + 3677 799 5261 2504 + 4110 4979 4546 3649 + 5262 5263 2882 5264 + 2866 5265 4449 5266 + 5267 4569 5268 5269 + 2782 4448 5270 4062 + 5271 1234 5272 3956 + 1562 5273 1721 5274 + 2857 5275 5276 923 + 5277 5016 5278 4754 + 5279 832 1027 1199 + 5280 5281 5282 5283 + 5284 5285 5286 5287 + 148 4709 5288 5289 + 5290 2786 396 1667 + 5114 5291 4258 1557 + 4500 1942 1165 4852 + 5292 5293 5294 5295 + 5296 5113 4630 1524 + 2419 5297 5228 3926 + 462 1885 692 5134 + 1554 5298 5299 4868 + 3427 5300 5301 3600 + 3068 5275 3537 2693 + 3773 75 5302 5303 + 2612 4526 819 3023 + 1921 2200 4017 2992 + 2781 2599 5304 4445 + 1912 4594 5305 2591 + 5306 5104 2093 5307 + 3504 4951 4870 4051 + 2158 2734 5276 3071 + 5308 383 3844 3570 + 5309 5310 5311 5312 + 5313 5314 5315 3776 + 3601 5301 889 4166 + 2589 5316 4607 2146 + 4872 5317 4184 625 + 2948 5318 2756 3566 + 5319 5146 5320 3576 + 4971 2836 4822 4917 + 2845 5034 5172 5321 + 5322 3640 4790 5323 + 5324 5325 5079 4380 + 5326 3257 2218 5327 + 5302 5328 4888 5329 + 4773 5330 4327 3661 + 5057 4762 1532 56 + 2956 4103 5331 1810 + 545 617 4271 5045 + 1146 1591 5101 4181 + 4496 5332 5209 2653 + 2131 5333 2640 5334 + 5335 4789 5336 4758 + 30 5337 5338 538 + 5250 5180 5158 1504 + 4920 4262 5339 1228 + 5340 4012 5341 5342 + 2943 2793 4115 3370 + 5343 5344 1201 4614 + 5345 5346 4984 5347 + 5081 264 4072 3169 + 4854 5348 5349 5321 + 534 173 4468 1583 + 2572 5243 2938 3004 + 5350 5351 5352 2994 + 5353 3511 4131 5354 + 5273 1561 2760 5194 + 5355 5356 4967 2830 + 5227 5357 5094 3927 + 5358 349 5359 4298 + 5360 5361 5362 399 + 4912 1253 5363 4890 + 4641 4945 3494 700 + 4470 2248 5364 4545 + 5354 3492 5365 5268 + 3780 5366 5230 5069 + 5367 5298 5368 5040 + 5369 2684 5370 5371 + 5372 3146 5128 1373 + 5371 5373 5179 5361 + 5090 4362 5374 113 + 2018 5375 186 1247 + 5245 3090 3974 4278 + 3962 4737 5376 4520 + 4547 4978 5359 4472 + 1689 5377 4411 3065 + 2409 5378 4683 4992 + 3441 5379 5380 2867 + 5083 3430 5381 4578 + 1875 4743 4437 387 + 1257 1230 4529 2057 + 4076 5382 5383 3173 + 4340 5384 4705 4104 + 4256 5297 5385 4896 + 5386 5387 4646 2518 + 4791 4732 5125 5388 + 4006 5389 4635 5390 + 2876 5246 4193 2891 + 2535 2849 4323 2310 + 1896 33 3306 5168 + 3057 5391 3792 1945 + 5392 5231 3285 5115 + 5393 5170 4947 5394 + 1168 5395 5232 5392 + 5396 5397 5398 5035 + 5399 5280 5400 5401 + 5402 5287 5403 5404 + 5405 5406 5407 5408 + 5409 511 4567 2720 + 2955 4865 4352 4584 + 5195 5387 5410 5411 + 5412 2322 5413 5414 + 3076 5357 3324 2176 + 3946 5415 4715 1259 + 3571 3843 2490 2282 + 5416 5417 4510 1188 + 2666 4495 3197 1221 + 3991 5418 5056 5199 + 5073 4532 5419 48 + 5420 238 5421 5422 + 5423 5137 2392 5418 + 5308 3587 5424 1723 + 5425 5426 4964 5095 + 4079 45 5419 4893 + 2402 2333 5427 4088 + 1830 1126 5085 3550 + 1152 882 58 5428 + 1042 5429 4447 3283 + 5430 5431 5432 5262 + 928 4806 3358 964 + 5281 5399 5433 5314 + 5311 5434 5435 5286 + 5406 5436 5437 4549 + 4860 2341 4645 3253 + 4781 5438 5282 5313 + 5312 5285 5439 5422 + 4579 4290 3551 5084 + 5440 5441 781 1693 + 185 528 5215 3689 + 4844 5248 4091 4856 + 3463 5442 4118 1437 + 4746 5443 5241 5444 + 3735 4227 5186 1352 + 449 3635 5445 2883 + 4558 5446 428 1043 + 3162 526 1853 4252 + 4107 4874 319 4772 + 589 5447 5448 5449 + 77 1392 5088 5330 + 2528 4605 3328 4135 + 4622 2147 2663 5450 + 4961 2289 3238 4398 + 1264 3165 5451 3730 + 2965 5452 4491 3168 + 5453 5454 5455 5456 + 5409 4122 3591 444 + 5457 5458 5109 5459 + 5277 659 4665 4456 + 2549 5460 5039 3043 + 5461 5462 5463 311 + 3703 5451 5464 985 + 5465 65 5278 2544 + 5229 863 5466 2951 + 4863 5467 1807 5339 + 5468 5469 5324 4045 + 1724 5424 5470 2204 + 956 3262 5471 4318 + 4849 4597 4350 635 + 3334 5472 3180 5473 + 4799 1059 4667 4439 + 3104 774 5385 2418 + 4153 4354 5291 5296 + 5474 5475 226 1984 + 5429 1041 5221 5270 + 5476 5477 5478 5479 + 5480 743 5142 5481 + 1788 5482 5483 989 + 4818 4703 5484 5485 + 5486 1266 5487 5488 + 3500 1039 5489 4132 + 2140 5490 2315 5491 + 5459 5108 5492 5493 + 4292 5494 5481 5141 + 2594 1617 5495 4735 + 3639 4632 5374 4361 + 2237 5121 337 2812 + 666 5487 5122 4765 + 5496 5097 122 303 + 2842 5349 5497 146 + 5498 5499 5054 5500 + 3421 5501 5149 5178 + 3724 5502 2407 1363 + 2128 5497 5503 733 + 649 522 1381 5504 + 4803 927 4718 4316 + 3041 5505 5367 4425 + 3763 5506 3126 4903 + 5269 5365 5187 3719 + 5507 5176 5508 5509 + 3528 3295 4682 4474 + 4980 4415 2547 5510 + 5511 4760 5512 5513 + 2604 4418 5389 2120 + 103 4394 5514 3872 + 3832 5515 5005 5516 + 5103 5517 5468 5334 + 4796 5518 5482 401 + 5519 3313 5144 3556 + 5042 5520 4918 3369 + 5337 29 5331 4833 + 5294 5521 1267 5522 + 4693 3998 4659 1563 + 484 4585 2323 5412 + 5523 429 5524 4637 + 4002 5450 5525 4225 + 4237 5526 5452 2912 + 5527 3617 5106 4820 + 753 4889 5528 627 + 4666 1058 3857 5093 + 619 5160 5529 5530 + 3389 5524 5531 4974 + 4483 5105 5532 3150 + 5533 4536 5534 5477 + 3627 1047 5265 2865 + 305 4480 5535 4837 + 5536 5537 5538 2196 + 5165 4633 3638 4938 + 228 5384 5539 3833 + 1537 5123 3210 4430 + 3298 4688 5244 1601 + 2860 4369 5540 4021 + 287 5541 5542 4817 + 5543 5404 5544 5400 + 5545 426 5118 5444 + 5546 5547 5548 1151 + 4572 5549 5147 5319 + 3431 5082 1125 4740 + 2800 5550 978 4370 + 4975 5531 5446 3893 + 2674 5551 5552 5553 + 5015 5554 4899 5203 + 3602 1181 4234 3778 + 3869 5266 2533 3903 + 5555 5556 3038 5557 + 2776 5011 2940 3488 + 5558 5500 2390 4503 + 4390 5559 3912 5126 + 1402 2918 5138 5423 + 4149 3964 5460 2548 + 2172 797 5560 3413 + 5435 5561 5562 5403 + 5562 5563 5401 5544 + 2958 2151 5564 3380 + 5445 367 4587 4616 + 4183 5383 5430 5565 + 3761 5566 4861 869 + 5567 2698 363 2319 + 5290 190 5225 5234 + 184 2967 1854 525 + 5568 5569 5565 5264 + 5570 5571 5320 2995 + 5289 937 222 5572 + 2689 2201 5573 4476 + 5238 5574 5575 2748 + 1805 5576 5577 2328 + 4621 5441 5578 4554 + 3675 5065 4254 551 + 5503 5348 5579 4671 + 5580 5338 5212 5251 + 4643 5554 4458 4777 + 5417 5581 4332 286 + 4246 5582 5583 5216 + 5584 5585 1534 4712 + 4919 4057 5366 4235 + 4807 4650 5586 272 + 5587 302 5588 5589 + 2821 5157 5590 4876 + 2635 5591 601 4924 + 4528 5340 4801 5592 + 935 5413 940 382 + 524 5593 5594 5595 + 5153 5596 5597 4229 + 3999 4692 4663 4842 + 3534 198 5390 4634 + 1217 3658 5582 5208 + 2643 5553 4935 2029 + 5598 5117 5515 3831 + 5599 3697 5600 5601 + 2389 5602 5603 4504 + 2197 1977 1681 1081 + 1176 5604 4845 4857 + 2664 2149 5362 5182 + 3114 5605 5606 5425 + 2483 4244 5607 4943 + 5608 5609 5023 5610 + 5611 5612 5613 5614 + 5615 5616 5345 5617 + 5618 3006 5519 3585 + 1074 3497 5364 1858 + 5127 5171 203 4523 + 5619 5513 5620 5621 + 5167 5589 5454 766 + 5358 4843 2492 330 + 3702 5007 3626 5618 + 5622 1198 5623 5624 + 789 4492 5526 4236 + 4347 5020 5226 3092 + 1738 5625 5574 5237 + 5626 1614 5627 631 + 655 4883 5628 5396 + 5569 3624 5006 4043 + 4409 374 5013 4764 + 3932 5629 764 5323 + 4629 2537 5566 3760 + 5177 5630 5631 4291 + 5632 3395 59 885 + 4988 4976 4990 5633 + 415 3206 5634 5099 + 64 3987 5021 3442 + 2952 5635 1960 2255 + 3633 3073 3293 5375 + 5636 3261 5135 4968 + 4493 5577 5204 4900 + 3064 3660 4953 5637 + 5638 2150 4320 5355 + 4366 4744 153 3507 + 1412 4233 3002 1603 + 4112 2726 5256 3745 + 1184 5639 5640 4783 + 2775 4509 5381 5012 + 5516 1869 5490 2139 + 5641 4116 2792 5052 + 5369 5360 1787 5642 + 5086 5643 4479 5008 + 2667 1220 5538 5447 + 5644 5461 5645 5646 + 4850 5525 2662 5647 + 4041 5648 5634 3392 + 2335 5353 4568 5649 + 4127 5650 4164 4368 + 5116 3284 4446 5304 + 4600 5260 5255 5651 + 5652 2305 5653 3314 + 1496 3918 2762 5654 + 1028 5655 5656 4023 + 2685 5642 3532 5657 + 4210 5658 5523 124 + 3194 4944 5607 5047 + 4955 3248 5659 5660 + 3548 5661 5662 1607 + 4748 5018 3475 3712 + 4847 5253 5219 5629 + 3742 1275 5663 4812 + 2449 3381 5663 3933 + 5426 5606 5190 3470 + 5033 5060 5664 673 + 1831 5521 5665 3653 + 1164 4376 5579 4853 + 3915 4024 5666 4196 + 3539 5235 5224 3876 + 5080 5667 5518 4539 + 2043 424 5363 1252 + 5593 5257 4250 1207 + 5309 5421 1368 5668 + 1970 5669 5346 5670 + 5581 5416 5026 5671 + 5087 5010 4908 5050 + 541 841 5672 637 + 831 3411 5673 5655 + 2665 5181 5674 5675 + 3793 5391 3619 4577 + 5053 4869 5299 5505 + 636 4349 5540 5676 + 5677 3464 569 1987 + 3378 107 1528 4338 + 1303 5678 5679 5596 + 4391 5680 3728 5332 + 5603 5681 4916 4590 + 4108 3343 5682 4580 + 5532 5306 5185 4609 + 4838 5535 5643 4541 + 5592 4800 5680 1185 + 3851 5683 4223 2321 + 3426 573 5550 2799 + 5189 5684 5685 1688 + 5373 5370 5686 5159 + 47 5687 5688 4488 + 5191 5605 3372 5660 + 5510 5205 5689 5043 + 5690 5691 5692 5483 + 5061 1733 5693 4704 + 5694 5695 5623 5344 + 4706 5475 5155 5210 + 3080 4644 5578 5440 + 5654 5696 5594 1206 + 3491 3672 5684 5188 + 5697 5698 3842 2395 + 3542 4342 5699 4689 + 5700 5674 5249 5207 + 5701 5702 5703 2099 + 5152 5474 5704 1304 + 53 1531 4163 2377 + 5672 4617 4334 4696 + 5030 4651 683 4714 + 2505 5261 1348 4035 + 4080 1023 4123 3795 + 5681 5602 5136 3682 + 980 4678 5676 4371 + 5077 5098 5705 4517 + 5166 5705 5496 5587 + 4296 5542 5706 4836 + 5192 5659 3596 4293 + 5707 4416 4983 5398 + 5647 5675 5700 5037 + 290 246 1191 3270 + 2791 5708 5502 3723 + 3264 5102 4373 4875 + 4848 5709 5710 5386 + 479 5464 1965 5317 + 806 5711 4136 4755 + 5070 4902 4322 212 + 3199 4385 5066 3674 + 5712 5713 5679 5714 + 3873 5514 5559 3797 + 1626 5100 5648 4040 + 1752 463 5133 4994 + 4723 4085 5715 5350 + 4157 5633 4989 3948 + 5547 5716 5717 5111 + 5718 4929 4690 5699 + 1648 5698 4204 1203 + 5466 1050 2597 5635 + 4661 4302 2645 473 + 4453 5693 5719 4067 + 5706 5541 3272 306 + 4268 5720 4725 2874 + 5721 5695 5722 5723 + 5704 1986 5724 1305 + 3818 5725 5726 5727 + 4407 4763 4819 5485 + 5728 5071 5415 413 + 5729 4778 1937 1821 + 5394 4946 3051 5730 + 5731 5448 5537 5732 + 5733 5734 1457 5148 + 4412 5735 5736 4533 + 5737 5494 5631 2375 + 5528 5328 74 5220 + 1637 5703 5738 1133 + 2937 5564 5638 2829 + 1678 5612 5025 5213 + 4835 5651 4882 5739 + 4825 5388 3561 4774 + 372 5327 2217 4169 + 5041 5740 5741 5379 + 4224 5742 5702 5743 + 5322 767 5453 5744 + 4408 5484 3478 5326 + 615 5745 5746 5517 + 5546 2893 5747 5716 + 3544 2086 5748 4330 + 174 5749 5750 5751 + 2362 5411 850 2631 + 845 5752 563 2286 + 884 5753 435 5754 + 5755 5478 5756 5757 + 3035 1110 5758 5000 + 1924 3135 4177 3410 + 5759 5174 5665 5293 + 4459 5072 5572 225 + 4779 5760 3236 3047 + 5662 5761 5762 4653 + 5763 5725 150 1543 + 4769 1325 5764 4212 + 5443 4745 5300 2272 + 4581 5682 5183 3904 + 5765 5766 5610 5767 + 5376 938 5288 4904 + 4960 5768 4695 297 + 5769 5747 4387 5770 + 5771 5690 5667 5325 + 4240 3349 3255 5772 + 140 5624 5721 5773 + 139 833 5279 5622 + 3315 5653 3138 5774 + 5748 269 4679 4859 + 4202 5697 2576 5775 + 2881 2934 3625 5568 + 5776 2699 5567 3788 + 3034 4810 793 501 + 5777 5333 109 5252 + 4100 3641 5744 5456 + 5571 5778 2274 3577 + 1956 3896 5764 1324 + 5743 5701 5779 5780 + 5598 5539 4339 1527 + 1129 5427 3769 1441 + 4936 5552 5650 4126 + 5029 4422 5720 5140 + 5732 5536 5508 5214 + 4827 4891 5545 5242 + 5259 5501 5781 5782 + 2404 5708 2228 1417 + 5595 5696 2761 1560 + 5352 5200 5778 5570 + 5783 5512 5784 1458 + 5746 5785 5771 5469 + 5614 5786 5787 10 + 5604 1179 5718 4341 + 5548 5110 5788 5664 + 5380 5789 4019 1428 + 488 5790 5745 3540 + 5307 2092 1782 4208 + 4669 4654 5762 4557 + 4333 5671 1020 4697 + 5791 5509 2198 1084 + 4797 4165 5551 4189 + 5774 2637 5777 4242 + 5492 5717 5769 5792 + 3420 2048 5793 5781 + 2916 5772 2622 281 + 5794 5795 5766 5796 + 5162 5341 4551 3647 + 5351 5715 5240 5201 + 590 5797 5749 177 + 5798 5130 5799 5800 + 847 5410 5710 5557 + 5801 561 5802 5803 + 3838 704 5560 912 + 4198 3957 5272 3089 + 3461 705 5059 2254 + 5804 5805 5615 5806 + 5807 5621 5808 5809 + 5810 5597 5713 5407 + 4631 5112 5480 5737 + 5616 5805 5811 5670 + 4319 5471 5636 5356 + 4596 4358 5756 5534 + 475 5586 4649 2044 + 5143 4515 5812 5661 + 430 5658 4895 771 + 3039 5813 5814 168 + 4099 135 5019 5124 + 5790 5815 5691 5785 + 5044 5689 5576 5467 + 2736 4313 5816 5336 + 5486 5817 5818 5522 + 5263 5432 5819 450 + 1857 1481 5760 5729 + 2485 5820 5740 5368 + 1131 5585 5821 3517 + 3864 1500 5222 1040 + 3669 3490 5489 1038 + 5022 5611 5822 5767 + 5217 5823 5431 5382 + 2840 5107 3616 4428 + 4101 5455 5588 136 + 5630 5507 5791 2376 + 5783 5824 5808 5620 + 5825 5555 5709 4489 + 2735 4841 5758 1109 + 2617 5247 2875 4724 + 3754 2566 5826 4831 + 5821 5584 3950 3899 + 4284 5132 691 5063 + 5816 5223 5784 4759 + 3567 2759 5573 5470 + 1997 5728 2960 3437 + 5640 5827 5590 3455 + 3171 2241 5711 1285 + 4004 1455 5014 2244 + 4384 5646 5600 5067 + 4556 5761 5812 1910 + 4731 5826 5520 4205 + 5828 5829 5830 5831 + 5750 5832 5833 5834 + 5463 5529 5686 2683 + 5835 5408 5712 16 + 5198 5799 5129 5836 + 5837 5601 5645 310 + 5688 5813 5556 5825 + 4786 4909 5009 5428 + 5001 1360 5017 4749 + 5838 5803 4804 4315 + 361 5839 5840 5678 + 100 3684 4117 5641 + 5677 4957 4726 3220 + 5075 4516 4771 404 + 2458 5768 5841 5730 + 5609 5833 5842 5731 + 5843 5295 5818 5844 + 5823 5583 3657 5819 + 1004 4877 5827 5639 + 4389 5506 5845 5184 + 5846 5479 5755 5829 + 5462 5644 4383 5530 + 5847 5800 5197 5499 + 2625 1297 5719 1732 + 5739 4881 4733 4793 + 4481 308 436 5753 + 4736 5495 4770 5472 + 3908 5848 5849 5850 + 4466 5782 5793 3279 + 3414 4727 4956 5851 + 194 5627 5852 933 + 5853 5854 5830 5757 + 4720 5855 1299 736 + 5393 5841 4959 4138 + 4230 5810 4548 602 + 926 340 5855 4719 + 762 5845 3762 2427 + 5856 5857 5858 3924 + 5575 5859 5318 4993 + 5161 4267 4802 5342 + 5267 5860 3907 4217 + 4199 3925 5861 5549 + 5734 5862 5863 5824 + 5666 5656 5864 4197 + 5865 5796 5765 5866 + 169 5814 5687 4858 + 2757 5859 5625 2052 + 5685 3671 5735 5377 + 5683 3850 5738 5742 + 4360 3322 5867 5853 + 3359 4805 5802 560 + 5849 5868 5804 5869 + 934 5852 1613 5414 + 4534 5736 5870 5752 + 5871 5809 5863 5857 + 5741 5820 2366 5789 + 2470 5864 5673 3191 + 5811 5868 5872 3717 + 5848 5860 3718 5872 + 5862 5733 5861 5858 + 5873 5874 5722 5694 + 5875 5436 5405 5835 + 564 5870 3670 1037 + 5842 5832 5797 5449 + 5840 5876 18 5714 + 5788 5458 5877 670 + 5878 5879 4413 5707 + 3394 5632 5880 5881 + 5786 5613 653 5882 + 375 5883 359 5724 + 5834 5608 5795 5884 + 5822 14 5885 5866 + 5836 21 5886 3992 + 5887 5888 5889 5867 + 5831 5854 5889 5890 + 5692 5815 487 986 + 3147 5372 5891 5892 + 5397 5628 5893 5878 + 66 5465 4414 5894 + 5881 5895 5779 2098 + 5896 5897 4652 4668 + 5844 5817 5898 5899 + 5900 5898 5488 669 + 5637 4985 5669 1690 + 5591 539 5580 4231 + 4996 4921 1231 1256 + + + + T[0-9] + E[11,5787,5882,652,143,741,949,1559,2259,2853,2902,3777,5315,5433,5563,5561,5434,5310,5668,1370,2977,3230,2302,5652,815,4923,4550,5437,5875,15,19,5876,5839,360,5883,378,5491,2317,2479,2083,2627,3835,4119,5442,3465,3218,3849,3013,3837,2629,4287,4552,4010,4527,5751,5884,5794,5865,5885,13] + E[5896,4670,4463,3921,4185,1963,3166,2399,2798,4506,2246,4933,4674,735,4672,4377,3970,1056,1323,1929,2551,2592,5305,4593,3111,4782,3457,5156,3790,5169,4655,5151,5258,4464,4711,4562,4698,5173,5759,5292,5843,5899] + E[5900,668,810,3054,4029,3453,4809,3884,4999,4839,4787,5335,4757,5511,5619,5807,5871,5856,3923,5,9,4201,4571,3807,3906,3598,4168,4289,4928,5196,3565,4684,5378,2408,1340,1401,3993,5886] + E[5888,5890,5828,5846,5476,5533,4537,5145,4345,4485,1408,2384,1219,1054,490,3634,369,1376,2364,4020,4750,1588,5218,1669,192,1731,2624,738,1269,4314,5838,5801,558,639,542,167,3037,2222,2903,2234,132,4780,5438,5283,5543,5402,5284,5439,5420,239,909,2420,2601,486,987,3533,5657,309,5837,5599,3698,4253,553,582,722,179,1664,1358,4752,1355,4162,2379,1003,992,769,830,1078,2247,1860,1404,5038,4589,4502,5558,5498,5847,5798,5131,24,20] + E[5877,671,826,3055,3620,3088,3866,4680,5089,4329,3954,4954,4986,5347,5617,5806,5869,5850,3909,1,3,4215,4570,5649,2336,3269,4898,3309,3868,4326,3901,3519,4089,2403,1064,1513,3321,5887] + E[5457,5493,5792,5770,4386,4195,4561,3622,3774,5303,5329,4887,4434,4275,3988,3828,3513,3469,4608,5316,2588,2563,2780,1828,3552,575,2160,4477,2898,4694,2456,3050,4721,266,1873,1943,1462,1839,3751,4305,3144,5892] + E[5891,1372,1762,902,1632,823,1477,5233,5395,1167,515,877,2061,3559,482,1615,5626,630,1520,4808,4738,3352,3770,4321,4092,3124,4388,1433,3393,3208,3311,3663,3813,4522,4905,4710,3819,5727] + E[5874,5723,5773,4728,1926,1776,2067,5271,1235,688,2577,5775,4203,4032,4884,5893,5879,5894,2846,4702,3480,3259,2461,3462,5092,3247,567,1988,4958,5851,3415,2173,3373,1193,1510,438,5754,5880,5895,5780,4222,3787,5776,2696,5527,3618,4602,2070,3175,4768,1658,1542,5763,5726] + E[5897,1605,1758,892,1631,813,1474,4186,5254,1172,509,879,586,1720,5274,1383,5504,650,1521,3897,4213,3183,5473,3335,5091,2277,4261,4304,2914,4241,2730,3803,3300,5002,5027,4613,5343,5873] + Q[10-2842] + + + C[1] + C[109] + + + + + L0211-XU + 5.6.0 + 04-Sep-2024 14:32:01 + + -v mastu_cd.msh mastu_cd.tmp.xml:xml:uncompress + + diff --git a/test/test_resources/MASTU-2D/mesh_gen.sh b/test/test_resources/MASTU-2D/mesh_gen.sh new file mode 100644 index 00000000..d7980b95 --- /dev/null +++ b/test/test_resources/MASTU-2D/mesh_gen.sh @@ -0,0 +1,15 @@ +#!/bin/bash +GEO_FILE="mastu_cd.geo" +BASENAME=$(basename $GEO_FILE .geo) +gmsh -2 $GEO_FILE +NEKMESH=NekMesh +if hash NekMesh-rg 2>/dev/null; then + NEKMESH=NekMesh-rg +fi + +$NEKMESH -v "$BASENAME.msh" "$BASENAME.tmp.xml":xml:uncompress + +awk '!/EXPANSIONS/' "$BASENAME.tmp.xml" > "$BASENAME.tmp2.xml" +rm "$BASENAME.tmp.xml" +awk '!/NUMMODES/' "$BASENAME.tmp2.xml" > "$BASENAME.xml" +rm "$BASENAME.tmp2.xml" diff --git a/test/unit/nektar_interface/test_composite_interaction.cpp b/test/unit/nektar_interface/test_composite_interaction.cpp new file mode 100644 index 00000000..d1f21dde --- /dev/null +++ b/test/unit/nektar_interface/test_composite_interaction.cpp @@ -0,0 +1,1248 @@ +#include "../../unit/nektar_interface/test_helper_utilities.hpp" +using namespace CompositeInteraction; + +namespace { + +class CompositeIntersectionTester + : public CompositeInteraction::CompositeIntersection { + +public: + inline void test_find_cells(ParticleGroupSharedPtr particle_group, + std::set &cells) { + return this->find_cells(particle_group, cells); + } + + inline std::shared_ptr &get_composite_collections() { + return this->composite_collections; + } + + CompositeIntersectionTester( + SYCLTargetSharedPtr sycl_target, + ParticleMeshInterfaceSharedPtr particle_mesh_interface, + std::map> &boundary_groups) + : CompositeIntersection(sycl_target, particle_mesh_interface, + boundary_groups) {} +}; + +class CompositeTransportTester + : public CompositeInteraction::CompositeTransport { + +public: + CompositeTransportTester( + ParticleMeshInterfaceSharedPtr particle_mesh_interface, + std::vector &composite_indices) + : CompositeTransport(particle_mesh_interface, composite_indices) {} + + inline auto &get_contrib_cells() { return this->contrib_cells; } +}; + +} // namespace + +TEST(CompositeInteraction, AtomicFetchMaxMin) { + auto sycl_target = std::make_shared(0, MPI_COMM_WORLD); + + typedef int TEST_INT; + + std::vector h_buffer = {0, 0}; + auto dh_buffer = BufferDeviceHost(sycl_target, h_buffer); + auto k_buffer = dh_buffer.d_buffer.ptr; + + sycl_target->queue + .submit([&](sycl::handler &cgh) { + cgh.parallel_for<>(sycl::range<1>(1), [=](sycl::id<1> idx) { + sycl::atomic_ref + amax(k_buffer[0]); + amax.fetch_max((TEST_INT)8); + sycl::atomic_ref + amin(k_buffer[1]); + amin.fetch_min((TEST_INT)-8); + }); + }) + .wait_and_throw(); + + dh_buffer.device_to_host(); + + EXPECT_EQ(dh_buffer.h_buffer.ptr[0], 8); + EXPECT_EQ(dh_buffer.h_buffer.ptr[1], -8); + + sycl_target->free(); +} + +TEST(CompositeInteraction, Utility) { + + auto lambda_make_edge = [&](auto a, auto b) { + std::vector vertices; + vertices.push_back( + std::make_shared(3, 0, a[0], a[1], a[2])); + vertices.push_back( + std::make_shared(3, 1, b[0], b[1], b[2])); + return std::dynamic_pointer_cast( + std::make_shared(0, 3, vertices.data())); + }; + + auto lambda_make_triangle = [&](auto a, auto b, auto c) { + std::vector edges = { + std::dynamic_pointer_cast( + lambda_make_edge(a, b)), + std::dynamic_pointer_cast( + lambda_make_edge(b, c)), + std::dynamic_pointer_cast( + lambda_make_edge(c, a))}; + return std::dynamic_pointer_cast( + std::make_shared(0, edges.data())); + }; + + auto lambda_make_quad = [&](auto a, auto b, auto c, auto d) { + std::vector edges = { + std::dynamic_pointer_cast( + lambda_make_edge(a, b)), + std::dynamic_pointer_cast( + lambda_make_edge(b, c)), + std::dynamic_pointer_cast( + lambda_make_edge(c, d)), + std::dynamic_pointer_cast( + lambda_make_edge(d, a))}; + return std::dynamic_pointer_cast( + std::make_shared(0, edges.data())); + }; + + std::vector normal; + + { + NekDouble a[3] = {0.0, 0.0, 0.0}; + NekDouble b[3] = {2.0, 0.0, 0.0}; + auto e = lambda_make_edge(a, b); + get_normal_vector(e, normal); + ASSERT_EQ(normal.size(), 2); + ASSERT_NEAR(normal.at(0), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 1.0, 1.0e-15); + + get_vertex_average(std::static_pointer_cast(e), + normal); + ASSERT_EQ(normal.size(), 3); + ASSERT_NEAR(normal.at(0), 1.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(2), 0.0, 1.0e-15); + } + { + NekDouble a[3] = {0.0, 0.0, 0.0}; + NekDouble b[3] = {0.0, -2.0, 0.0}; + auto e = lambda_make_edge(a, b); + get_normal_vector(e, normal); + ASSERT_EQ(normal.size(), 2); + ASSERT_NEAR(normal.at(0), 1.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 0.0, 1.0e-15); + + get_vertex_average(std::static_pointer_cast(e), + normal); + ASSERT_EQ(normal.size(), 3); + ASSERT_NEAR(normal.at(0), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), -1.0, 1.0e-15); + ASSERT_NEAR(normal.at(2), 0.0, 1.0e-15); + } + + { + NekDouble a[3] = {0.0, 0.0, 0.0}; + NekDouble b[3] = {1.0, 0.0, 0.0}; + NekDouble c[3] = {1.0, 1.0, 0.0}; + + auto g = lambda_make_triangle(a, b, c); + get_normal_vector(g, normal); + ASSERT_EQ(normal.size(), 3); + ASSERT_NEAR(normal.at(0), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(2), 1.0, 1.0e-15); + + get_vertex_average(std::static_pointer_cast(g), + normal); + ASSERT_EQ(normal.size(), 3); + ASSERT_NEAR(normal.at(0), 2.0 / 3.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 1.0 / 3.0, 1.0e-15); + ASSERT_NEAR(normal.at(2), 0.0, 1.0e-15); + } + + { + NekDouble a[3] = {0.0, 0.0, 0.0}; + NekDouble b[3] = {0.0, 1.0, 0.0}; + NekDouble c[3] = {0.0, 1.0, 1.0}; + + auto g = lambda_make_triangle(a, b, c); + get_normal_vector(g, normal); + ASSERT_EQ(normal.size(), 3); + ASSERT_NEAR(normal.at(0), 1.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(2), 0.0, 1.0e-15); + + get_vertex_average(std::static_pointer_cast(g), + normal); + ASSERT_EQ(normal.size(), 3); + ASSERT_NEAR(normal.at(0), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 2.0 / 3.0, 1.0e-15); + ASSERT_NEAR(normal.at(2), 1.0 / 3.0, 1.0e-15); + } + + { + NekDouble a[3] = {0.0, 0.0, 0.0}; + NekDouble b[3] = {1.0, 0.0, 0.0}; + NekDouble c[3] = {1.0, 1.0, 0.0}; + NekDouble d[3] = {0.0, 1.0, 0.0}; + + auto g = lambda_make_quad(a, b, c, d); + get_normal_vector(g, normal); + ASSERT_EQ(normal.size(), 3); + ASSERT_NEAR(normal.at(0), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(2), 1.0, 1.0e-15); + + get_vertex_average(std::static_pointer_cast(g), + normal); + ASSERT_EQ(normal.size(), 3); + ASSERT_NEAR(normal.at(0), 2.0 / 4.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 2.0 / 4.0, 1.0e-15); + ASSERT_NEAR(normal.at(2), 0.0, 1.0e-15); + } + + { + NekDouble a[3] = {0.0, 0.0, 0.0}; + NekDouble b[3] = {0.0, 1.0, 0.0}; + NekDouble c[3] = {0.0, 1.0, 1.0}; + NekDouble d[3] = {0.0, 0.0, 1.0}; + + auto g = lambda_make_quad(a, b, c, d); + get_normal_vector(g, normal); + ASSERT_EQ(normal.size(), 3); + ASSERT_NEAR(normal.at(0), 1.0, 1.0e-15); + ASSERT_NEAR(normal.at(1), 0.0, 1.0e-15); + ASSERT_NEAR(normal.at(2), 0.0, 1.0e-15); + } +} + +TEST(CompositeInteraction, GeometryTransportAllD) { + TestUtilities::TestResourceSession resources_session( + "reference_all_types_cube/mixed_ref_cube_0.2.xml", + "reference_all_types_cube/conditions.xml"); + auto session = resources_session.session; + + // Create MeshGraph. + auto graph = SpatialDomains::MeshGraph::Read(session); + auto mesh = std::make_shared(graph); + auto comm = mesh->get_comm(); + auto sycl_target = std::make_shared(0, comm); + + const int rank = sycl_target->comm_pair.rank_parent; + + auto lambda_compare_vertices = [&](auto A, auto B) { + ASSERT_EQ(A->GetCoordim(), B->GetCoordim()); + ASSERT_EQ(A->GetGlobalID(), B->GetGlobalID()); + Nektar::NekDouble Ax = 0.0; + Nektar::NekDouble Ay = 0.0; + Nektar::NekDouble Az = 0.0; + Nektar::NekDouble Bx = 0.0; + Nektar::NekDouble By = 0.0; + Nektar::NekDouble Bz = 0.0; + A->GetCoords(Ax, Ay, Az); + B->GetCoords(Bx, By, Bz); + const int coordim = A->GetCoordim(); + if (coordim > 0) { + ASSERT_NEAR(Ax, Bx, 1.0e-16); + } + if (coordim > 1) { + ASSERT_NEAR(Ay, By, 1.0e-16); + } + if (coordim > 2) { + ASSERT_NEAR(Az, Bz, 1.0e-16); + } + }; + + auto lambda_compare_edges = [&](auto A, auto B) { + ASSERT_EQ(A->GetCoordim(), B->GetCoordim()); + ASSERT_EQ(A->GetGlobalID(), B->GetGlobalID()); + + ASSERT_EQ(A->GetNumVerts(), B->GetNumVerts()); + ASSERT_EQ(A->GetNumEdges(), B->GetNumEdges()); + ASSERT_EQ(A->GetNumFaces(), B->GetNumFaces()); + ASSERT_EQ(A->GetShapeDim(), B->GetShapeDim()); + + const int num_vertices = A->GetNumVerts(); + for (int vx = 0; vx < num_vertices; vx++) { + lambda_compare_vertices(A->GetVertex(vx), B->GetVertex(vx)); + } + }; + + for (auto &sg : graph->GetAllSegGeoms()) { + GeometryTransport::RemoteGeom rsg(rank, sg.first, + sg.second); + GeometryTransport::RemoteGeom rsgd; + const std::size_t num_bytes = rsg.get_num_bytes(); + std::vector bytes(num_bytes); + rsg.serialise(bytes.data(), num_bytes); + rsgd.deserialise(bytes.data(), num_bytes); + auto dg = rsgd.geom; + ASSERT_TRUE(dg.get() != nullptr); + lambda_compare_edges(sg.second, dg); + } + + auto lambda_compare_faces = [&](auto A, auto B) { + ASSERT_EQ(A->GetCoordim(), B->GetCoordim()); + ASSERT_EQ(A->GetGlobalID(), B->GetGlobalID()); + + ASSERT_EQ(A->GetNumVerts(), B->GetNumVerts()); + ASSERT_EQ(A->GetNumEdges(), B->GetNumEdges()); + ASSERT_EQ(A->GetNumFaces(), B->GetNumFaces()); + ASSERT_EQ(A->GetShapeDim(), B->GetShapeDim()); + + const int num_edges = A->GetNumEdges(); + for (int vx = 0; vx < num_edges; vx++) { + lambda_compare_edges(A->GetEdge(vx), B->GetEdge(vx)); + } + }; + + auto lambda_check_face = [&](auto face_pair) { + auto face_id = face_pair.first; + auto face_geom = face_pair.second; + GeometryTransport::RemoteGeom rsg(rank, face_id, + face_geom); + GeometryTransport::RemoteGeom rsgd; + const std::size_t num_bytes = rsg.get_num_bytes(); + std::vector bytes(num_bytes); + rsg.serialise(bytes.data(), num_bytes); + rsgd.deserialise(bytes.data(), num_bytes); + auto dg = rsgd.geom; + ASSERT_TRUE(dg.get() != nullptr); + lambda_compare_faces(face_geom, dg); + }; + + for (auto &sg : graph->GetAllTriGeoms()) { + lambda_check_face(sg); + } + for (auto &sg : graph->GetAllQuadGeoms()) { + lambda_check_face(sg); + } + + auto lambda_compare_polys = [&](auto A, auto B) { + ASSERT_EQ(A->GetCoordim(), B->GetCoordim()); + ASSERT_EQ(A->GetGlobalID(), B->GetGlobalID()); + + ASSERT_EQ(A->GetNumVerts(), B->GetNumVerts()); + ASSERT_EQ(A->GetNumEdges(), B->GetNumEdges()); + ASSERT_EQ(A->GetNumFaces(), B->GetNumFaces()); + ASSERT_EQ(A->GetShapeDim(), B->GetShapeDim()); + + const int num_faces = A->GetNumFaces(); + for (int vx = 0; vx < num_faces; vx++) { + lambda_compare_faces(A->GetFace(vx), B->GetFace(vx)); + } + }; + + auto lambda_check_poly = [&](auto poly_pair) { + auto poly_id = poly_pair.first; + auto poly_geom = poly_pair.second; + GeometryTransport::RemoteGeom rsg(rank, poly_id, + poly_geom); + GeometryTransport::RemoteGeom rsgd; + const std::size_t num_bytes = rsg.get_num_bytes(); + std::vector bytes(num_bytes); + rsg.serialise(bytes.data(), num_bytes); + rsgd.deserialise(bytes.data(), num_bytes); + auto dg = rsgd.geom; + ASSERT_TRUE(dg.get() != nullptr); + lambda_compare_polys(poly_geom, dg); + }; + + for (auto sg : graph->GetAllTetGeoms()) { + lambda_check_poly(sg); + } + for (auto sg : graph->GetAllPyrGeoms()) { + lambda_check_poly(sg); + } + for (auto sg : graph->GetAllPrismGeoms()) { + lambda_check_poly(sg); + } + for (auto sg : graph->GetAllHexGeoms()) { + lambda_check_poly(sg); + } + + mesh->free(); + sycl_target->free(); +} + +class CompositeInteractionAllD + : public testing::TestWithParam> { +}; +TEST_P(CompositeInteractionAllD, GeometryTransport) { + + std::tuple param = GetParam(); + + const std::string filename_conditions = std::get<0>(param); + const std::string filename_mesh = std::get<1>(param); + const int ndim = std::get<2>(param); + + TestUtilities::TestResourceSession resources_session(filename_mesh, + filename_conditions); + auto session = resources_session.session; + + // Create MeshGraph. + auto graph = SpatialDomains::MeshGraph::Read(session); + auto mesh = std::make_shared(graph); + auto comm = mesh->get_comm(); + auto sycl_target = std::make_shared(0, comm); + + std::vector composite_indices = {100, 200, 300, 400, 500, 600}; + + auto composite_transport = + std::make_shared(mesh, composite_indices); + + auto &contrib_cells = composite_transport->get_contrib_cells(); + + int cell = -1; + for (auto &ix : contrib_cells) { + cell = ix; + } + + int rank = sycl_target->comm_pair.rank_parent; + int possible_rank = (cell == -1) ? -1 : rank; + int chosen_rank; + MPICHK( + MPI_Allreduce(&possible_rank, &chosen_rank, 1, MPI_INT, MPI_MAX, comm)); + ASSERT_TRUE(chosen_rank >= 0); + MPICHK(MPI_Bcast(&cell, 1, MPI_INT, chosen_rank, comm)); + + std::vector>> + remote_quads; + std::vector>> + remote_tris; + std::vector< + std::shared_ptr>> + remote_segments; + std::set cells_set = {cell}; + + const int num_collected = composite_transport->collect_geometry(cells_set); + ASSERT_EQ(num_collected, 1); + composite_transport->get_geometry(cell, remote_quads, remote_tris, + remote_segments); + + std::vector geom_int; + std::vector geom_real; + + auto lambda_push_data = [&](auto geom) { + NekDouble x[3]; + geom_int.push_back(geom->GetCoordim()); + const int num_vertices = geom->GetNumVerts(); + for (int vx = 0; vx < num_vertices; vx++) { + auto vert = geom->GetVertex(vx); + vert->GetCoords(x[0], x[1], x[2]); + for (int dx = 0; dx < ndim; dx++) { + geom_real.push_back(x[dx]); + } + } + }; + + if (ndim == 3) { + for (auto gx : remote_quads) { + geom_int.push_back(gx->id); + lambda_push_data(gx->geom); + } + for (auto gx : remote_tris) { + geom_int.push_back(gx->id); + lambda_push_data(gx->geom); + } + } else if (ndim == 2) { + for (auto gx : remote_segments) { + geom_int.push_back(gx->id); + lambda_push_data(gx->geom); + } + } + + int num_int = geom_int.size(); + MPICHK(MPI_Bcast(&num_int, 1, MPI_INT, chosen_rank, comm)); + std::vector geom_int_correct(num_int); + if (rank == chosen_rank) { + for (int ix = 0; ix < num_int; ix++) { + geom_int_correct.at(ix) = geom_int.at(ix); + } + } + MPICHK( + MPI_Bcast(geom_int_correct.data(), num_int, MPI_INT, chosen_rank, comm)); + ASSERT_EQ(geom_int_correct, geom_int); + + int num_real = geom_real.size(); + MPICHK(MPI_Bcast(&num_real, 1, MPI_INT, chosen_rank, comm)); + std::vector geom_real_correct(num_real); + if (rank == chosen_rank) { + for (int ix = 0; ix < num_real; ix++) { + geom_real_correct.at(ix) = geom_real.at(ix); + } + } + MPICHK(MPI_Bcast(geom_real_correct.data(), num_real, MPI_DOUBLE, chosen_rank, + comm)); + ASSERT_EQ(geom_real_correct, geom_real); + + composite_transport->free(); + mesh->free(); +} + +TEST_P(CompositeInteractionAllD, Collections) { + std::tuple param = GetParam(); + + const std::string filename_conditions = std::get<0>(param); + const std::string filename_mesh = std::get<1>(param); + const int ndim = std::get<2>(param); + + TestUtilities::TestResourceSession resources_session(filename_mesh, + filename_conditions); + auto session = resources_session.session; + + // Create MeshGraph. + auto graph = SpatialDomains::MeshGraph::Read(session); + auto mesh = std::make_shared(graph); + auto comm = mesh->get_comm(); + auto sycl_target = std::make_shared(0, comm); + + std::vector composite_indices = {100, 200, 300, 400, 500, 600}; + std::map> boundary_groups = {{1, composite_indices}}; + + auto composite_transport = + std::make_shared(mesh, composite_indices); + + auto &contrib_cells = composite_transport->get_contrib_cells(); + + int cell = -1; + for (auto &ix : contrib_cells) { + cell = ix; + } + + int rank = sycl_target->comm_pair.rank_parent; + int possible_rank = (cell == -1) ? -1 : rank; + int chosen_rank; + MPICHK( + MPI_Allreduce(&possible_rank, &chosen_rank, 1, MPI_INT, MPI_MAX, comm)); + ASSERT_TRUE(chosen_rank >= 0); + MPICHK(MPI_Bcast(&cell, 1, MPI_INT, chosen_rank, comm)); + + std::vector>> + remote_quads; + std::vector>> + remote_tris; + + std::set cells_set = {cell}; + + const int num_collected = composite_transport->collect_geometry(cells_set); + ASSERT_EQ(num_collected, 1); + std::vector< + std::shared_ptr>> + remote_segments; + composite_transport->get_geometry(cell, remote_quads, remote_tris, + remote_segments); + + std::set cell_arg; + cell_arg.insert(cell); + auto composite_collections = std::make_shared( + sycl_target, mesh, boundary_groups); + composite_collections->collect_geometry(cell_arg); + + auto map_cells_collections = composite_collections->map_cells_collections; + CompositeCollection *d_cc; + CompositeCollection h_cc; + auto exists = map_cells_collections->host_get(cell, &d_cc); + ASSERT_TRUE(exists); + sycl_target->queue.memcpy(&h_cc, d_cc, sizeof(CompositeCollection)) + .wait_and_throw(); + + auto q = sycl_target->queue; + if (ndim == 3) { + + int correct_num_quads; + int correct_num_tris; + int correct_stride_quads; + int correct_stride_tris; + + if (rank == chosen_rank) { + correct_num_quads = h_cc.num_quads; + ASSERT_EQ(correct_num_quads, remote_quads.size()); + correct_num_tris = h_cc.num_tris; + ASSERT_EQ(correct_num_tris, remote_tris.size()); + correct_stride_quads = h_cc.stride_quads; + correct_stride_tris = h_cc.stride_tris; + } + + MPICHK(MPI_Bcast(&correct_num_quads, 1, MPI_INT, chosen_rank, comm)); + MPICHK(MPI_Bcast(&correct_num_tris, 1, MPI_INT, chosen_rank, comm)); + MPICHK(MPI_Bcast(&correct_stride_quads, 1, MPI_INT, chosen_rank, comm)); + MPICHK(MPI_Bcast(&correct_stride_tris, 1, MPI_INT, chosen_rank, comm)); + + EXPECT_EQ(h_cc.num_quads, correct_num_quads); + EXPECT_EQ(h_cc.num_tris, correct_num_tris); + EXPECT_EQ(h_cc.stride_quads, correct_stride_quads); + EXPECT_EQ(h_cc.stride_tris, correct_stride_tris); + + std::vector correct_composite_ids_quads(correct_num_quads); + std::vector correct_composite_ids_tris(correct_num_tris); + std::vector correct_geom_ids_quads(correct_num_quads); + std::vector correct_geom_ids_tris(correct_num_tris); + std::vector test_composite_ids_quads(correct_num_quads); + std::vector test_composite_ids_tris(correct_num_tris); + std::vector test_geom_ids_quads(correct_num_quads); + std::vector test_geom_ids_tris(correct_num_tris); + + if (rank == chosen_rank) { + q.memcpy(correct_composite_ids_quads.data(), h_cc.composite_ids_quads, + correct_num_quads * sizeof(int)) + .wait_and_throw(); + q.memcpy(correct_composite_ids_tris.data(), h_cc.composite_ids_tris, + correct_num_tris * sizeof(int)) + .wait_and_throw(); + q.memcpy(correct_geom_ids_quads.data(), h_cc.geom_ids_quads, + correct_num_quads * sizeof(int)) + .wait_and_throw(); + q.memcpy(correct_geom_ids_tris.data(), h_cc.geom_ids_tris, + correct_num_tris * sizeof(int)) + .wait_and_throw(); + + std::vector quads_lpi( + correct_num_quads); + std::vector tris_lpi( + correct_num_tris); + q.memcpy(quads_lpi.data(), h_cc.lpi_quads, + correct_num_quads * + sizeof(CompositeInteraction::LinePlaneIntersection)) + .wait_and_throw(); + q.memcpy(tris_lpi.data(), h_cc.lpi_tris, + correct_num_tris * + sizeof(CompositeInteraction::LinePlaneIntersection)) + .wait_and_throw(); + + auto lambda_find_geom = [&](const int gid, auto container) -> int { + int index = 0; + for (auto gx : container) { + if (gx->id == gid) { + return index; + } + index++; + } + return -1; + }; + for (int qx = 0; qx < correct_num_quads; qx++) { + const int gid = correct_geom_ids_quads.at(qx); + const int index = lambda_find_geom(gid, remote_quads); + ASSERT_EQ(remote_quads.at(index)->id, gid); + auto rgeom = remote_quads.at(index); + CompositeInteraction::LinePlaneIntersection lpi_correct(rgeom->geom); + auto lpi_to_test = quads_lpi.at(qx); + ASSERT_NEAR(lpi_correct.point0, lpi_to_test.point0, 1.0e-15); + ASSERT_NEAR(lpi_correct.point1, lpi_to_test.point1, 1.0e-15); + ASSERT_NEAR(lpi_correct.point2, lpi_to_test.point2, 1.0e-15); + ASSERT_NEAR(lpi_correct.normal0, lpi_to_test.normal0, 1.0e-15); + ASSERT_NEAR(lpi_correct.normal1, lpi_to_test.normal1, 1.0e-15); + ASSERT_NEAR(lpi_correct.normal2, lpi_to_test.normal2, 1.0e-15); + } + for (int qx = 0; qx < correct_num_tris; qx++) { + const int gid = correct_geom_ids_tris.at(qx); + const int index = lambda_find_geom(gid, remote_tris); + ASSERT_EQ(remote_tris.at(index)->id, gid); + auto rgeom = remote_tris.at(index); + CompositeInteraction::LinePlaneIntersection lpi_correct(rgeom->geom); + auto lpi_to_test = tris_lpi.at(qx); + ASSERT_NEAR(lpi_correct.point0, lpi_to_test.point0, 1.0e-15); + ASSERT_NEAR(lpi_correct.point1, lpi_to_test.point1, 1.0e-15); + ASSERT_NEAR(lpi_correct.point2, lpi_to_test.point2, 1.0e-15); + ASSERT_NEAR(lpi_correct.normal0, lpi_to_test.normal0, 1.0e-15); + ASSERT_NEAR(lpi_correct.normal1, lpi_to_test.normal1, 1.0e-15); + ASSERT_NEAR(lpi_correct.normal2, lpi_to_test.normal2, 1.0e-15); + } + } + q.memcpy(test_composite_ids_quads.data(), h_cc.composite_ids_quads, + correct_num_quads * sizeof(int)) + .wait_and_throw(); + q.memcpy(test_composite_ids_tris.data(), h_cc.composite_ids_tris, + correct_num_tris * sizeof(int)) + .wait_and_throw(); + q.memcpy(test_geom_ids_quads.data(), h_cc.geom_ids_quads, + correct_num_quads * sizeof(int)) + .wait_and_throw(); + q.memcpy(test_geom_ids_tris.data(), h_cc.geom_ids_tris, + correct_num_tris * sizeof(int)) + .wait_and_throw(); + + MPICHK(MPI_Bcast(correct_composite_ids_quads.data(), correct_num_quads, + MPI_INT, chosen_rank, comm)); + MPICHK(MPI_Bcast(correct_composite_ids_tris.data(), correct_num_tris, + MPI_INT, chosen_rank, comm)); + MPICHK(MPI_Bcast(correct_geom_ids_quads.data(), correct_num_quads, MPI_INT, + chosen_rank, comm)); + MPICHK(MPI_Bcast(correct_geom_ids_tris.data(), correct_num_tris, MPI_INT, + chosen_rank, comm)); + + EXPECT_EQ(correct_composite_ids_quads, test_composite_ids_quads); + EXPECT_EQ(correct_composite_ids_tris, test_composite_ids_tris); + EXPECT_EQ(correct_geom_ids_quads, test_geom_ids_quads); + EXPECT_EQ(correct_geom_ids_tris, test_geom_ids_tris); + + } else if (ndim == 2) { + + int correct_num_segments; + + if (rank == chosen_rank) { + correct_num_segments = h_cc.num_segments; + ASSERT_EQ(correct_num_segments, remote_segments.size()); + } + + MPICHK(MPI_Bcast(&correct_num_segments, 1, MPI_INT, chosen_rank, comm)); + EXPECT_EQ(h_cc.num_segments, correct_num_segments); + + std::vector test_composite_ids(correct_num_segments); + std::vector test_geom_ids(correct_num_segments); + std::vector correct_composite_ids(correct_num_segments); + std::vector correct_geom_ids(correct_num_segments); + + q.memcpy(test_composite_ids.data(), h_cc.composite_ids_segments, + correct_num_segments * sizeof(int)) + .wait_and_throw(); + q.memcpy(test_geom_ids.data(), h_cc.geom_ids_segments, + correct_num_segments * sizeof(int)) + .wait_and_throw(); + + if (rank == chosen_rank) { + q.memcpy(correct_composite_ids.data(), h_cc.composite_ids_segments, + correct_num_segments * sizeof(int)) + .wait_and_throw(); + q.memcpy(correct_geom_ids.data(), h_cc.geom_ids_segments, + correct_num_segments * sizeof(int)) + .wait_and_throw(); + } + + MPICHK(MPI_Bcast(correct_composite_ids.data(), correct_num_segments, + MPI_INT, chosen_rank, comm)); + MPICHK(MPI_Bcast(correct_geom_ids.data(), correct_num_segments, MPI_INT, + chosen_rank, comm)); + EXPECT_EQ(correct_composite_ids, test_composite_ids); + EXPECT_EQ(correct_geom_ids, test_geom_ids); + } + + composite_transport->free(); + composite_collections->free(); + sycl_target->free(); + mesh->free(); +} + +TEST_P(CompositeInteractionAllD, Intersection) { + const int N_total = 5000; + NekDouble newton_tol = 1.0e-8; + + std::tuple param = GetParam(); + + const std::string filename_conditions = std::get<0>(param); + const std::string filename_mesh = std::get<1>(param); + const int ndim = std::get<2>(param); + + TestUtilities::TestResourceSession resources_session(filename_mesh, + filename_conditions); + auto session = resources_session.session; + + // Create MeshGraph. + auto graph = SpatialDomains::MeshGraph::Read(session); + auto mesh = std::make_shared(graph); + auto sycl_target = std::make_shared(0, mesh->get_comm()); + auto nektar_graph_local_mapper = + std::make_shared(sycl_target, mesh); + auto domain = std::make_shared(mesh, nektar_graph_local_mapper); + + ParticleSpec particle_spec{ParticleProp(Sym("P"), ndim, true), + ParticleProp(Sym("NORMAL"), 3), + ParticleProp(Sym("CELL_ID"), 1, true)}; + + 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); + 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] = px % cell_count; + } + A->add_particles_local(initial_distribution); + } + + pbc.execute(); + A->hybrid_move(); + cell_id_translation->execute(); + A->cell_move(); + + std::map> boundary_groups; + boundary_groups[100] = {100}; + boundary_groups[200] = {200}; + boundary_groups[300] = {300}; + boundary_groups[400] = {400}; + if (ndim > 2) { + boundary_groups[500] = {500}; + boundary_groups[600] = {600}; + } + + auto composite_intersection = std::make_shared( + sycl_target, mesh, boundary_groups); + + // Test pre integration actually copied the current positions + composite_intersection->pre_integration(A); + + for (int cellx = 0; cellx < cell_count; cellx++) { + auto P = A->position_dat->cell_dat.get_cell(cellx); + auto PP = A->get_dat(composite_intersection->previous_position_sym) + ->cell_dat.get_cell(cellx); + + for (int rowx = 0; rowx < P->nrow; rowx++) { + for (int dimx = 0; dimx < ndim; dimx++) { + ASSERT_EQ((*P)[dimx][rowx], (*PP)[dimx][rowx]); + } + } + } + + // find cells on the unmoved particles should return the mesh hierarchy cells + // the particles are currently in + std::set cells; + composite_intersection->test_find_cells(A, cells); + + auto mesh_hierarchy_mapper = std::make_unique( + sycl_target, mesh->get_mesh_hierarchy()); + const auto mesh_hierarchy_device_mapper = + mesh_hierarchy_mapper->get_host_mapper(); + + for (int cellx = 0; cellx < cell_count; cellx++) { + auto P = A->position_dat->cell_dat.get_cell(cellx); + for (int rowx = 0; rowx < P->nrow; rowx++) { + REAL position[3] = {0.0, 0.0, 0.0}; + INT mh_cell[6] = {0, 0, 0, 0, 0, 0}; + for (int dimx = 0; dimx < ndim; dimx++) { + position[dimx] = (*P)[dimx][rowx]; + } + mesh_hierarchy_device_mapper.map_to_tuple(position, mh_cell); + const INT linear_cell = + mesh_hierarchy_device_mapper.tuple_to_linear_global(mh_cell); + ASSERT_TRUE(cells.count(linear_cell)); + } + } + + REAL offset_x; + REAL offset_y; + REAL offset_z; + + auto lambda_apply_offset = [&]() { + particle_loop( + A, + [=](auto P) { + P.at(0) += offset_x; + P.at(1) += offset_y; + if (ndim > 2) { + P.at(2) += offset_z; + } + }, + Access::write(Sym("P"))) + ->execute(); + }; + + auto reset_positions = particle_loop( + A, + [=](auto P, auto PP) { + for (int dx = 0; dx < ndim; dx++) { + P.at(dx) = PP.at(dx); + } + }, + Access::write(Sym("P")), + Access::read(Sym("NESO_COMP_INT_PREV_POS"))); + + auto lambda_test_normal = [&](auto correct_normal) { + auto device_normal_mapper = composite_intersection->composite_collections + ->get_device_normal_mapper(); + auto error_propagate = std::make_shared(sycl_target); + auto k_ep = error_propagate->device_ptr(); + particle_loop( + A, + [=](auto IN, auto IC) { + REAL *normal; + const INT geom_id = IC.at(2); + const bool has_normal = device_normal_mapper.get(geom_id, &normal); + NESO_KERNEL_ASSERT(has_normal, k_ep); + for (int dx = 0; dx < ndim; dx++) { + IN.at(dx) = normal[dx]; + } + }, + Access::write(Sym("NORMAL")), + Access::read(Sym("NESO_COMP_INT_OUTPUT_COMP"))) + ->execute(); + ASSERT_FALSE(error_propagate->get_flag()); + + for (int cellx = 0; cellx < cell_count; cellx++) { + auto IN = A->get_cell(Sym("NORMAL"), cellx); + for (int rowx = 0; rowx < IN->nrow; rowx++) { + for (int dx = 0; dx < ndim; dx++) { + ASSERT_TRUE( + (std::abs(IN->at(rowx, dx) - correct_normal[dx]) < 1.0e-15) || + (std::abs(IN->at(rowx, dx) + correct_normal[dx]) < 1.0e-15)); + } + } + } + }; + + auto lambda_test = [&](const int expected_composite, auto correct_normal) { + composite_intersection->pre_integration(A); + ASSERT_TRUE(A->contains_dat(Sym("NESO_COMP_INT_PREV_POS"))); + lambda_apply_offset(); + auto sub_groups = composite_intersection->get_intersections(A); + ASSERT_TRUE(A->contains_dat(Sym("NESO_COMP_INT_OUTPUT_POS"))); + ASSERT_TRUE(A->contains_dat(Sym("NESO_COMP_INT_OUTPUT_COMP"))); + + int local_count = 0; + for (int cellx = 0; cellx < cell_count; cellx++) { + auto P = A->get_cell(Sym("P"), cellx); + auto IP = A->get_cell(Sym("NESO_COMP_INT_OUTPUT_POS"), cellx); + auto IC = A->get_cell(Sym("NESO_COMP_INT_OUTPUT_COMP"), cellx); + for (int rowx = 0; rowx < P->nrow; rowx++) { + + auto hit_composite = IC->at(rowx, 0); + auto composite_id = IC->at(rowx, 1); + auto geom_id = IC->at(rowx, 2); + ASSERT_EQ(hit_composite, expected_composite); + + auto geom = composite_intersection->composite_collections + ->map_composites_to_geoms.at(composite_id) + .at(geom_id); + + Array point(3); + Array local_point(3); + Array global_point(3); + + point[0] = IP->at(rowx, 0); + point[1] = IP->at(rowx, 1); + if (ndim == 3) { + point[2] = IP->at(rowx, 2); + } else { + point[2] = 0.0; + } + + NekDouble dist; + bool contained = + geom->ContainsPoint(point, local_point, newton_tol, dist); + if (!contained) { + geom->GetLocCoords(point, local_point); + for (int dx = 0; dx < ndim; dx++) { + global_point[dx] = geom->GetCoord(dx, local_point); + } + double dist = 0.0; + for (int dx = 0; dx < ndim; dx++) { + const double r = point[dx] - global_point[dx]; + dist += r * r; + } + dist = std::sqrt(dist); + contained = dist < newton_tol * 10.0; + } + ASSERT_TRUE(contained); + local_count++; + } + } + + for (const auto bgx : boundary_groups) { + const int cx = bgx.first; + if (cx == expected_composite) { + ASSERT_EQ(sub_groups.at(cx)->get_npart_local(), local_count); + } else { + ASSERT_EQ(sub_groups.at(cx)->get_npart_local(), 0); + } + } + + lambda_test_normal(correct_normal); + }; + + REAL correct_normal[3] = {0.0, 0.0, 0.0}; + if (ndim == 2) { + offset_x = 0.0; + offset_y = 4.0; + offset_z = 0.0; + correct_normal[0] = 0.0; + correct_normal[1] = 1.0; + correct_normal[2] = 0.0; + lambda_test(300, correct_normal); + reset_positions->execute(); + offset_x = -4.0; + offset_y = 0.0; + offset_z = 0.0; + correct_normal[0] = 1.0; + correct_normal[1] = 0.0; + correct_normal[2] = 0.0; + lambda_test(400, correct_normal); + reset_positions->execute(); + offset_x = 4.0; + offset_y = 0.0; + offset_z = 0.0; + correct_normal[0] = 1.0; + correct_normal[1] = 0.0; + correct_normal[2] = 0.0; + lambda_test(200, correct_normal); + reset_positions->execute(); + offset_x = 0.0; + offset_y = -4.0; + offset_z = 0.0; + correct_normal[0] = 0.0; + correct_normal[1] = 1.0; + correct_normal[2] = 0.0; + lambda_test(100, correct_normal); + reset_positions->execute(); + } else if (ndim == 3) { + offset_x = 2.0; + offset_y = 0.0; + offset_z = 0.0; + correct_normal[0] = 1.0; + correct_normal[1] = 0.0; + correct_normal[2] = 0.0; + lambda_test(300, correct_normal); + reset_positions->execute(); + offset_x = -2.0; + offset_y = 0.0; + offset_z = 0.0; + correct_normal[0] = 1.0; + correct_normal[1] = 0.0; + correct_normal[2] = 0.0; + lambda_test(400, correct_normal); + reset_positions->execute(); + offset_x = 0.0; + offset_y = 2.0; + offset_z = 0.0; + correct_normal[0] = 0.0; + correct_normal[1] = 1.0; + correct_normal[2] = 0.0; + lambda_test(200, correct_normal); + reset_positions->execute(); + offset_x = 0.0; + offset_y = -2.0; + offset_z = 0.0; + correct_normal[0] = 0.0; + correct_normal[1] = 1.0; + correct_normal[2] = 0.0; + lambda_test(100, correct_normal); + reset_positions->execute(); + offset_x = 0.0; + offset_y = 0.0; + offset_z = 2.0; + correct_normal[0] = 0.0; + correct_normal[1] = 0.0; + correct_normal[2] = 1.0; + lambda_test(600, correct_normal); + reset_positions->execute(); + offset_x = 0.0; + offset_y = 0.0; + offset_z = -2.0; + correct_normal[0] = 0.0; + correct_normal[1] = 0.0; + correct_normal[2] = 1.0; + lambda_test(500, correct_normal); + reset_positions->execute(); + } + + A->free(); + sycl_target->free(); + mesh->free(); +} + +TEST_P(CompositeInteractionAllD, Reflection) { + const int N_total = 4000; + const REAL dt = 0.05; + const int N_steps = 50; + + std::tuple param = GetParam(); + + const std::string filename_conditions = std::get<0>(param); + const std::string filename_mesh = std::get<1>(param); + const int ndim = std::get<2>(param); + + TestUtilities::TestResourceSession resources_session(filename_mesh, + filename_conditions); + auto session = resources_session.session; + + // Create MeshGraph. + 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("MapParticles3DRegular/tol", 1.0e-10); + config->set("CompositeIntersection/newton_tol", 1.0e-8); + config->set("CompositeIntersection/line_intersection_tol", 1.0e-10); + config->set("NektarCompositeTruncatedReflection/reset_distance", + 1.0e-6); + + auto nektar_graph_local_mapper = + std::make_shared(sycl_target, mesh, config); + + auto domain = std::make_shared(mesh, nektar_graph_local_mapper); + + ParticleSpec particle_spec{ParticleProp(Sym("P"), ndim, true), + ParticleProp(Sym("V"), ndim), + ParticleProp(Sym("TSP"), 2), + 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); + 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); + 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); + + auto velocities = + NESO::Particles::normal_distribution(N, 3, 0.0, 0.5, 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("V")][px][dimx] = velocities[dimx][px]; + } + initial_distribution[Sym("CELL_ID")][px][0] = px % cell_count; + initial_distribution[Sym("ID")][px][0] = px; + } + A->add_particles_local(initial_distribution); + } + + pbc.execute(); + A->hybrid_move(); + cell_id_translation->execute(); + A->cell_move(); + + std::vector reflection_composite_indices = {100, 200, 300, 400}; + if (ndim > 2) { + reflection_composite_indices.push_back(500); + reflection_composite_indices.push_back(600); + } + + auto reflection = std::make_shared( + Sym("V"), Sym("TSP"), sycl_target, mesh, + reflection_composite_indices, config); + + auto lambda_apply_timestep_reset = [&](auto aa) { + particle_loop( + aa, + [=](auto TSP) { + TSP.at(0) = 0.0; + TSP.at(1) = 0.0; + }, + Access::write(Sym("TSP"))) + ->execute(); + }; + + auto lambda_apply_advection_step = + [=](ParticleSubGroupSharedPtr iteration_set) -> void { + particle_loop( + "euler_advection", iteration_set, + [=](auto V, auto P, auto TSP) { + const REAL dt_left = dt - TSP.at(0); + if (dt_left > 0.0) { + for (int dx = 0; dx < ndim; dx++) { + P.at(dx) += dt_left * V.at(dx); + } + TSP.at(0) = dt; + TSP.at(1) = dt_left; + } + }, + Access::read(Sym("V")), Access::write(Sym("P")), + Access::write(Sym("TSP"))) + ->execute(); + }; + + auto lambda_pre_advection = [&](auto aa) { reflection->pre_advection(aa); }; + + auto lambda_apply_boundary_conditions = [&](auto aa) { + reflection->execute(aa); + }; + + auto lambda_find_partial_moves = [&](auto aa) { + return static_particle_sub_group( + A, [=](auto TSP) { return TSP.at(0) < dt; }, + Access::read(Sym("TSP"))); + }; + + auto lambda_partial_moves_remaining = [&](auto aa) -> bool { + const int size = aa->get_npart_local(); + int size_global; + MPICHK(MPI_Allreduce(&size, &size_global, 1, MPI_INT, MPI_SUM, + sycl_target->comm_pair.comm_parent)); + return size_global > 0; + }; + + auto lambda_apply_timestep = [&](auto aa) { + lambda_apply_timestep_reset(aa); + lambda_pre_advection(aa); + lambda_apply_advection_step(aa); + lambda_apply_boundary_conditions(aa); + aa = lambda_find_partial_moves(aa); + while (lambda_partial_moves_remaining(aa)) { + lambda_pre_advection(aa); + lambda_apply_advection_step(aa); + lambda_apply_boundary_conditions(aa); + aa = lambda_find_partial_moves(aa); + } + }; + + auto error_propagate = std::make_shared(sycl_target); + auto k_ep = error_propagate->device_ptr(); + auto check_loop = particle_loop( + A, + [=](auto TSP) { + const bool cond = std::abs(TSP.at(0) - dt) < 1.0e-15; + NESO_KERNEL_ASSERT(cond, k_ep); + }, + Access::read(Sym("TSP"))); + + for (int stepx = 0; stepx < N_steps; stepx++) { + lambda_apply_timestep(static_particle_sub_group(A)); + check_loop->execute(); + EXPECT_TRUE(!error_propagate->get_flag()); + A->hybrid_move(); + cell_id_translation->execute(); + A->cell_move(); + } + + A->free(); + sycl_target->free(); + mesh->free(); +} + +INSTANTIATE_TEST_SUITE_P( + MultipleMeshes, CompositeInteractionAllD, + testing::Values(std::tuple( + "conditions.xml", "square_triangles_quads.xml", 2), + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/linear_non_regular_0.5.xml", + 3))); diff --git a/test/unit/nektar_interface/test_helper_utilities.hpp b/test/unit/nektar_interface/test_helper_utilities.hpp new file mode 100644 index 00000000..d977f520 --- /dev/null +++ b/test/unit/nektar_interface/test_helper_utilities.hpp @@ -0,0 +1,85 @@ +#ifndef _TEST_UNIT_NEKTAR_INTERFACE_TEST_HELPER_UTILTIES_HPP_ +#define _TEST_UNIT_NEKTAR_INTERFACE_TEST_HELPER_UTILTIES_HPP_ + +#include "nektar_interface/composite_interaction/composite_interaction.hpp" +#include "nektar_interface/particle_interface.hpp" +#include "nektar_interface/utilities.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 Nektar; +using namespace Nektar::SolverUtils; +using namespace Nektar::LibUtilities; +using namespace Nektar::SpatialDomains; +using namespace NESO; +using namespace NESO::Particles; + +inline void copy_to_cstring(std::string input, char **output) { + *output = new char[input.length() + 1]; + std::strcpy(*output, input.c_str()); +} + +namespace NESO::TestUtilities { + +/** + * Type to aid loading test resources into Nektar++ sessions. + */ +class TestResourceSession { +protected: + char *argv[3]; + +public: + /// The session created from test resources. + LibUtilities::SessionReaderSharedPtr session; + + ~TestResourceSession() { + delete[] this->argv[0]; + delete[] this->argv[1]; + delete[] this->argv[2]; + } + + /** + * 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. + * @param filename_conditions Path relative to the test_resources directory + * for the conditions. + */ + 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]); + std::filesystem::path mesh_file = test_resources_dir / filename_mesh; + copy_to_cstring(std::string(mesh_file), &this->argv[2]); + + // Create session reader. + session = LibUtilities::SessionReader::CreateInstance(3, this->argv); + } +}; + +} // namespace NESO::TestUtilities + +#endif diff --git a/test/unit/nektar_interface/test_particle_embed_mapping.cpp b/test/unit/nektar_interface/test_particle_embed_mapping.cpp new file mode 100644 index 00000000..d90836c8 --- /dev/null +++ b/test/unit/nektar_interface/test_particle_embed_mapping.cpp @@ -0,0 +1,360 @@ +#include "nektar_interface/particle_interface.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "nektar_interface/composite_interaction/composite_interaction.hpp" +#include "nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp" + +using namespace Nektar; +using namespace Nektar::SolverUtils; +using namespace Nektar::SpatialDomains; +using namespace NESO::Particles; +using namespace NESO::CompositeInteraction; + +static inline void copy_to_cstring(std::string input, char **output) { + *output = new char[input.length() + 1]; + std::strcpy(*output, input.c_str()); +} + +template +static inline void get_point_in_and_out_plane(U &geom, R &rng, REAL *point_in, + REAL *point_out) { + + std::uniform_real_distribution ref_distribution(-1.0, 1.0); + Array xi(3); + Array cg(3); + REAL g[3]; + + // Get a point in the reference element + cg[0] = ref_distribution(rng); + cg[1] = ref_distribution(rng); + cg[2] = 0.0; + + xi[0] = 0.0; + xi[1] = 0.0; + xi[2] = 0.0; + geom->GetXmap()->LocCollapsedToLocCoord(cg, xi); + + // check the map from reference space to global space + for (int dx = 0; dx < 3; dx++) { + point_in[dx] = geom->GetCoord(dx, xi); + point_out[dx] = -1.0 * point_in[dx]; + } +} + +template +static inline void check_geom_map(T &n, U &geom, R &rng) { + + const int N_test = 5; + std::uniform_real_distribution ref_distribution(-1.0, 1.0); + Array xi(3); + Array cg(3); + REAL g[3]; + + for (int testx = 0; testx < N_test; testx++) { + + // Get a point in the reference element + cg[0] = ref_distribution(rng); + cg[1] = ref_distribution(rng); + cg[2] = 0.0; + + xi[0] = 0.0; + xi[1] = 0.0; + xi[2] = 0.0; + geom->GetXmap()->LocCollapsedToLocCoord(cg, xi); + + const int ndim = geom->GetCoordim(); + n.x(xi[0], xi[1], xi[2], g, g + 1, g + 2); + // check the map from reference space to global space + for (int dx = 0; dx < ndim; dx++) { + cg[dx] = geom->GetCoord(dx, xi); + if (std::isfinite(cg[dx])) { + const REAL err_abs = abs(cg[dx] - g[dx]); + const REAL err = std::min(err_abs, err_abs / abs(cg[dx])); + ASSERT_TRUE(err < 1.0e-12); + } + } + + // check the map from global space back to reference space + REAL xi_check[3]; + n.x_inverse(g[0], g[1], g[2], xi_check, xi_check + 1, xi_check + 2); + for (int dx = 0; dx < ndim; dx++) { + const REAL err_abs = abs(xi_check[dx] - xi[dx]); + const REAL err_rel_t = err_abs / std::abs(xi[dx]); + const REAL err_rel = std::isnormal(err_rel_t) ? err_rel_t : err_abs; + const REAL err = std::min(err_abs, err_rel); + // The exit tol on the newton method is 1E-10 so we test against 1E-8. + ASSERT_TRUE(err < 1.0e-8); + } + } +} + +TEST(EmbeddedXMapping, Base) { + const int N_total = 2000; + + 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"; + 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); + auto mesh = std::make_shared(graph); + auto sycl_target = std::make_shared(0, mesh->get_comm()); + + auto graph_composites = graph->GetComposites(); + + std::vector compsite_indices(6); + compsite_indices[0] = 100; + compsite_indices[1] = 200; + compsite_indices[2] = 300; + compsite_indices[3] = 400; + compsite_indices[4] = 500; + compsite_indices[5] = 600; + std::mt19937 rng(182348 + sycl_target->comm_pair.rank_parent); + + for (auto cx : compsite_indices) { + if (graph_composites.count(cx)) { + auto geoms = graph_composites.at(cx)->m_geomVec; + for (auto &geom : geoms) { + if (geom->GetShapeType() == eQuadrilateral) { + auto n = Newton::XMapNewton( + sycl_target, geom); + check_geom_map(n, geom, rng); + } else if (geom->GetShapeType() == eTriangle) { + auto n = Newton::XMapNewton( + sycl_target, geom); + check_geom_map(n, geom, rng); + } + } + } + } + + mesh->free(); + delete[] argv[0]; + delete[] argv[1]; +} + +TEST(EmbeddedXMapping, LinePlaneIntersection) { + const int N_total = 2000; + + 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"; + 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); + auto mesh = std::make_shared(graph); + auto sycl_target = std::make_shared(0, mesh->get_comm()); + + auto graph_composites = graph->GetComposites(); + + std::vector compsite_indices(6); + compsite_indices[0] = 100; + compsite_indices[1] = 200; + compsite_indices[2] = 300; + compsite_indices[3] = 400; + compsite_indices[4] = 500; + compsite_indices[5] = 600; + std::mt19937 rng(182348 + sycl_target->comm_pair.rank_parent); + + for (auto cx : compsite_indices) { + if (graph_composites.count(cx)) { + auto geoms = graph_composites.at(cx)->m_geomVec; + for (auto &geom : geoms) { + + LinePlaneIntersection line_plane_intersection(geom); + REAL point_in[3], point_out[3], point_int[3], origin[3]; + origin[0] = 0; + origin[1] = 0; + origin[2] = 0; + get_point_in_and_out_plane(geom, rng, point_in, point_out); + bool exists; + // line stops in the plane + exists = line_plane_intersection.line_segment_intersection( + origin[0], origin[1], origin[2], point_in[0], point_in[1], + point_in[2], point_int, point_int + 1, point_int + 2); + ASSERT_TRUE(exists); + ASSERT_NEAR(point_in[0], point_int[0], 1.0e-13); + ASSERT_NEAR(point_in[1], point_int[1], 1.0e-13); + ASSERT_NEAR(point_in[2], point_int[2], 1.0e-13); + // line points away from the plane + exists = line_plane_intersection.line_segment_intersection( + origin[0], origin[1], origin[2], point_out[0], point_out[1], + point_out[2], point_int, point_int + 1, point_int + 2); + ASSERT_TRUE(!exists); + // trivial line in the plane + exists = line_plane_intersection.line_segment_intersection( + point_in[0], point_in[1], point_in[2], point_in[0], point_in[1], + point_in[2], point_int, point_int + 1, point_int + 2); + ASSERT_TRUE(exists); + ASSERT_NEAR(point_in[0], point_int[0], 1.0e-13); + ASSERT_NEAR(point_in[1], point_int[1], 1.0e-13); + ASSERT_NEAR(point_in[2], point_int[2], 1.0e-13); + // trivial line out of the plane + exists = line_plane_intersection.line_segment_intersection( + origin[0], origin[1], origin[2], origin[0], origin[1], origin[2], + point_int, point_int + 1, point_int + 2); + ASSERT_TRUE(!exists); + // line stops short of plane + REAL point_short[3]; + point_short[0] = point_in[0] * 0.95; + point_short[1] = point_in[1] * 0.95; + point_short[2] = point_in[2] * 0.95; + exists = line_plane_intersection.line_segment_intersection( + origin[0], origin[1], origin[2], point_short[0], point_short[1], + point_short[2], point_int, point_int + 1, point_int + 2); + ASSERT_TRUE(!exists); + // line goes through plane + REAL point_long[3]; + point_long[0] = point_in[0] * 1.5; + point_long[1] = point_in[1] * 1.5; + point_long[2] = point_in[2] * 1.5; + exists = line_plane_intersection.line_segment_intersection( + origin[0], origin[1], origin[2], point_long[0], point_long[1], + point_long[2], point_int, point_int + 1, point_int + 2); + ASSERT_TRUE(exists); + ASSERT_NEAR(point_in[0], point_int[0], 1.0e-13); + ASSERT_NEAR(point_in[1], point_int[1], 1.0e-13); + ASSERT_NEAR(point_in[2], point_int[2], 1.0e-13); + // non trivial line in the plane + NekDouble x, y, z; + geom->GetVertex(0)->GetCoords(x, y, z); + REAL point_in2[3] = {x, y, z}; + exists = line_plane_intersection.line_segment_intersection( + point_in2[0], point_in2[1], point_in2[2], point_in[0], point_in[1], + point_in[2], point_int, point_int + 1, point_int + 2); + ASSERT_TRUE(exists); + ASSERT_NEAR(point_in2[0], point_int[0], 1.0e-13); + ASSERT_NEAR(point_in2[1], point_int[1], 1.0e-13); + ASSERT_NEAR(point_in2[2], point_int[2], 1.0e-13); + // line starts in the plane + exists = line_plane_intersection.line_segment_intersection( + point_in[0], point_in[1], point_in[2], point_out[0], point_out[1], + point_out[2], point_int, point_int + 1, point_int + 2); + ASSERT_TRUE(exists); + ASSERT_NEAR(point_in[0], point_int[0], 1.0e-13); + ASSERT_NEAR(point_in[1], point_int[1], 1.0e-13); + ASSERT_NEAR(point_in[2], point_int[2], 1.0e-13); + + // test the is near functionality + const int num_verts = geom->GetNumVerts(); + + for (int vx = 0; vx < num_verts; vx++) { + + NekDouble t0, t1, t2; + auto vertex = geom->GetVertex(vx); + vertex->GetCoords(t0, t1, t2); + ASSERT_TRUE(line_plane_intersection.point_near_to_geom(t0, t1, t2)); + } + + ASSERT_TRUE(line_plane_intersection.point_near_to_geom( + point_in[0], point_in[1], point_in[2])); + } + } + } + + mesh->free(); + delete[] argv[0]; + delete[] argv[1]; +} + +TEST(EmbeddedXMapping, LineLineIntersection) { + + auto lambda_make_seggeom = [&](auto a, auto b) { + std::vector points = { + std::make_shared(2, 0, a[0], a[1], 0.0), + std::make_shared(2, 1, b[0], b[1], 0.0)}; + return std::make_shared(0, 2, points.data()); + }; + + auto lambda_test_line = [&](auto lli, auto x, auto y, auto *i) -> bool { + return lli.line_line_intersection(x[0], x[1], y[0], y[1], i, i + 1); + }; + + REAL i[2] = {0.0, 0.0}; + + { + REAL a[2] = {0.0, 0.0}; + REAL b[2] = {1.0, 0.0}; + auto s = lambda_make_seggeom(a, b); + auto lli = CompositeInteraction::LineLineIntersection(s); + REAL x[2] = {0.5, -0.5}; + REAL y[2] = {0.5, 0.5}; + ASSERT_TRUE(lambda_test_line(lli, x, y, i)); + ASSERT_NEAR(i[0], 0.5, 1.0e-14); + ASSERT_NEAR(i[1], 0.0, 1.0e-14); + + ASSERT_NEAR(lli.normalx, 0.0, 1.0e-14); + ASSERT_NEAR(lli.normaly, 1.0, 1.0e-14); + } + { + REAL a[2] = {0.5, -0.5}; + REAL b[2] = {0.5, 0.5}; + auto s = lambda_make_seggeom(a, b); + auto lli = CompositeInteraction::LineLineIntersection(s); + REAL x[2] = {0.0, 0.0}; + REAL y[2] = {1.0, 0.0}; + ASSERT_TRUE(lambda_test_line(lli, x, y, i)); + ASSERT_NEAR(i[0], 0.5, 1.0e-14); + ASSERT_NEAR(i[1], 0.0, 1.0e-14); + + ASSERT_NEAR(lli.normalx, -1.0, 1.0e-14); + ASSERT_NEAR(lli.normaly, 0.0, 1.0e-14); + } + + { + REAL a[2] = {0.5, -0.5}; + REAL b[2] = {0.5, -0.0001}; + auto s = lambda_make_seggeom(a, b); + auto lli = CompositeInteraction::LineLineIntersection(s); + REAL x[2] = {0.0, 0.0}; + REAL y[2] = {1.0, 0.0}; + ASSERT_FALSE(lambda_test_line(lli, x, y, i)); + } +} diff --git a/test/unit/nektar_interface/test_particle_mapping.cpp b/test/unit/nektar_interface/test_particle_mapping.cpp index 71ea5b58..86484527 100644 --- a/test/unit/nektar_interface/test_particle_mapping.cpp +++ b/test/unit/nektar_interface/test_particle_mapping.cpp @@ -1,4 +1,7 @@ +#include "nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp" #include "nektar_interface/particle_interface.hpp" +#include "nektar_interface/utilities.hpp" +#include "nektar_interface/utility_mesh_plotting.hpp" #include #include #include @@ -14,9 +17,6 @@ #include #include -#include "nektar_interface/particle_cell_mapping/newton_geom_interfaces.hpp" - -using namespace std; using namespace Nektar; using namespace Nektar::SolverUtils; using namespace Nektar::SpatialDomains; @@ -180,7 +180,7 @@ INSTANTIATE_TEST_SUITE_P( ))); template -inline void check_geom_map(T &n, U &geom, R &rng) { +static inline void check_geom_map(T &n, U &geom, R &rng) { const int N_test = 5; std::uniform_real_distribution ref_distribution(-1.0, 1.0); @@ -391,14 +391,106 @@ TEST_P(ParticleGeometryInterface, LocalMapping3D) { INSTANTIATE_TEST_SUITE_P( MultipleMeshes, ParticleGeometryInterface, - testing::Values(std::tuple( - "reference_all_types_cube/conditions.xml", - "reference_all_types_cube/linear_non_regular_0.5.xml", - 2.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/mixed_ref_cube_0.5_perturbed.xml", + 2.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))); + +class ParticleGeometryInterfaceSampling + : public testing::TestWithParam< + std::tuple> {}; +TEST_P(ParticleGeometryInterfaceSampling, Sampling) { + + std::tuple param = GetParam(); + + 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; + // Create session reader. + session = LibUtilities::SessionReader::CreateInstance(argc, argv); + graph = SpatialDomains::MeshGraph::Read(session); + + auto mesh = std::make_shared(graph); + + std::mt19937 rng(235235); + const int npart_per_cell = 100; + std::vector> positions; + std::vector cells; + + uniform_within_elements(graph, npart_per_cell, positions, cells, 1.0e-12, + rng); + + const int cell_count = mesh->get_cell_count(); + const int npart_total = cell_count * npart_per_cell; + ASSERT_EQ(positions.size(), 3); + ASSERT_EQ(positions.at(0).size(), npart_total); + ASSERT_EQ(positions.at(1).size(), npart_total); + ASSERT_EQ(positions.at(2).size(), npart_total); + ASSERT_EQ(cells.size(), cell_count * npart_per_cell); + + std::map> geoms_3d; + get_all_elements_3d(graph, geoms_3d); + + std::vector> geoms_3dv; + geoms_3dv.reserve(cell_count); + for (auto pair_geom : geoms_3d) { + geoms_3dv.push_back(pair_geom.second); + } + + Array coord(3); + for (int px = 0; px < npart_total; px++) { + const int cx = cells.at(px); + auto geom = geoms_3dv.at(cx); + coord[0] = positions.at(0).at(px); + coord[1] = positions.at(1).at(px); + coord[2] = positions.at(2).at(px); + ASSERT_TRUE(geom->ContainsPoint(coord, 1.0e-12)); + } + + mesh->free(); + delete[] argv[0]; + delete[] argv[1]; + delete[] argv[2]; +} + +INSTANTIATE_TEST_SUITE_P( + Sampling, ParticleGeometryInterfaceSampling, + testing::Values( + std::tuple( + "reference_all_types_cube/conditions.xml", + "reference_all_types_cube/mixed_ref_cube_0.5_perturbed.xml", + 2.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)));