From 75c1053c33fa010c13f9e8b0ab23a48449eb5212 Mon Sep 17 00:00:00 2001 From: Luca Heltai Date: Thu, 18 May 2017 15:38:27 +0200 Subject: [PATCH] Implemented regularize corner cells --- doc/doxygen/images/regularize_mesh_01.png | Bin 0 -> 4559 bytes doc/doxygen/images/regularize_mesh_02.png | Bin 0 -> 5348 bytes doc/doxygen/images/regularize_mesh_03.png | Bin 0 -> 4635 bytes doc/news/changes/minor/20170518LucaHeltai | 5 + include/deal.II/grid/grid_tools.h | 93 ++++ source/grid/grid_tools.cc | 307 ++++++++++++ source/grid/grid_tools.inst.in | 3 + tests/grid/grid_tools_regularize_01.cc | 50 ++ tests/grid/grid_tools_regularize_01.output | 35 ++ tests/grid/grid_tools_regularize_02.cc | 55 +++ tests/grid/grid_tools_regularize_02.output | 520 +++++++++++++++++++++ 11 files changed, 1068 insertions(+) create mode 100644 doc/doxygen/images/regularize_mesh_01.png create mode 100644 doc/doxygen/images/regularize_mesh_02.png create mode 100644 doc/doxygen/images/regularize_mesh_03.png create mode 100644 doc/news/changes/minor/20170518LucaHeltai create mode 100644 tests/grid/grid_tools_regularize_01.cc create mode 100644 tests/grid/grid_tools_regularize_01.output create mode 100644 tests/grid/grid_tools_regularize_02.cc create mode 100644 tests/grid/grid_tools_regularize_02.output diff --git a/doc/doxygen/images/regularize_mesh_01.png b/doc/doxygen/images/regularize_mesh_01.png new file mode 100644 index 0000000000000000000000000000000000000000..3e681db8910f57df50b38503bb945ac0f3d026a7 GIT binary patch literal 4559 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 Vf)^e&C!ZJqz{J3USgq$l`9H}74Qv1a literal 0 HcmV?d00001 diff --git a/doc/doxygen/images/regularize_mesh_02.png b/doc/doxygen/images/regularize_mesh_02.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5b6a543b5b4a634fcd29a98fa9bf97cbaa45a5 GIT binary patch literal 5348 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 literal 0 HcmV?d00001 diff --git a/doc/doxygen/images/regularize_mesh_03.png b/doc/doxygen/images/regularize_mesh_03.png new file mode 100644 index 0000000000000000000000000000000000000000..08969ee8732c9187c54638541adc48ef0dece255 GIT binary patch literal 4635 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 literal 0 HcmV?d00001 diff --git a/doc/news/changes/minor/20170518LucaHeltai b/doc/news/changes/minor/20170518LucaHeltai new file mode 100644 index 0000000000..30f83a2bca --- /dev/null +++ b/doc/news/changes/minor/20170518LucaHeltai @@ -0,0 +1,5 @@ +New: Added a GridTools::regularize_corner_cells function that +detects if the boundary cells of a mesh at corner positions +(with dim adjacent faces on the boundary) need to be split into +cells with smaller angles. +
(Luca Heltai, Martin Kronbichler, 2017/05/18) diff --git a/include/deal.II/grid/grid_tools.h b/include/deal.II/grid/grid_tools.h index 7b90b8672e..37198c9744 100644 --- a/include/deal.II/grid/grid_tools.h +++ b/include/deal.II/grid/grid_tools.h @@ -461,6 +461,99 @@ namespace GridTools const double max_ratio = 1.6180339887, const unsigned int max_iterations = 5); + /** + * Analyze the boundary cells of a mesh, and if one cell is found at + * a corner position (with dim adjacent faces on the boundary), and its + * dim-dimensional angle fraction exceeds @p limit_angle_fraction, + * refine globally once, and replace the children of such cell + * with children where the corner is no longer offending the given angle + * fraction. + * + * If no boundary cells exist with two adjacent faces on the boundary, then + * the triangulation is left untouched. If instead we do have cells with dim + * adjacent faces on the boundary, then the fraction between the dim-dimensional + * solid angle and dim*pi/2 is checked against the parameter @p limit_angle_fraction. + * If it is higher, the grid is refined once, and the children of the + * offending cell are replaced with some cells that instead respect the limit. After + * this process the triangulation is flattened, and all Manifold objects are restored + * as they were in the original triangulation. + * + * An example is given by the following mesh, obtained by attaching a SphericalManifold + * to a mesh generated using GridGenerator::hyper_cube: + * + * @code + * const SphericalManifold m0; + * Triangulation tria; + * GridGenerator::hyper_cube(tria,-1,1); + * tria.set_all_manifold_ids_on_boundary(0); + * tria.set_manifold(0, m0); + * tria.refine_global(4); + * @endcode + * + *

+ * @image html regularize_mesh_01.png + *

+ * + * The four cells that were originally the corners of a square will give you some troubles + * during computations, as the jacobian of the transformation from the reference cell to + * those cells will go to zero, affecting the error constants of the finite element estimates. + * + * Those cells have a corner with an angle that is very close to 180 degrees, i.e., an angle + * fraction very close to one. + * + * The same code, adding a call to regularize_corner_cells: + * @code + * const SphericalManifold m0; + * Triangulation tria; + * GridGenerator::hyper_cube(tria,-1,1); + * tria.set_all_manifold_ids_on_boundary(0); + * tria.set_manifold(0, m0); + * GridTools::regularize_corner_cells(tria); + * tria.refine_global(2); + * @endcode + * generates a mesh that has a much better behaviour w.r.t. the jacobian of the Mapping: + * + *

+ * @image html regularize_mesh_02.png + *

+ * + * This mesh is very similar to the one obtained by GridGenerator::hyper_ball. However, using + * GridTools::regularize_corner_cells one has the freedom to choose when to apply the + * regularization, i.e., one could in principle first refine a few times, and then call the + * regularize_corner_cells function: + * + * @code + * const SphericalManifold m0; + * Triangulation tria; + * GridGenerator::hyper_cube(tria,-1,1); + * tria.set_all_manifold_ids_on_boundary(0); + * tria.set_manifold(0, m0); + * tria.refine_global(2); + * GridTools::regularize_corner_cells(tria); + * tria.refine_global(1); + * @endcode + * + * This generates the following mesh: + * + *

+ * @image html regularize_mesh_03.png + *

+ * + * The function is currently implemented only for dim = 2 and + * will throw an exception if called with dim = 3. + * + * @param[in,out] tria Triangulation to regularize. + * + * @param[in] limit_angle_fraction Maximum ratio of angle or solid + * angle that is allowed for a corner element in the mesh. + * + * @author Luca Heltai, Martin Kronbichler, 2017 + */ + template + void + regularize_corner_cells(Triangulation &tria, + const double limit_angle_fraction=.75); + /*@}*/ /** * @name Finding cells and vertices of a triangulation diff --git a/source/grid/grid_tools.cc b/source/grid/grid_tools.cc index d4e54d2de6..b9616c22de 100644 --- a/source/grid/grid_tools.cc +++ b/source/grid/grid_tools.cc @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -4451,6 +4452,312 @@ next_cell: } } + + template + void regularize_corner_cells (Triangulation &tria, + const double limit_angle_fraction) + { + if (dim == 1) + return; // Nothing to do + + // Check that we don't have hanging nodes + AssertThrow(!tria.has_hanging_nodes(), ExcMessage("The input Triangulation cannot " + "have hanging nodes.")); + + + bool has_cells_with_more_than_dim_faces_on_boundary = true; + bool has_cells_with_dim_faces_on_boundary = false; + + unsigned int refinement_cycles = 0; + + while (has_cells_with_more_than_dim_faces_on_boundary) + { + has_cells_with_more_than_dim_faces_on_boundary = false; + + for (auto cell: tria.active_cell_iterators()) + { + unsigned int boundary_face_counter = 0; + for (unsigned int f=0; f::faces_per_cell; ++f) + if (cell->face(f)->at_boundary()) + boundary_face_counter++; + if (boundary_face_counter > dim) + { + has_cells_with_more_than_dim_faces_on_boundary = true; + break; + } + else if (boundary_face_counter == dim) + has_cells_with_dim_faces_on_boundary = true; + } + if (has_cells_with_more_than_dim_faces_on_boundary) + { + tria.refine_global(1); + refinement_cycles++; + } + } + + if (has_cells_with_dim_faces_on_boundary) + { + tria.refine_global(1); + refinement_cycles++; + } + else + { + while (refinement_cycles>0) + { + for (auto cell: tria.active_cell_iterators()) + cell->set_coarsen_flag(); + tria.execute_coarsening_and_refinement(); + refinement_cycles--; + } + return; + } + + std::vector cells_to_remove(tria.n_active_cells(), false); + std::vector > vertices = tria.get_vertices(); + + std::vector faces_to_remove(tria.n_raw_faces(),false); + + std::vector > cells_to_add; + SubCellData subcelldata_to_add; + + // Trick compiler for dimension independent things + const unsigned int + v0 = 0, v1 = 1, + v2 = (dim > 1 ? 2:0), v3 = (dim > 1 ? 3:0), + v4 = (dim > 2 ? 4:0), v5 = (dim > 2 ? 5:0), + v6 = (dim > 2 ? 6:0), v7 = (dim > 2 ? 7:0); + + for (auto cell : tria.active_cell_iterators()) + { + double angle_fraction = 0; + unsigned int vertex_at_corner = numbers::invalid_unsigned_int; + + if (dim == 2) + { + Tensor<1,spacedim> p0; + p0[spacedim > 1 ? 1 : 0] = 1; + Tensor<1,spacedim> p1; + p1[0] = 1; + + if (cell->face(v0)->at_boundary() && cell->face(v3)->at_boundary()) + { + p0 = cell->vertex(v0) - cell->vertex(v2); + p1 = cell->vertex(v3) - cell->vertex(v2); + vertex_at_corner = v2; + } + else if (cell->face(v3)->at_boundary() && cell->face(v1)->at_boundary()) + { + p0 = cell->vertex(v2) - cell->vertex(v3); + p1 = cell->vertex(v1) - cell->vertex(v3); + vertex_at_corner = v3; + } + else if (cell->face(1)->at_boundary() && cell->face(2)->at_boundary()) + { + p0 = cell->vertex(v0) - cell->vertex(v1); + p1 = cell->vertex(v3) - cell->vertex(v1); + vertex_at_corner = v1; + } + else if (cell->face(2)->at_boundary() && cell->face(0)->at_boundary()) + { + p0 = cell->vertex(v2) - cell->vertex(v0); + p1 = cell->vertex(v1) - cell->vertex(v0); + vertex_at_corner = v0; + } + p0 /= p0.norm(); + p1 /= p1.norm(); + angle_fraction = std::acos(p0*p1)/numbers::PI; + + } + else + { + Assert(false, ExcNotImplemented()); + } + + if (angle_fraction > limit_angle_fraction) + { + + auto flags_removal = [&](unsigned int f1, unsigned int f2, + unsigned int n1, unsigned int n2) -> void + { + cells_to_remove[cell->active_cell_index()] = true; + cells_to_remove[cell->neighbor(n1)->active_cell_index()] = true; + cells_to_remove[cell->neighbor(n2)->active_cell_index()] = true; + + faces_to_remove[cell->face(f1)->index()] = true; + faces_to_remove[cell->face(f2)->index()] = true; + + faces_to_remove[cell->neighbor(n1)->face(f1)->index()] = true; + faces_to_remove[cell->neighbor(n2)->face(f2)->index()] = true; + }; + + auto cell_creation = [&]( + const unsigned int vv0, + const unsigned int vv1, + const unsigned int f0, + const unsigned int f1, + + const unsigned int n0, + const unsigned int v0n0, + const unsigned int v1n0, + + const unsigned int n1, + const unsigned int v0n1, + const unsigned int v1n1) + { + CellData c1, c2; + CellData<1> l1, l2; + + c1.vertices[v0] = cell->vertex_index(vv0); + c1.vertices[v1] = cell->vertex_index(vv1); + c1.vertices[v2] = cell->neighbor(n0)->vertex_index(v0n0); + c1.vertices[v3] = cell->neighbor(n0)->vertex_index(v1n0); + + c1.manifold_id = cell->manifold_id(); + c1.material_id = cell->material_id(); + + c2.vertices[v0] = cell->vertex_index(vv0); + c2.vertices[v1] = cell->neighbor(n1)->vertex_index(v0n1); + c2.vertices[v2] = cell->vertex_index(vv1); + c2.vertices[v3] = cell->neighbor(n1)->vertex_index(v1n1); + + c2.manifold_id = cell->manifold_id(); + c2.material_id = cell->material_id(); + + l1.vertices[0] = cell->vertex_index(vv0); + l1.vertices[1] = cell->neighbor(n0)->vertex_index(v0n0); + + l1.boundary_id = cell->line(f0)->boundary_id(); + l1.manifold_id = cell->line(f0)->manifold_id(); + subcelldata_to_add.boundary_lines.push_back(l1); + + l2.vertices[0] = cell->vertex_index(vv0); + l2.vertices[1] = cell->neighbor(n1)->vertex_index(v0n1); + + l2.boundary_id = cell->line(f1)->boundary_id(); + l2.manifold_id = cell->line(f1)->manifold_id(); + subcelldata_to_add.boundary_lines.push_back(l2); + + cells_to_add.push_back(c1); + cells_to_add.push_back(c2); + }; + + if (dim == 2) + { + switch (vertex_at_corner) + { + case 0: + flags_removal(0,2,3,1); + cell_creation(0,3, 0,2, 3,2,3, 1,1,3); + break; + case 1: + flags_removal(1,2,3,0); + cell_creation(1,2, 2,1, 0,0,2, 3,3,2); + break; + case 2: + flags_removal(3,0,1,2); + cell_creation(2,1, 3,0, 1,3,1, 2,0,1); + break; + case 3: + flags_removal(3,1,0,2); + cell_creation(3,0, 1,3, 2,1,0, 0,2,0); + break; + } + } + else + { + Assert(false, ExcNotImplemented()); + } + } + } + + // if no cells need to be added, then no regularization is necessary. Restore things + // as they were before this function was called. + if (cells_to_add.size() == 0) + { + while (refinement_cycles>0) + { + for (auto cell: tria.active_cell_iterators()) + cell->set_coarsen_flag(); + tria.execute_coarsening_and_refinement(); + refinement_cycles--; + } + return; + } + + // add the cells that were not marked as skipped + for (auto cell : tria.active_cell_iterators()) + { + if (cells_to_remove[cell->active_cell_index()] == false) + { + CellData c; + for (unsigned int v=0; v::vertices_per_cell; ++v) + c.vertices[v] = cell->vertex_index(v); + c.manifold_id = cell->manifold_id(); + c.material_id = cell->material_id(); + cells_to_add.push_back(c); + } + } + + // Face counter for both dim == 2 and dim == 3 + typename Triangulation::active_face_iterator + face = tria.begin_active_face(), + endf = tria.end_face(); + for (; face != endf; ++face) + if ( (face->at_boundary() || face->manifold_id() != numbers::invalid_manifold_id) + && faces_to_remove[face->index()] == false) + { + for (unsigned int l=0; l::lines_per_face; ++l) + { + CellData<1> line; + if (dim == 2) + { + for (unsigned int v=0; v::vertices_per_cell; ++v) + line.vertices[v] = face->vertex_index(v); + line.boundary_id = face->boundary_id(); + line.manifold_id = face->manifold_id(); + } + else + { + for (unsigned int v=0; v::vertices_per_cell; ++v) + line.vertices[v] = face->line(l)->vertex_index(v); + line.boundary_id = face->line(l)->boundary_id(); + line.manifold_id = face->line(l)->manifold_id(); + } + subcelldata_to_add.boundary_lines.push_back(line); + } + if (dim == 3) + { + CellData<2> quad; + for (unsigned int v=0; v::vertices_per_cell; ++v) + quad.vertices[v] = face->vertex_index(v); + quad.boundary_id = face->boundary_id(); + quad.manifold_id = face->manifold_id(); + subcelldata_to_add.boundary_quads.push_back(quad); + } + } + GridTools::delete_unused_vertices(vertices, cells_to_add, subcelldata_to_add); + GridReordering::reorder_cells(cells_to_add, true); + + // Save manifolds + auto manifold_ids = tria.get_manifold_ids(); + std::map*> manifolds; + // Set manifolds in new Triangulation + for (auto manifold_id: manifold_ids) + if (manifold_id != numbers::invalid_manifold_id) + manifolds[manifold_id] = &tria.get_manifold(manifold_id); + + tria.clear(); + + tria.create_triangulation(vertices, cells_to_add, subcelldata_to_add); + + // Restore manifolds + for (auto manifold_id: manifold_ids) + if (manifold_id != numbers::invalid_manifold_id) + tria.set_manifold(manifold_id, *manifolds[manifold_id]); + } + + + } /* namespace GridTools */ diff --git a/source/grid/grid_tools.inst.in b/source/grid/grid_tools.inst.in index 1b593ec313..f148328ef1 100644 --- a/source/grid/grid_tools.inst.in +++ b/source/grid/grid_tools.inst.in @@ -411,6 +411,9 @@ for (deal_II_dimension : DIMENSIONS ; deal_II_space_dimension : SPACE_DIMENSIONS template void copy_material_to_manifold_id (Triangulation &, const bool); + template + void regularize_corner_cells + (Triangulation &, double); \} #endif } diff --git a/tests/grid/grid_tools_regularize_01.cc b/tests/grid/grid_tools_regularize_01.cc new file mode 100644 index 0000000000..743077afad --- /dev/null +++ b/tests/grid/grid_tools_regularize_01.cc @@ -0,0 +1,50 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2001 - 2015 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + +// GridTools::regularize_corner_cells + +#include "../tests.h" +#include +#include +#include +#include + +template +void test () +{ + const SphericalManifold m0; + Triangulation tria; + GridGenerator::hyper_cube(tria,-1,1); + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold(0, m0); + + GridTools::regularize_corner_cells (tria); + + GridOut grid_out; + grid_out.write_msh (tria, deallog.get_file_stream()); +} + + + +int main () +{ + initlog(); + + test<2> (); + + return 0; +} + diff --git a/tests/grid/grid_tools_regularize_01.output b/tests/grid/grid_tools_regularize_01.output new file mode 100644 index 0000000000..214914d755 --- /dev/null +++ b/tests/grid/grid_tools_regularize_01.output @@ -0,0 +1,35 @@ +$NOD +17 +1 -1.00000 -1.00000 0 +2 1.00000 -1.00000 0 +3 -1.00000 1.00000 0 +4 1.00000 1.00000 0 +5 0.00000 -1.41421 0 +6 -1.41421 0.00000 0 +7 1.41421 0.00000 0 +8 0.00000 1.41421 0 +9 0.00000 0.00000 0 +10 0.00000 -0.707107 0 +11 0.00000 0.707107 0 +12 -0.707107 0.00000 0 +13 0.707107 0.00000 0 +14 -0.621135 -0.621135 0 +15 0.621135 -0.621135 0 +16 -0.621135 0.621135 0 +17 0.621135 0.621135 0 +$ENDNOD +$ELM +12 +1 3 0 0 4 12 6 1 14 +2 3 0 0 4 10 14 1 5 +3 3 0 0 4 10 5 2 15 +4 3 0 0 4 13 15 2 7 +5 3 0 0 4 11 8 3 16 +6 3 0 0 4 12 16 3 6 +7 3 0 0 4 13 7 4 17 +8 3 0 0 4 11 17 4 8 +9 3 0 0 4 9 12 14 10 +10 3 0 0 4 9 10 15 13 +11 3 0 0 4 9 11 16 12 +12 3 0 0 4 9 13 17 11 +$ENDELM diff --git a/tests/grid/grid_tools_regularize_02.cc b/tests/grid/grid_tools_regularize_02.cc new file mode 100644 index 0000000000..03981670f4 --- /dev/null +++ b/tests/grid/grid_tools_regularize_02.cc @@ -0,0 +1,55 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2001 - 2015 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + +// GridTools::regularize_corner_cells on more complicated mesh + +#include "../tests.h" +#include +#include +#include +#include + +int main() +{ + initlog(); + + Point<2> p0(0,0), p1(4,1); + Point<2> c0(.1, .5), c1(3.9,.5); + + SphericalManifold<2> m0(c0); + SphericalManifold<2> m1(c1); + + Triangulation<2> tria; + std::vector subdivisions(2); + subdivisions[0] = 4; + subdivisions[1] = 1; + GridGenerator::subdivided_hyper_rectangle(tria,subdivisions, p0,p1,true); + + GridTools::copy_boundary_to_manifold_id(tria); + + tria.set_manifold(0, m0); + tria.set_manifold(1, m1); + + GridTools::regularize_corner_cells (tria); + tria.refine_global(1); + + GridOut grid_out; + grid_out.write_msh (tria, deallog.get_file_stream()); + + return 0; +} + + diff --git a/tests/grid/grid_tools_regularize_02.output b/tests/grid/grid_tools_regularize_02.output new file mode 100644 index 0000000000..5d2bb06537 --- /dev/null +++ b/tests/grid/grid_tools_regularize_02.output @@ -0,0 +1,520 @@ + +$NOD +273 +1 0.00000 0.00000 0 +2 1.00000 0.00000 0 +3 2.00000 0.00000 0 +4 3.00000 0.00000 0 +5 4.00000 0.00000 0 +6 0.00000 1.00000 0 +7 1.00000 1.00000 0 +8 2.00000 1.00000 0 +9 3.00000 1.00000 0 +10 4.00000 1.00000 0 +11 0.500000 0.00000 0 +12 -0.409902 0.500000 0 +13 1.50000 0.00000 0 +14 1.00000 0.500000 0 +15 2.50000 0.00000 0 +16 2.00000 0.500000 0 +17 3.50000 0.00000 0 +18 3.00000 0.500000 0 +19 4.40990 0.500000 0 +20 0.500000 1.00000 0 +21 1.50000 1.00000 0 +22 2.50000 1.00000 0 +23 3.50000 1.00000 0 +24 0.448762 0.500000 0 +25 1.50000 0.500000 0 +26 2.50000 0.500000 0 +27 3.55124 0.500000 0 +28 0.750000 0.00000 0 +29 1.25000 0.00000 0 +30 1.75000 0.00000 0 +31 1.00000 0.250000 0 +32 1.00000 0.750000 0 +33 2.25000 0.00000 0 +34 2.75000 0.00000 0 +35 2.00000 0.250000 0 +36 2.00000 0.750000 0 +37 3.25000 0.00000 0 +38 3.00000 0.250000 0 +39 3.00000 0.750000 0 +40 0.750000 1.00000 0 +41 1.25000 1.00000 0 +42 1.75000 1.00000 0 +43 2.25000 1.00000 0 +44 2.75000 1.00000 0 +45 3.25000 1.00000 0 +46 0.474381 0.250000 0 +47 0.474381 0.750000 0 +48 0.0194302 0.500000 0 +49 0.724381 0.500000 0 +50 1.50000 0.250000 0 +51 1.50000 0.750000 0 +52 1.25000 0.500000 0 +53 1.75000 0.500000 0 +54 2.50000 0.250000 0 +55 2.50000 0.750000 0 +56 2.25000 0.500000 0 +57 2.75000 0.500000 0 +58 3.52562 0.250000 0 +59 3.52562 0.750000 0 +60 3.27562 0.500000 0 +61 3.98057 0.500000 0 +62 0.123543 0.240841 0 +63 0.737191 0.250000 0 +64 0.123543 0.759159 0 +65 0.737191 0.750000 0 +66 1.25000 0.250000 0 +67 1.75000 0.250000 0 +68 1.25000 0.750000 0 +69 1.75000 0.750000 0 +70 2.25000 0.250000 0 +71 2.75000 0.250000 0 +72 2.25000 0.750000 0 +73 2.75000 0.750000 0 +74 3.26281 0.250000 0 +75 3.87646 0.240841 0 +76 3.26281 0.750000 0 +77 3.87646 0.759159 0 +78 0.875000 0.00000 0 +79 1.87500 0.00000 0 +80 2.87500 0.00000 0 +81 0.875000 1.00000 0 +82 1.87500 1.00000 0 +83 2.87500 1.00000 0 +84 0.250000 0.00000 0 +85 -0.294329 0.176728 0 +86 -0.294329 0.823272 0 +87 1.37500 0.00000 0 +88 1.00000 0.375000 0 +89 1.00000 0.625000 0 +90 0.862191 0.500000 0 +91 2.37500 0.00000 0 +92 2.00000 0.375000 0 +93 2.00000 0.625000 0 +94 1.87500 0.500000 0 +95 3.75000 0.00000 0 +96 3.37500 0.00000 0 +97 3.00000 0.375000 0 +98 3.00000 0.625000 0 +99 2.87500 0.500000 0 +100 4.29433 0.176728 0 +101 4.29433 0.823272 0 +102 0.250000 1.00000 0 +103 1.37500 1.00000 0 +104 2.37500 1.00000 0 +105 3.75000 1.00000 0 +106 3.37500 1.00000 0 +107 0.461572 0.375000 0 +108 0.461572 0.625000 0 +109 0.234096 0.500000 0 +110 1.50000 0.375000 0 +111 1.50000 0.625000 0 +112 1.37500 0.500000 0 +113 2.50000 0.375000 0 +114 2.50000 0.625000 0 +115 2.37500 0.500000 0 +116 3.53843 0.375000 0 +117 3.53843 0.625000 0 +118 3.41343 0.500000 0 +119 3.76590 0.500000 0 +120 0.625000 0.00000 0 +121 1.12500 0.00000 0 +122 1.62500 0.00000 0 +123 1.00000 0.125000 0 +124 0.868595 0.250000 0 +125 1.00000 0.875000 0 +126 0.868595 0.750000 0 +127 2.12500 0.00000 0 +128 2.62500 0.00000 0 +129 2.00000 0.125000 0 +130 1.87500 0.250000 0 +131 2.00000 0.875000 0 +132 1.87500 0.750000 0 +133 3.12500 0.00000 0 +134 3.00000 0.125000 0 +135 2.87500 0.250000 0 +136 3.00000 0.875000 0 +137 2.87500 0.750000 0 +138 0.625000 1.00000 0 +139 1.12500 1.00000 0 +140 1.62500 1.00000 0 +141 2.12500 1.00000 0 +142 2.62500 1.00000 0 +143 3.12500 1.00000 0 +144 0.487191 0.125000 0 +145 0.298962 0.245420 0 +146 0.487191 0.875000 0 +147 0.298962 0.754580 0 +148 -0.195236 0.500000 0 +149 0.0714865 0.370420 0 +150 0.0714865 0.629580 0 +151 0.586572 0.500000 0 +152 0.730786 0.375000 0 +153 0.730786 0.625000 0 +154 1.50000 0.125000 0 +155 1.37500 0.250000 0 +156 1.50000 0.875000 0 +157 1.37500 0.750000 0 +158 1.12500 0.500000 0 +159 1.25000 0.375000 0 +160 1.25000 0.625000 0 +161 1.62500 0.500000 0 +162 1.75000 0.375000 0 +163 1.75000 0.625000 0 +164 2.50000 0.125000 0 +165 2.37500 0.250000 0 +166 2.50000 0.875000 0 +167 2.37500 0.750000 0 +168 2.12500 0.500000 0 +169 2.25000 0.375000 0 +170 2.25000 0.625000 0 +171 2.62500 0.500000 0 +172 2.75000 0.375000 0 +173 2.75000 0.625000 0 +174 3.51281 0.125000 0 +175 3.39421 0.250000 0 +176 3.70104 0.245420 0 +177 3.51281 0.875000 0 +178 3.39421 0.750000 0 +179 3.70104 0.754580 0 +180 3.13781 0.500000 0 +181 3.26921 0.375000 0 +182 3.26921 0.625000 0 +183 4.19524 0.500000 0 +184 3.92851 0.370420 0 +185 3.92851 0.629580 0 +186 0.0617714 0.120420 0 +187 0.743595 0.125000 0 +188 0.605786 0.250000 0 +189 0.0617714 0.879580 0 +190 0.743595 0.875000 0 +191 0.605786 0.750000 0 +192 1.25000 0.125000 0 +193 1.12500 0.250000 0 +194 1.75000 0.125000 0 +195 1.62500 0.250000 0 +196 1.12500 0.750000 0 +197 1.25000 0.875000 0 +198 1.75000 0.875000 0 +199 1.62500 0.750000 0 +200 2.25000 0.125000 0 +201 2.12500 0.250000 0 +202 2.75000 0.125000 0 +203 2.62500 0.250000 0 +204 2.12500 0.750000 0 +205 2.25000 0.875000 0 +206 2.75000 0.875000 0 +207 2.62500 0.750000 0 +208 3.25640 0.125000 0 +209 3.13140 0.250000 0 +210 3.93823 0.120420 0 +211 3.13140 0.750000 0 +212 3.25640 0.875000 0 +213 3.93823 0.879580 0 +214 -0.111421 0.273574 0 +215 0.274481 0.122710 0 +216 0.274481 0.877290 0 +217 -0.111421 0.726426 0 +218 3.72552 0.122710 0 +219 4.11142 0.273574 0 +220 4.11142 0.726426 0 +221 3.72552 0.877290 0 +222 0.266529 0.372710 0 +223 0.615393 0.125000 0 +224 0.871798 0.125000 0 +225 0.596179 0.375000 0 +226 0.865393 0.375000 0 +227 0.266529 0.627290 0 +228 0.596179 0.625000 0 +229 0.865393 0.625000 0 +230 0.615393 0.875000 0 +231 0.871798 0.875000 0 +232 1.12500 0.125000 0 +233 1.37500 0.125000 0 +234 1.12500 0.375000 0 +235 1.37500 0.375000 0 +236 1.62500 0.125000 0 +237 1.87500 0.125000 0 +238 1.62500 0.375000 0 +239 1.87500 0.375000 0 +240 1.12500 0.625000 0 +241 1.37500 0.625000 0 +242 1.12500 0.875000 0 +243 1.37500 0.875000 0 +244 1.62500 0.625000 0 +245 1.87500 0.625000 0 +246 1.62500 0.875000 0 +247 1.87500 0.875000 0 +248 2.12500 0.125000 0 +249 2.37500 0.125000 0 +250 2.12500 0.375000 0 +251 2.37500 0.375000 0 +252 2.62500 0.125000 0 +253 2.87500 0.125000 0 +254 2.62500 0.375000 0 +255 2.87500 0.375000 0 +256 2.12500 0.625000 0 +257 2.37500 0.625000 0 +258 2.12500 0.875000 0 +259 2.37500 0.875000 0 +260 2.62500 0.625000 0 +261 2.87500 0.625000 0 +262 2.62500 0.875000 0 +263 2.87500 0.875000 0 +264 3.12820 0.125000 0 +265 3.38461 0.125000 0 +266 3.13461 0.375000 0 +267 3.40382 0.375000 0 +268 3.73347 0.372710 0 +269 3.13461 0.625000 0 +270 3.40382 0.625000 0 +271 3.12820 0.875000 0 +272 3.38461 0.875000 0 +273 3.73347 0.627290 0 +$ENDNOD +$ELM +240 +1 3 3 0 4 48 148 214 149 +2 3 3 0 4 148 12 85 214 +3 3 3 0 4 149 214 186 62 +4 3 3 0 4 214 85 1 186 +5 3 3 0 4 46 145 215 144 +6 3 3 0 4 145 62 186 215 +7 3 3 0 4 144 215 84 11 +8 3 3 0 4 215 186 1 84 +9 3 3 0 4 47 146 216 147 +10 3 3 0 4 146 20 102 216 +11 3 3 0 4 147 216 189 64 +12 3 3 0 4 216 102 6 189 +13 3 3 0 4 48 150 217 148 +14 3 3 0 4 150 64 189 217 +15 3 3 0 4 148 217 86 12 +16 3 3 0 4 217 189 6 86 +17 3 3 0 4 58 174 218 176 +18 3 3 0 4 174 17 95 218 +19 3 3 0 4 176 218 210 75 +20 3 3 0 4 218 95 5 210 +21 3 3 0 4 61 184 219 183 +22 3 3 0 4 184 75 210 219 +23 3 3 0 4 183 219 100 19 +24 3 3 0 4 219 210 5 100 +25 3 3 0 4 61 183 220 185 +26 3 3 0 4 183 19 101 220 +27 3 3 0 4 185 220 213 77 +28 3 3 0 4 220 101 10 213 +29 3 3 0 4 59 179 221 177 +30 3 3 0 4 179 77 213 221 +31 3 3 0 4 177 221 105 23 +32 3 3 0 4 221 213 10 105 +33 3 3 0 4 24 109 222 107 +34 3 3 0 4 109 48 149 222 +35 3 3 0 4 107 222 145 46 +36 3 3 0 4 222 149 62 145 +37 3 3 0 4 63 188 223 187 +38 3 3 0 4 188 46 144 223 +39 3 3 0 4 187 223 120 28 +40 3 3 0 4 223 144 11 120 +41 3 3 0 4 31 124 224 123 +42 3 3 0 4 124 63 187 224 +43 3 3 0 4 123 224 78 2 +44 3 3 0 4 224 187 28 78 +45 3 3 0 4 49 151 225 152 +46 3 3 0 4 151 24 107 225 +47 3 3 0 4 152 225 188 63 +48 3 3 0 4 225 107 46 188 +49 3 3 0 4 14 90 226 88 +50 3 3 0 4 90 49 152 226 +51 3 3 0 4 88 226 124 31 +52 3 3 0 4 226 152 63 124 +53 3 3 0 4 24 108 227 109 +54 3 3 0 4 108 47 147 227 +55 3 3 0 4 109 227 150 48 +56 3 3 0 4 227 147 64 150 +57 3 3 0 4 49 153 228 151 +58 3 3 0 4 153 65 191 228 +59 3 3 0 4 151 228 108 24 +60 3 3 0 4 228 191 47 108 +61 3 3 0 4 14 89 229 90 +62 3 3 0 4 89 32 126 229 +63 3 3 0 4 90 229 153 49 +64 3 3 0 4 229 126 65 153 +65 3 3 0 4 65 190 230 191 +66 3 3 0 4 190 40 138 230 +67 3 3 0 4 191 230 146 47 +68 3 3 0 4 230 138 20 146 +69 3 3 0 4 32 125 231 126 +70 3 3 0 4 125 7 81 231 +71 3 3 0 4 126 231 190 65 +72 3 3 0 4 231 81 40 190 +73 3 3 0 4 66 193 232 192 +74 3 3 0 4 193 31 123 232 +75 3 3 0 4 192 232 121 29 +76 3 3 0 4 232 123 2 121 +77 3 3 0 4 50 155 233 154 +78 3 3 0 4 155 66 192 233 +79 3 3 0 4 154 233 87 13 +80 3 3 0 4 233 192 29 87 +81 3 3 0 4 52 158 234 159 +82 3 3 0 4 158 14 88 234 +83 3 3 0 4 159 234 193 66 +84 3 3 0 4 234 88 31 193 +85 3 3 0 4 25 112 235 110 +86 3 3 0 4 112 52 159 235 +87 3 3 0 4 110 235 155 50 +88 3 3 0 4 235 159 66 155 +89 3 3 0 4 67 195 236 194 +90 3 3 0 4 195 50 154 236 +91 3 3 0 4 194 236 122 30 +92 3 3 0 4 236 154 13 122 +93 3 3 0 4 35 130 237 129 +94 3 3 0 4 130 67 194 237 +95 3 3 0 4 129 237 79 3 +96 3 3 0 4 237 194 30 79 +97 3 3 0 4 53 161 238 162 +98 3 3 0 4 161 25 110 238 +99 3 3 0 4 162 238 195 67 +100 3 3 0 4 238 110 50 195 +101 3 3 0 4 16 94 239 92 +102 3 3 0 4 94 53 162 239 +103 3 3 0 4 92 239 130 35 +104 3 3 0 4 239 162 67 130 +105 3 3 0 4 52 160 240 158 +106 3 3 0 4 160 68 196 240 +107 3 3 0 4 158 240 89 14 +108 3 3 0 4 240 196 32 89 +109 3 3 0 4 25 111 241 112 +110 3 3 0 4 111 51 157 241 +111 3 3 0 4 112 241 160 52 +112 3 3 0 4 241 157 68 160 +113 3 3 0 4 68 197 242 196 +114 3 3 0 4 197 41 139 242 +115 3 3 0 4 196 242 125 32 +116 3 3 0 4 242 139 7 125 +117 3 3 0 4 51 156 243 157 +118 3 3 0 4 156 21 103 243 +119 3 3 0 4 157 243 197 68 +120 3 3 0 4 243 103 41 197 +121 3 3 0 4 53 163 244 161 +122 3 3 0 4 163 69 199 244 +123 3 3 0 4 161 244 111 25 +124 3 3 0 4 244 199 51 111 +125 3 3 0 4 16 93 245 94 +126 3 3 0 4 93 36 132 245 +127 3 3 0 4 94 245 163 53 +128 3 3 0 4 245 132 69 163 +129 3 3 0 4 69 198 246 199 +130 3 3 0 4 198 42 140 246 +131 3 3 0 4 199 246 156 51 +132 3 3 0 4 246 140 21 156 +133 3 3 0 4 36 131 247 132 +134 3 3 0 4 131 8 82 247 +135 3 3 0 4 132 247 198 69 +136 3 3 0 4 247 82 42 198 +137 3 3 0 4 70 201 248 200 +138 3 3 0 4 201 35 129 248 +139 3 3 0 4 200 248 127 33 +140 3 3 0 4 248 129 3 127 +141 3 3 0 4 54 165 249 164 +142 3 3 0 4 165 70 200 249 +143 3 3 0 4 164 249 91 15 +144 3 3 0 4 249 200 33 91 +145 3 3 0 4 56 168 250 169 +146 3 3 0 4 168 16 92 250 +147 3 3 0 4 169 250 201 70 +148 3 3 0 4 250 92 35 201 +149 3 3 0 4 26 115 251 113 +150 3 3 0 4 115 56 169 251 +151 3 3 0 4 113 251 165 54 +152 3 3 0 4 251 169 70 165 +153 3 3 0 4 71 203 252 202 +154 3 3 0 4 203 54 164 252 +155 3 3 0 4 202 252 128 34 +156 3 3 0 4 252 164 15 128 +157 3 3 0 4 38 135 253 134 +158 3 3 0 4 135 71 202 253 +159 3 3 0 4 134 253 80 4 +160 3 3 0 4 253 202 34 80 +161 3 3 0 4 57 171 254 172 +162 3 3 0 4 171 26 113 254 +163 3 3 0 4 172 254 203 71 +164 3 3 0 4 254 113 54 203 +165 3 3 0 4 18 99 255 97 +166 3 3 0 4 99 57 172 255 +167 3 3 0 4 97 255 135 38 +168 3 3 0 4 255 172 71 135 +169 3 3 0 4 56 170 256 168 +170 3 3 0 4 170 72 204 256 +171 3 3 0 4 168 256 93 16 +172 3 3 0 4 256 204 36 93 +173 3 3 0 4 26 114 257 115 +174 3 3 0 4 114 55 167 257 +175 3 3 0 4 115 257 170 56 +176 3 3 0 4 257 167 72 170 +177 3 3 0 4 72 205 258 204 +178 3 3 0 4 205 43 141 258 +179 3 3 0 4 204 258 131 36 +180 3 3 0 4 258 141 8 131 +181 3 3 0 4 55 166 259 167 +182 3 3 0 4 166 22 104 259 +183 3 3 0 4 167 259 205 72 +184 3 3 0 4 259 104 43 205 +185 3 3 0 4 57 173 260 171 +186 3 3 0 4 173 73 207 260 +187 3 3 0 4 171 260 114 26 +188 3 3 0 4 260 207 55 114 +189 3 3 0 4 18 98 261 99 +190 3 3 0 4 98 39 137 261 +191 3 3 0 4 99 261 173 57 +192 3 3 0 4 261 137 73 173 +193 3 3 0 4 73 206 262 207 +194 3 3 0 4 206 44 142 262 +195 3 3 0 4 207 262 166 55 +196 3 3 0 4 262 142 22 166 +197 3 3 0 4 39 136 263 137 +198 3 3 0 4 136 9 83 263 +199 3 3 0 4 137 263 206 73 +200 3 3 0 4 263 83 44 206 +201 3 3 0 4 74 209 264 208 +202 3 3 0 4 209 38 134 264 +203 3 3 0 4 208 264 133 37 +204 3 3 0 4 264 134 4 133 +205 3 3 0 4 58 175 265 174 +206 3 3 0 4 175 74 208 265 +207 3 3 0 4 174 265 96 17 +208 3 3 0 4 265 208 37 96 +209 3 3 0 4 60 180 266 181 +210 3 3 0 4 180 18 97 266 +211 3 3 0 4 181 266 209 74 +212 3 3 0 4 266 97 38 209 +213 3 3 0 4 27 118 267 116 +214 3 3 0 4 118 60 181 267 +215 3 3 0 4 116 267 175 58 +216 3 3 0 4 267 181 74 175 +217 3 3 0 4 27 116 268 119 +218 3 3 0 4 116 58 176 268 +219 3 3 0 4 119 268 184 61 +220 3 3 0 4 268 176 75 184 +221 3 3 0 4 60 182 269 180 +222 3 3 0 4 182 76 211 269 +223 3 3 0 4 180 269 98 18 +224 3 3 0 4 269 211 39 98 +225 3 3 0 4 27 117 270 118 +226 3 3 0 4 117 59 178 270 +227 3 3 0 4 118 270 182 60 +228 3 3 0 4 270 178 76 182 +229 3 3 0 4 76 212 271 211 +230 3 3 0 4 212 45 143 271 +231 3 3 0 4 211 271 136 39 +232 3 3 0 4 271 143 9 136 +233 3 3 0 4 59 177 272 178 +234 3 3 0 4 177 23 106 272 +235 3 3 0 4 178 272 212 76 +236 3 3 0 4 272 106 45 212 +237 3 3 0 4 27 119 273 117 +238 3 3 0 4 119 61 185 273 +239 3 3 0 4 117 273 179 59 +240 3 3 0 4 273 185 77 179 +$ENDELM -- 2.39.5