From: Stefano Dominici Date: Wed, 14 Nov 2018 08:10:20 +0000 (+0100) Subject: Added EllipticalManifold to manifold_lib and tests X-Git-Tag: v9.1.0-rc1~498^2~2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9270a762cefae2bd639671a99653e36115f862f1;p=dealii.git Added EllipticalManifold to manifold_lib and tests A new type of manifold was added to the manifold library. An EllipticalManifold object, valid for . Two unit tests were added: elliptical_manifold_01.cc and elliptical_manifold_02.cc. Improved documentation and fixed minor bugs. The pull_back() function has documented code in its body. Moreover, the content of the function was modified to improve clarity and fix minor bugs. Improved documentation and restructured test 01 Test in elliptical_manifold_01.cc generates an hyper_shell triangulation that is included in the class documentation in .png format. Adjusted style and improved comments in tests Used explicit template instantiation in manifold_lib.cc for pull_back() and push_forward() functions. Removed string constructors from class constructor Added comment to get_periodicity() function. --- diff --git a/doc/doxygen/images/elliptical_hyper_shell.png b/doc/doxygen/images/elliptical_hyper_shell.png new file mode 100644 index 0000000000..c4e70c6278 Binary files /dev/null and b/doc/doxygen/images/elliptical_hyper_shell.png differ diff --git a/include/deal.II/grid/manifold_lib.h b/include/deal.II/grid/manifold_lib.h index f6da483202..4449d25445 100644 --- a/include/deal.II/grid/manifold_lib.h +++ b/include/deal.II/grid/manifold_lib.h @@ -461,6 +461,83 @@ private: double tolerance; }; +/** + * Elliptical manifold description derived from ChartManifold. + * More informations on the elliptical coordinate system can be found + * at Wikipedia + * . + * + * The constructor of this class will throw an exception if both dim and + * spacedim are different from two. + * + * This manifold can be used to produce hyper_shells with elliptical curvature. + * As an example, the test elliptical_manifold_01 produces the following + * triangulation: + * @image html elliptical_hyper_shell.png + * + * @ingroup manifold + * + * @author Stefano Dominici, 2018 + */ +template +class EllipticalManifold : public ChartManifold +{ +public: + /** + * Constructor that takes the center of the manifold system, the direction of + * the major axis, and the eccentricity parameter. + * The default major axis is the x-axis. The manifold is rotated in + * order to align the major axis to the direction specified in input. + * @param center Center of the manifold. + * @param major_axis_direction Direction of the major axis of the + * manifold. + * @param c_parameter Parameter controlling the eccentricity of the + * manifold. + * + */ + EllipticalManifold(const Point & center, + const Tensor<1, spacedim> &major_axis_direction, + const double c_parameter); + virtual ~EllipticalManifold() = default; + + virtual std::unique_ptr> + clone() const override; + + virtual Point + pull_back(const Point &space_point) const override; + + virtual Point + push_forward(const Point &chart_point) const override; + + virtual DerivativeForm<1, spacedim, spacedim> + push_forward_gradient(const Point &chart_point) const override; + + +protected: + /** + * The direction vector of the major axis. + */ + Tensor<1, spacedim> direction; + /** + * The center of the manifold. + */ + const Point center; + /** + * The parameter controlling the eccentricity of the manifold. + */ + const double c_parameter; + +private: + /** + * Return the periodicity of the coordinate variables of the manifold. + * + * For $dim=2$ and $spacedim=2$, first coordinate is non-periodic, while + * second coordinate has a periodicity of $2\pi$. + */ + static Tensor<1, spacedim> + get_periodicity(); +}; /** diff --git a/source/grid/manifold_lib.cc b/source/grid/manifold_lib.cc index ba979e9c3f..957503a218 100644 --- a/source/grid/manifold_lib.cc +++ b/source/grid/manifold_lib.cc @@ -1148,6 +1148,153 @@ CylindricalManifold::push_forward_gradient( } +// ============================================================ +// EllipticalManifold +// ============================================================ +template +EllipticalManifold::EllipticalManifold( + const Point & center, + const Tensor<1, spacedim> &major_axis_direction, + const double c_parameter) + : ChartManifold( + EllipticalManifold::get_periodicity()) + , direction(major_axis_direction) + , center(center) + , c_parameter(c_parameter) +{ + // throws an exception if dim!=2 || spacedim!=2. + Assert(dim == 2 && spacedim == 2, ExcNotImplemented()); + Assert(this->c_parameter > 0.0, + ExcMessage( + "Invalid ellipsis parameter 'c': It must satisfy c > 0.0.")); + const double direction_norm = direction.norm(); + Assert(direction_norm != 0.0, + ExcMessage( + "Invalid major axis direction vector: Null vector not allowed.")); + direction /= direction_norm; +} + +template +std::unique_ptr> +EllipticalManifold::clone() const +{ + return std::make_unique>(center, + direction, + c_parameter); +} + +template +Tensor<1, spacedim> +EllipticalManifold::get_periodicity() +{ + Tensor<1, spacedim> periodicity; + // The second elliptical coordinate is periodic, while the first is not. + // Enforce periodicity on last variable. + periodicity[spacedim - 1] = 2.0 * numbers::PI; + return periodicity; +} + +template +Point +EllipticalManifold::push_forward(const Point &) const +{ + Assert(false, ExcNotImplemented()); + return Point(); +} +template <> +Point<2> +EllipticalManifold<2, 2>::push_forward(const Point<2> &chart_point) const +{ + const double ch = std::cosh(chart_point[0]); + const double sh = std::sinh(chart_point[0]); + const double cs = std::cos(chart_point[1]); + const double sn = std::sin(chart_point[1]); + // Coordinates in the reference frame (i.e. major axis direction is + // x-axis) + const double x = c_parameter * ch * cs; + const double y = c_parameter * sh * sn; + // Rotate them according to the major axis direction + const Point<2> p(direction[0] * x - direction[1] * y, + direction[1] * x + direction[0] * y); + return p + center; +} +template +Point +EllipticalManifold::pull_back(const Point &) const +{ + Assert(false, ExcNotImplemented()); + return Point(); +} +template <> +Point<2> +EllipticalManifold<2, 2>::pull_back(const Point<2> &space_point) const +{ + // Moving space_point in the reference coordinate system. + const double c2 = c_parameter * c_parameter; + const double x0 = space_point[0] - center[0]; + const double y0 = space_point[1] - center[1]; + const double x = direction[0] * x0 + direction[1] * y0; + const double y = -direction[1] * x0 + direction[0] * y0; + // From here we try to find solutions to equation + // x^2/(1-q)-y^2/q = c^2 for q, and q = -sinh^2(pt[0]), + // and to equation + // x^2/(1-p)-y^2/p = c^2 for p, and p = sin^2(pt[1]). + // Note that p and q are solutions to the same quadratic equation. + const double x2 = x * x; + const double y2 = y * y; + // + const double b = x2 + y2 - c2; + const double srdelta = std::sqrt(b * b + 4.0 * c2 * y2); + double p = (-b + srdelta) / (2.0 * c2); + // Since p=sin^2(pt[1]) is bounded in [0,1], + // guard against numerical overflows. + if (p < 0.0) + p = 0.0; + if (p > 1.0) + p = 1.0; + const double q = (-b - srdelta) / (2.0 * c2); + const bool x_pos = std::signbit(x) == 0; + const bool y_pos = std::signbit(y) == 0; + const double eta0 = std::asin(std::sqrt(p)); + // Given q = -sinh^2(pt[0]), + // pt[0] is calculated by straight inversion since q <= 0 for any + // pt[0]. + Point<2> pt(std::log(std::sqrt(-q) + std::sqrt(1.0 - q)), eta0); + // Unfolding pt[1] according to the quadrant. + if (x_pos && !y_pos) + pt[1] = 2.0 * numbers::PI - eta0; + else if (!x_pos && y_pos) + pt[1] = numbers::PI - eta0; + else if (!x_pos && !y_pos) + pt[1] = numbers::PI + eta0; + return pt; +} + +template +DerivativeForm<1, spacedim, spacedim> +EllipticalManifold::push_forward_gradient( + const Point &chart_point) const +{ + DerivativeForm<1, spacedim, spacedim> dX; + const double ch = std::cosh(chart_point[0]); + const double sh = std::sinh(chart_point[0]); + const double cs = std::cos(chart_point[1]); + const double sn = std::sin(chart_point[1]); + switch (spacedim) + { + case 2: + { + dX[0][0] = c_parameter * sh * cs; + dX[0][1] = -c_parameter * ch * sn; + dX[1][0] = c_parameter * ch * sn; + dX[1][1] = c_parameter * sh * cs; + } + break; + default: + Assert(false, ExcNotImplemented()); + } + return dX; +} // ============================================================ // FunctionManifold diff --git a/source/grid/manifold_lib.inst.in b/source/grid/manifold_lib.inst.in index 28d018188d..9a9650bbf8 100644 --- a/source/grid/manifold_lib.inst.in +++ b/source/grid/manifold_lib.inst.in @@ -23,6 +23,8 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS) deal_II_space_dimension>; template class CylindricalManifold; + template class EllipticalManifold; #endif #if deal_II_dimension == deal_II_space_dimension template class TorusManifold; diff --git a/tests/manifold/elliptical_manifold_01.cc b/tests/manifold/elliptical_manifold_01.cc new file mode 100644 index 0000000000..5e58bde5e6 --- /dev/null +++ b/tests/manifold/elliptical_manifold_01.cc @@ -0,0 +1,142 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2016 - 2018 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.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + + +// Generates a simple hyper_shell over an EllipticalManifold and +// test refinements. +// The triangulation produced in this test is part of the documentation +// of EllipticalManifold class as elliptical_hyper_shell.png. + +#include "../tests.h" + + +// all include files you need here +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + + +// Anonymous namespace collecting a set of functions that creates an elliptical +// hyper_shell made of 8 elements. +namespace +{ + Point<2> + chart_to_cartesian(const Point<2> &pt, const double ellPar) + { + Point<2> c; + const double ch = pt[0] / ellPar; + const double sh = std::sqrt(ch * ch - 1.0); + c[0] = ellPar * ch * std::cos(pt[1]); + c[1] = ellPar * sh * std::sin(pt[1]); + return c; + } + std::vector> + generate_shell_points(const Point<2> ¢er, + const double radius0, + const double radius1, + const double ellPar) + { + const std::array radii{{radius0, radius1}}; + const std::array angle{ + {0, numbers::PI_4, numbers::PI_2, 3.0 * numbers::PI_4, numbers::PI}}; + std::vector> points; + for (auto &i : radii) + { + for (auto &j : angle) + { + points.emplace_back(chart_to_cartesian(Point<2>(i, j), ellPar) + + center); + } + } + std::array dup{{1, 2, 3, 6, 7, 8}}; + for (int &i : dup) + { + Point<2> pt = points[i]; + pt[1] = -pt[1]; + points.emplace_back(pt); + } + return points; + } + void build_simple_hyper_shell(Triangulation<2, 2> &grid, + const Point<2> & center, + const double inner_radius, + const double outer_radius, + const double c_param) + { + unsigned int cell[][4] = {{5, 6, 0, 1}, + {6, 7, 1, 2}, + {8, 3, 7, 2}, + {9, 4, 8, 3}, + {5, 0, 13, 10}, + {13, 10, 14, 11}, + {15, 14, 12, 11}, + {9, 15, 4, 12}}; + std::vector> points = + generate_shell_points(center, inner_radius, outer_radius, c_param); + std::vector> cells(8, CellData<2>()); + for (int i = 0; i < 8; ++i) + for (int j = 0; j < 4; ++j) + cells[i].vertices[j] = cell[i][j]; + SubCellData scdata; + grid.create_triangulation(points, cells, scdata); + // assign manifold + Tensor<1, 2> axis; + axis[0] = 1.0; + axis[1] = 0.0; + grid.set_manifold(0, EllipticalManifold<2, 2>(center, axis, c_param)); + grid.set_all_manifold_ids(0); + } +} // namespace +// Helper function +// Generate a simple hyper_shell over an elliptical manifold centered at the +// origin. Major axis is the x-axis. +template +void +test(unsigned int ref = 1) +{ + // deallog << "Testing dim " << dim << ", spacedim " << spacedim << std::endl; + + Triangulation tria; + switch (dim) + { + case 2: + build_simple_hyper_shell(tria, Point(), 1.5, 1.8, 1.4); + break; + default: + AssertThrow(0, ExcNotImplemented()); + break; + } + + tria.refine_global(3); + + GridOut gridout; + gridout.write_msh(tria, deallog.get_file_stream()); +} + +int +main() +{ + initlog(); + test<2, 2>(); +} diff --git a/tests/manifold/elliptical_manifold_01.output b/tests/manifold/elliptical_manifold_01.output new file mode 100644 index 0000000000..d380473c18 --- /dev/null +++ b/tests/manifold/elliptical_manifold_01.output @@ -0,0 +1,1095 @@ + +$NOD +576 +1 1.50000 0.00000 0 +2 1.06066 0.380789 0 +3 9.18485e-17 0.538516 0 +4 -1.06066 0.380789 0 +5 -1.50000 6.59492e-17 0 +6 1.80000 0.00000 0 +7 1.27279 0.800000 0 +8 1.10218e-16 1.13137 0 +9 -1.27279 0.800000 0 +10 -1.80000 1.38553e-16 0 +11 1.06066 -0.380789 0 +12 9.18485e-17 -0.538516 0 +13 -1.06066 -0.380789 0 +14 1.27279 -0.800000 0 +15 1.10218e-16 -1.13137 0 +16 -1.27279 -0.800000 0 +17 1.38582 0.206081 0 +18 1.38582 -0.206081 0 +19 0.574025 0.497524 0 +20 -0.574025 0.497524 0 +21 -1.38582 0.206081 0 +22 -1.38582 -0.206081 0 +23 1.62315 0.00000 0 +24 1.66298 0.432957 0 +25 1.66298 -0.432957 0 +26 1.14774 0.580789 0 +27 0.688830 1.04525 0 +28 9.93896e-17 0.821359 0 +29 -1.14774 0.580789 0 +30 -0.688830 1.04525 0 +31 -1.62315 1.00587e-16 0 +32 -1.66298 0.432957 0 +33 -1.66298 -0.432957 0 +34 0.574025 -0.497524 0 +35 -0.574025 -0.497524 0 +36 1.14774 -0.580789 0 +37 0.688830 -1.04525 0 +38 -2.98169e-16 -0.821359 0 +39 -1.14774 -0.580789 0 +40 -0.688830 -1.04525 0 +41 1.49960 0.314321 0 +42 0.621154 0.758837 0 +43 -0.621154 0.758837 0 +44 -1.49960 0.314321 0 +45 1.49960 -0.314321 0 +46 0.621154 -0.758837 0 +47 -0.621154 -0.758837 0 +48 -1.49960 -0.314321 0 +49 1.47118 0.105059 0 +50 1.24720 0.299184 0 +51 1.47118 -0.105059 0 +52 1.24720 -0.299184 0 +53 0.833355 0.447760 0 +54 0.292635 0.528169 0 +55 -0.833355 0.447760 0 +56 -0.292635 0.528169 0 +57 -1.47118 0.105059 0 +58 -1.24720 0.299184 0 +59 -1.47118 -0.105059 0 +60 -1.24720 -0.299184 0 +61 1.70454 0.00000 0 +62 1.55516 0.00000 0 +63 1.76541 0.220720 0 +64 1.49665 0.628556 0 +65 1.76541 -0.220720 0 +66 1.49665 -0.628556 0 +67 1.20529 0.687557 0 +68 1.09966 0.478813 0 +69 1.00003 0.940700 0 +70 0.351163 1.10963 0 +71 1.04373e-16 0.972353 0 +72 9.52261e-17 0.677144 0 +73 -1.20529 0.687557 0 +74 -1.09966 0.478813 0 +75 -1.00003 0.940700 0 +76 -0.351163 1.10963 0 +77 -1.70454 1.19079e-16 0 +78 -1.55516 8.29262e-17 0 +79 -1.76541 0.220720 0 +80 -1.49665 0.628556 0 +81 -1.76541 -0.220720 0 +82 -1.49665 -0.628556 0 +83 0.833355 -0.447760 0 +84 0.292635 -0.528169 0 +85 -0.833355 -0.447760 0 +86 -0.292635 -0.528169 0 +87 1.20529 -0.687557 0 +88 1.09966 -0.478813 0 +89 1.00003 -0.940700 0 +90 0.351163 -1.10963 0 +91 -3.13120e-16 -0.972353 0 +92 -2.85678e-16 -0.677144 0 +93 -1.20529 -0.687557 0 +94 -1.09966 -0.478813 0 +95 -1.00003 -0.940700 0 +96 -0.351163 -1.10963 0 +97 1.57479 0.372103 0 +98 1.43678 0.259132 0 +99 1.59197 0.160239 0 +100 1.34960 0.456323 0 +101 0.652301 0.898337 0 +102 0.595134 0.625599 0 +103 0.901776 0.682935 0 +104 0.316662 0.805577 0 +105 -0.901776 0.682935 0 +106 -0.316662 0.805577 0 +107 -0.652301 0.898337 0 +108 -0.595134 0.625599 0 +109 -1.59197 0.160239 0 +110 -1.34960 0.456323 0 +111 -1.57479 0.372103 0 +112 -1.43678 0.259132 0 +113 1.59197 -0.160239 0 +114 1.34960 -0.456323 0 +115 1.57479 -0.372103 0 +116 1.43678 -0.259132 0 +117 0.901776 -0.682935 0 +118 0.316662 -0.805577 0 +119 0.652301 -0.898337 0 +120 0.595134 -0.625599 0 +121 -0.652301 -0.898337 0 +122 -0.595134 -0.625599 0 +123 -0.901776 -0.682935 0 +124 -0.316662 -0.805577 0 +125 -1.57479 -0.372103 0 +126 -1.43678 -0.259132 0 +127 -1.59197 -0.160239 0 +128 -1.34960 -0.456323 0 +129 1.67179 0.189697 0 +130 1.41728 0.540210 0 +131 1.52528 0.132104 0 +132 1.29307 0.376201 0 +133 0.946994 0.808482 0 +134 0.332540 0.953669 0 +135 0.864001 0.563024 0 +136 0.303397 0.664133 0 +137 -0.946994 0.808482 0 +138 -0.864001 0.563024 0 +139 -0.332540 0.953669 0 +140 -0.303397 0.664133 0 +141 -1.67179 0.189697 0 +142 -1.52528 0.132104 0 +143 -1.41728 0.540210 0 +144 -1.29307 0.376201 0 +145 1.67179 -0.189697 0 +146 1.52528 -0.132104 0 +147 1.41728 -0.540210 0 +148 1.29307 -0.376201 0 +149 0.946994 -0.808482 0 +150 0.864001 -0.563024 0 +151 0.332540 -0.953669 0 +152 0.303397 -0.664133 0 +153 -0.946994 -0.808482 0 +154 -0.332540 -0.953669 0 +155 -0.864001 -0.563024 0 +156 -0.303397 -0.664133 0 +157 -1.67179 -0.189697 0 +158 -1.41728 -0.540210 0 +159 -1.52528 -0.132104 0 +160 -1.29307 -0.376201 0 +161 1.49278 0.0527838 0 +162 1.43541 0.156323 0 +163 1.32288 0.253855 0 +164 1.15952 0.341631 0 +165 1.49278 -0.0527838 0 +166 1.43541 -0.156323 0 +167 1.32288 -0.253855 0 +168 1.15952 -0.341631 0 +169 0.951590 0.416279 0 +170 0.707095 0.474929 0 +171 0.435427 0.515328 0 +172 0.147026 0.535923 0 +173 -0.951590 0.416279 0 +174 -0.707095 0.474929 0 +175 -0.435427 0.515328 0 +176 -0.147026 0.535923 0 +177 -1.49278 0.0527838 0 +178 -1.43541 0.156323 0 +179 -1.32288 0.253855 0 +180 -1.15952 0.341631 0 +181 -1.49278 -0.0527838 0 +182 -1.43541 -0.156323 0 +183 -1.32288 -0.253855 0 +184 -1.15952 -0.341631 0 +185 1.75047 0.00000 0 +186 1.66214 0.00000 0 +187 1.58752 0.00000 0 +188 1.52601 0.00000 0 +189 1.79133 0.110894 0 +190 1.72249 0.328420 0 +191 1.58746 0.533325 0 +192 1.39142 0.717734 0 +193 1.79133 -0.110894 0 +194 1.72249 -0.328420 0 +195 1.58746 -0.533325 0 +196 1.39142 -0.717734 0 +197 1.23777 0.743013 0 +198 1.17531 0.633520 0 +199 1.12255 0.529255 0 +200 1.07905 0.429358 0 +201 1.14191 0.874561 0 +202 0.848514 0.997780 0 +203 0.522512 1.08265 0 +204 0.176431 1.12592 0 +205 1.30420e-08 1.05078 0 +206 1.23839e-08 0.895932 0 +207 9.72076e-17 0.748480 0 +208 9.34410e-17 0.607204 0 +209 -1.23777 0.743013 0 +210 -1.17531 0.633520 0 +211 -1.12255 0.529255 0 +212 -1.07905 0.429358 0 +213 -1.14191 0.874561 0 +214 -0.848514 0.997780 0 +215 -0.522512 1.08265 0 +216 -0.176431 1.12592 0 +217 -1.75047 1.28683e-16 0 +218 -1.66214 1.09720e-16 0 +219 -1.58752 9.16623e-17 0 +220 -1.52601 7.43611e-17 0 +221 -1.79133 0.110894 0 +222 -1.72249 0.328420 0 +223 -1.58746 0.533325 0 +224 -1.39142 0.717734 0 +225 -1.79133 -0.110894 0 +226 -1.72249 -0.328420 0 +227 -1.58746 -0.533325 0 +228 -1.39142 -0.717734 0 +229 0.951590 -0.416279 0 +230 0.707095 -0.474929 0 +231 0.435427 -0.515328 0 +232 0.147026 -0.535923 0 +233 -0.951590 -0.416279 0 +234 -0.707095 -0.474929 0 +235 -0.435427 -0.515328 0 +236 -0.147026 -0.535923 0 +237 1.23777 -0.743013 0 +238 1.17531 -0.633520 0 +239 1.12255 -0.529255 0 +240 1.07905 -0.429358 0 +241 1.14191 -0.874561 0 +242 0.848514 -0.997780 0 +243 0.522512 -1.08265 0 +244 0.176431 -1.12592 0 +245 -1.30420e-08 -1.05078 0 +246 -1.23839e-08 -0.895932 0 +247 -2.91623e-16 -0.748480 0 +248 -2.80323e-16 -0.607204 0 +249 -1.23777 -0.743013 0 +250 -1.17531 -0.633520 0 +251 -1.12255 -0.529255 0 +252 -1.07905 -0.429358 0 +253 -1.14191 -0.874561 0 +254 -0.848514 -0.997780 0 +255 -0.522512 -1.08265 0 +256 -0.176431 -1.12592 0 +257 1.61722 0.402116 0 +258 1.53561 0.342858 0 +259 1.46668 0.286431 0 +260 1.40985 0.232367 0 +261 1.61534 0.0805073 0 +262 1.55326 0.238428 0 +263 1.43149 0.387186 0 +264 1.25472 0.521065 0 +265 0.669875 0.970793 0 +266 0.636072 0.827734 0 +267 0.607518 0.691505 0 +268 0.583978 0.560983 0 +269 1.02972 0.634919 0 +270 0.765150 0.724374 0 +271 0.471177 0.785992 0 +272 0.159097 0.817404 0 +273 -1.02972 0.634919 0 +274 -0.765150 0.724374 0 +275 -0.471177 0.785992 0 +276 -0.159097 0.817404 0 +277 -0.669875 0.970793 0 +278 -0.636072 0.827734 0 +279 -0.607518 0.691505 0 +280 -0.583978 0.560983 0 +281 -1.61534 0.0805073 0 +282 -1.55326 0.238428 0 +283 -1.43149 0.387186 0 +284 -1.25472 0.521065 0 +285 -1.61722 0.402116 0 +286 -1.53561 0.342858 0 +287 -1.46668 0.286431 0 +288 -1.40985 0.232367 0 +289 1.61534 -0.0805073 0 +290 1.55326 -0.238428 0 +291 1.43149 -0.387186 0 +292 1.25472 -0.521065 0 +293 1.61722 -0.402116 0 +294 1.53561 -0.342858 0 +295 1.46668 -0.286431 0 +296 1.40985 -0.232367 0 +297 1.02972 -0.634919 0 +298 0.765150 -0.724374 0 +299 0.471177 -0.785992 0 +300 0.159097 -0.817404 0 +301 0.669875 -0.970793 0 +302 0.636072 -0.827734 0 +303 0.607518 -0.691505 0 +304 0.583978 -0.560983 0 +305 -0.669875 -0.970793 0 +306 -0.636072 -0.827734 0 +307 -0.607518 -0.691505 0 +308 -0.583978 -0.560983 0 +309 -1.02972 -0.634919 0 +310 -0.765150 -0.724374 0 +311 -0.471177 -0.785992 0 +312 -0.159097 -0.817404 0 +313 -1.61722 -0.402116 0 +314 -1.53561 -0.342858 0 +315 -1.46668 -0.286431 0 +316 -1.40985 -0.232367 0 +317 -1.61534 -0.0805073 0 +318 -1.55326 -0.238428 0 +319 -1.43149 -0.387186 0 +320 -1.25472 -0.521065 0 +321 1.71683 0.204997 0 +322 1.63020 0.174788 0 +323 1.69634 0.0953072 0 +324 1.63115 0.282259 0 +325 1.45546 0.583781 0 +326 1.38202 0.497753 0 +327 1.50327 0.458364 0 +328 1.31763 0.616854 0 +329 1.55702 0.146021 0 +330 1.49669 0.118460 0 +331 1.54767 0.0663717 0 +332 1.48820 0.196564 0 +333 1.31998 0.415833 0 +334 1.26883 0.337345 0 +335 1.37153 0.319203 0 +336 1.20216 0.429575 0 +337 0.972507 0.873690 0 +338 0.923433 0.744940 0 +339 1.08135 0.751639 0 +340 0.803516 0.857539 0 +341 0.341499 1.03059 0 +342 0.324267 0.878717 0 +343 0.494803 0.930484 0 +344 0.167075 0.967671 0 +345 0.881979 0.622338 0 +346 0.847804 0.504872 0 +347 0.986583 0.523439 0 +348 0.733098 0.597187 0 +349 0.309710 0.734098 0 +350 0.297709 0.595537 0 +351 0.451439 0.647986 0 +352 0.152432 0.673883 0 +353 -1.08135 0.751639 0 +354 -0.803516 0.857539 0 +355 -0.972507 0.873690 0 +356 -0.923433 0.744940 0 +357 -0.986583 0.523439 0 +358 -0.733098 0.597187 0 +359 -0.881979 0.622338 0 +360 -0.847804 0.504872 0 +361 -0.494803 0.930484 0 +362 -0.167075 0.967671 0 +363 -0.341499 1.03059 0 +364 -0.324267 0.878717 0 +365 -0.451439 0.647986 0 +366 -0.152432 0.673883 0 +367 -0.309710 0.734098 0 +368 -0.297709 0.595537 0 +369 -1.69634 0.0953072 0 +370 -1.63115 0.282259 0 +371 -1.71683 0.204997 0 +372 -1.63020 0.174788 0 +373 -1.54767 0.0663717 0 +374 -1.48820 0.196564 0 +375 -1.55702 0.146021 0 +376 -1.49669 0.118460 0 +377 -1.50327 0.458364 0 +378 -1.31763 0.616854 0 +379 -1.45546 0.583781 0 +380 -1.38202 0.497753 0 +381 -1.37153 0.319203 0 +382 -1.20216 0.429575 0 +383 -1.31998 0.415833 0 +384 -1.26883 0.337345 0 +385 1.69634 -0.0953072 0 +386 1.63115 -0.282259 0 +387 1.71683 -0.204997 0 +388 1.63020 -0.174788 0 +389 1.54767 -0.0663717 0 +390 1.48820 -0.196564 0 +391 1.55702 -0.146021 0 +392 1.49669 -0.118460 0 +393 1.50327 -0.458364 0 +394 1.31763 -0.616854 0 +395 1.45546 -0.583781 0 +396 1.38202 -0.497753 0 +397 1.37153 -0.319203 0 +398 1.20216 -0.429575 0 +399 1.31998 -0.415833 0 +400 1.26883 -0.337345 0 +401 1.08135 -0.751639 0 +402 0.803516 -0.857539 0 +403 0.972507 -0.873690 0 +404 0.923433 -0.744940 0 +405 0.986583 -0.523439 0 +406 0.733098 -0.597187 0 +407 0.881979 -0.622338 0 +408 0.847804 -0.504872 0 +409 0.494803 -0.930484 0 +410 0.167075 -0.967671 0 +411 0.341499 -1.03059 0 +412 0.324267 -0.878717 0 +413 0.451439 -0.647986 0 +414 0.152432 -0.673883 0 +415 0.309710 -0.734098 0 +416 0.297709 -0.595537 0 +417 -0.972507 -0.873690 0 +418 -0.923433 -0.744940 0 +419 -1.08135 -0.751639 0 +420 -0.803516 -0.857539 0 +421 -0.341499 -1.03059 0 +422 -0.324267 -0.878717 0 +423 -0.494803 -0.930484 0 +424 -0.167075 -0.967671 0 +425 -0.881979 -0.622338 0 +426 -0.847804 -0.504872 0 +427 -0.986583 -0.523439 0 +428 -0.733098 -0.597187 0 +429 -0.309710 -0.734098 0 +430 -0.297709 -0.595537 0 +431 -0.451439 -0.647986 0 +432 -0.152432 -0.673883 0 +433 -1.71683 -0.204997 0 +434 -1.63020 -0.174788 0 +435 -1.69634 -0.0953072 0 +436 -1.63115 -0.282259 0 +437 -1.45546 -0.583781 0 +438 -1.38202 -0.497753 0 +439 -1.50327 -0.458364 0 +440 -1.31763 -0.616854 0 +441 -1.55702 -0.146021 0 +442 -1.49669 -0.118460 0 +443 -1.54767 -0.0663717 0 +444 -1.48820 -0.196564 0 +445 -1.31998 -0.415833 0 +446 -1.26883 -0.337345 0 +447 -1.37153 -0.319203 0 +448 -1.20216 -0.429575 0 +449 1.74204 0.102994 0 +450 1.67509 0.305025 0 +451 1.65413 0.0878167 0 +452 1.59056 0.260075 0 +453 1.54377 0.495334 0 +454 1.35313 0.666607 0 +455 1.46587 0.422340 0 +456 1.28485 0.568373 0 +457 1.57988 0.0733638 0 +458 1.51916 0.217272 0 +459 1.51866 0.0595164 0 +460 1.46030 0.176262 0 +461 1.40007 0.352831 0 +462 1.22717 0.474831 0 +463 1.34582 0.286234 0 +464 1.17962 0.385206 0 +465 1.11048 0.812263 0 +466 0.825165 0.926704 0 +467 1.05445 0.692565 0 +468 0.783525 0.790142 0 +469 0.508134 1.00553 0 +470 0.171576 1.04572 0 +471 0.482492 0.857354 0 +472 0.162918 0.891618 0 +473 1.00711 0.578583 0 +474 0.748352 0.660100 0 +475 0.968088 0.469375 0 +476 0.719355 0.535506 0 +477 0.460833 0.716250 0 +478 0.155604 0.744876 0 +479 0.442976 0.581058 0 +480 0.149575 0.604280 0 +481 -1.11048 0.812263 0 +482 -1.05445 0.692565 0 +483 -0.825165 0.926704 0 +484 -0.783525 0.790142 0 +485 -1.00711 0.578583 0 +486 -0.968088 0.469375 0 +487 -0.748352 0.660100 0 +488 -0.719355 0.535506 0 +489 -0.508134 1.00553 0 +490 -0.482492 0.857354 0 +491 -0.171576 1.04572 0 +492 -0.162918 0.891618 0 +493 -0.460833 0.716250 0 +494 -0.442976 0.581058 0 +495 -0.155604 0.744876 0 +496 -0.149575 0.604280 0 +497 -1.74204 0.102994 0 +498 -1.65413 0.0878167 0 +499 -1.67509 0.305025 0 +500 -1.59056 0.260075 0 +501 -1.57988 0.0733638 0 +502 -1.51866 0.0595164 0 +503 -1.51916 0.217272 0 +504 -1.46030 0.176262 0 +505 -1.54377 0.495334 0 +506 -1.46587 0.422340 0 +507 -1.35313 0.666607 0 +508 -1.28485 0.568373 0 +509 -1.40007 0.352831 0 +510 -1.34582 0.286234 0 +511 -1.22717 0.474831 0 +512 -1.17962 0.385206 0 +513 1.74204 -0.102994 0 +514 1.65413 -0.0878167 0 +515 1.67509 -0.305025 0 +516 1.59056 -0.260075 0 +517 1.57988 -0.0733638 0 +518 1.51866 -0.0595164 0 +519 1.51916 -0.217272 0 +520 1.46030 -0.176262 0 +521 1.54377 -0.495334 0 +522 1.46587 -0.422340 0 +523 1.35313 -0.666607 0 +524 1.28485 -0.568373 0 +525 1.40007 -0.352831 0 +526 1.34582 -0.286234 0 +527 1.22717 -0.474831 0 +528 1.17962 -0.385206 0 +529 1.11048 -0.812263 0 +530 1.05445 -0.692565 0 +531 0.825165 -0.926704 0 +532 0.783525 -0.790142 0 +533 1.00711 -0.578583 0 +534 0.968088 -0.469375 0 +535 0.748352 -0.660100 0 +536 0.719355 -0.535506 0 +537 0.508134 -1.00553 0 +538 0.482492 -0.857354 0 +539 0.171576 -1.04572 0 +540 0.162918 -0.891618 0 +541 0.460833 -0.716250 0 +542 0.442976 -0.581058 0 +543 0.155604 -0.744876 0 +544 0.149575 -0.604280 0 +545 -1.11048 -0.812263 0 +546 -0.825165 -0.926704 0 +547 -1.05445 -0.692565 0 +548 -0.783525 -0.790142 0 +549 -0.508134 -1.00553 0 +550 -0.171576 -1.04572 0 +551 -0.482492 -0.857354 0 +552 -0.162918 -0.891618 0 +553 -1.00711 -0.578583 0 +554 -0.748352 -0.660100 0 +555 -0.968088 -0.469375 0 +556 -0.719355 -0.535506 0 +557 -0.460833 -0.716250 0 +558 -0.155604 -0.744876 0 +559 -0.442976 -0.581058 0 +560 -0.149575 -0.604280 0 +561 -1.74204 -0.102994 0 +562 -1.67509 -0.305025 0 +563 -1.65413 -0.0878167 0 +564 -1.59056 -0.260075 0 +565 -1.54377 -0.495334 0 +566 -1.35313 -0.666607 0 +567 -1.46587 -0.422340 0 +568 -1.28485 -0.568373 0 +569 -1.57988 -0.0733638 0 +570 -1.51916 -0.217272 0 +571 -1.51866 -0.0595164 0 +572 -1.46030 -0.176262 0 +573 -1.40007 -0.352831 0 +574 -1.22717 -0.474831 0 +575 -1.34582 -0.286234 0 +576 -1.17962 -0.385206 0 +$ENDNOD +$ELM +512 +1 3 0 0 4 6 189 449 185 +2 3 0 0 4 189 63 321 449 +3 3 0 0 4 185 449 323 61 +4 3 0 0 4 449 321 129 323 +5 3 0 0 4 63 190 450 321 +6 3 0 0 4 190 24 257 450 +7 3 0 0 4 321 450 324 129 +8 3 0 0 4 450 257 97 324 +9 3 0 0 4 61 323 451 186 +10 3 0 0 4 323 129 322 451 +11 3 0 0 4 186 451 261 23 +12 3 0 0 4 451 322 99 261 +13 3 0 0 4 129 324 452 322 +14 3 0 0 4 324 97 258 452 +15 3 0 0 4 322 452 262 99 +16 3 0 0 4 452 258 41 262 +17 3 0 0 4 24 191 453 257 +18 3 0 0 4 191 64 325 453 +19 3 0 0 4 257 453 327 97 +20 3 0 0 4 453 325 130 327 +21 3 0 0 4 64 192 454 325 +22 3 0 0 4 192 7 197 454 +23 3 0 0 4 325 454 328 130 +24 3 0 0 4 454 197 67 328 +25 3 0 0 4 97 327 455 258 +26 3 0 0 4 327 130 326 455 +27 3 0 0 4 258 455 263 41 +28 3 0 0 4 455 326 100 263 +29 3 0 0 4 130 328 456 326 +30 3 0 0 4 328 67 198 456 +31 3 0 0 4 326 456 264 100 +32 3 0 0 4 456 198 26 264 +33 3 0 0 4 23 261 457 187 +34 3 0 0 4 261 99 329 457 +35 3 0 0 4 187 457 331 62 +36 3 0 0 4 457 329 131 331 +37 3 0 0 4 99 262 458 329 +38 3 0 0 4 262 41 259 458 +39 3 0 0 4 329 458 332 131 +40 3 0 0 4 458 259 98 332 +41 3 0 0 4 62 331 459 188 +42 3 0 0 4 331 131 330 459 +43 3 0 0 4 188 459 161 1 +44 3 0 0 4 459 330 49 161 +45 3 0 0 4 131 332 460 330 +46 3 0 0 4 332 98 260 460 +47 3 0 0 4 330 460 162 49 +48 3 0 0 4 460 260 17 162 +49 3 0 0 4 41 263 461 259 +50 3 0 0 4 263 100 333 461 +51 3 0 0 4 259 461 335 98 +52 3 0 0 4 461 333 132 335 +53 3 0 0 4 100 264 462 333 +54 3 0 0 4 264 26 199 462 +55 3 0 0 4 333 462 336 132 +56 3 0 0 4 462 199 68 336 +57 3 0 0 4 98 335 463 260 +58 3 0 0 4 335 132 334 463 +59 3 0 0 4 260 463 163 17 +60 3 0 0 4 463 334 50 163 +61 3 0 0 4 132 336 464 334 +62 3 0 0 4 336 68 200 464 +63 3 0 0 4 334 464 164 50 +64 3 0 0 4 464 200 2 164 +65 3 0 0 4 7 201 465 197 +66 3 0 0 4 201 69 337 465 +67 3 0 0 4 197 465 339 67 +68 3 0 0 4 465 337 133 339 +69 3 0 0 4 69 202 466 337 +70 3 0 0 4 202 27 265 466 +71 3 0 0 4 337 466 340 133 +72 3 0 0 4 466 265 101 340 +73 3 0 0 4 67 339 467 198 +74 3 0 0 4 339 133 338 467 +75 3 0 0 4 198 467 269 26 +76 3 0 0 4 467 338 103 269 +77 3 0 0 4 133 340 468 338 +78 3 0 0 4 340 101 266 468 +79 3 0 0 4 338 468 270 103 +80 3 0 0 4 468 266 42 270 +81 3 0 0 4 27 203 469 265 +82 3 0 0 4 203 70 341 469 +83 3 0 0 4 265 469 343 101 +84 3 0 0 4 469 341 134 343 +85 3 0 0 4 70 204 470 341 +86 3 0 0 4 204 8 205 470 +87 3 0 0 4 341 470 344 134 +88 3 0 0 4 470 205 71 344 +89 3 0 0 4 101 343 471 266 +90 3 0 0 4 343 134 342 471 +91 3 0 0 4 266 471 271 42 +92 3 0 0 4 471 342 104 271 +93 3 0 0 4 134 344 472 342 +94 3 0 0 4 344 71 206 472 +95 3 0 0 4 342 472 272 104 +96 3 0 0 4 472 206 28 272 +97 3 0 0 4 26 269 473 199 +98 3 0 0 4 269 103 345 473 +99 3 0 0 4 199 473 347 68 +100 3 0 0 4 473 345 135 347 +101 3 0 0 4 103 270 474 345 +102 3 0 0 4 270 42 267 474 +103 3 0 0 4 345 474 348 135 +104 3 0 0 4 474 267 102 348 +105 3 0 0 4 68 347 475 200 +106 3 0 0 4 347 135 346 475 +107 3 0 0 4 200 475 169 2 +108 3 0 0 4 475 346 53 169 +109 3 0 0 4 135 348 476 346 +110 3 0 0 4 348 102 268 476 +111 3 0 0 4 346 476 170 53 +112 3 0 0 4 476 268 19 170 +113 3 0 0 4 42 271 477 267 +114 3 0 0 4 271 104 349 477 +115 3 0 0 4 267 477 351 102 +116 3 0 0 4 477 349 136 351 +117 3 0 0 4 104 272 478 349 +118 3 0 0 4 272 28 207 478 +119 3 0 0 4 349 478 352 136 +120 3 0 0 4 478 207 72 352 +121 3 0 0 4 102 351 479 268 +122 3 0 0 4 351 136 350 479 +123 3 0 0 4 268 479 171 19 +124 3 0 0 4 479 350 54 171 +125 3 0 0 4 136 352 480 350 +126 3 0 0 4 352 72 208 480 +127 3 0 0 4 350 480 172 54 +128 3 0 0 4 480 208 3 172 +129 3 0 0 4 9 209 481 213 +130 3 0 0 4 209 73 353 481 +131 3 0 0 4 213 481 355 75 +132 3 0 0 4 481 353 137 355 +133 3 0 0 4 73 210 482 353 +134 3 0 0 4 210 29 273 482 +135 3 0 0 4 353 482 356 137 +136 3 0 0 4 482 273 105 356 +137 3 0 0 4 75 355 483 214 +138 3 0 0 4 355 137 354 483 +139 3 0 0 4 214 483 277 30 +140 3 0 0 4 483 354 107 277 +141 3 0 0 4 137 356 484 354 +142 3 0 0 4 356 105 274 484 +143 3 0 0 4 354 484 278 107 +144 3 0 0 4 484 274 43 278 +145 3 0 0 4 29 211 485 273 +146 3 0 0 4 211 74 357 485 +147 3 0 0 4 273 485 359 105 +148 3 0 0 4 485 357 138 359 +149 3 0 0 4 74 212 486 357 +150 3 0 0 4 212 4 173 486 +151 3 0 0 4 357 486 360 138 +152 3 0 0 4 486 173 55 360 +153 3 0 0 4 105 359 487 274 +154 3 0 0 4 359 138 358 487 +155 3 0 0 4 274 487 279 43 +156 3 0 0 4 487 358 108 279 +157 3 0 0 4 138 360 488 358 +158 3 0 0 4 360 55 174 488 +159 3 0 0 4 358 488 280 108 +160 3 0 0 4 488 174 20 280 +161 3 0 0 4 30 277 489 215 +162 3 0 0 4 277 107 361 489 +163 3 0 0 4 215 489 363 76 +164 3 0 0 4 489 361 139 363 +165 3 0 0 4 107 278 490 361 +166 3 0 0 4 278 43 275 490 +167 3 0 0 4 361 490 364 139 +168 3 0 0 4 490 275 106 364 +169 3 0 0 4 76 363 491 216 +170 3 0 0 4 363 139 362 491 +171 3 0 0 4 216 491 205 8 +172 3 0 0 4 491 362 71 205 +173 3 0 0 4 139 364 492 362 +174 3 0 0 4 364 106 276 492 +175 3 0 0 4 362 492 206 71 +176 3 0 0 4 492 276 28 206 +177 3 0 0 4 43 279 493 275 +178 3 0 0 4 279 108 365 493 +179 3 0 0 4 275 493 367 106 +180 3 0 0 4 493 365 140 367 +181 3 0 0 4 108 280 494 365 +182 3 0 0 4 280 20 175 494 +183 3 0 0 4 365 494 368 140 +184 3 0 0 4 494 175 56 368 +185 3 0 0 4 106 367 495 276 +186 3 0 0 4 367 140 366 495 +187 3 0 0 4 276 495 207 28 +188 3 0 0 4 495 366 72 207 +189 3 0 0 4 140 368 496 366 +190 3 0 0 4 368 56 176 496 +191 3 0 0 4 366 496 208 72 +192 3 0 0 4 496 176 3 208 +193 3 0 0 4 10 217 497 221 +194 3 0 0 4 217 77 369 497 +195 3 0 0 4 221 497 371 79 +196 3 0 0 4 497 369 141 371 +197 3 0 0 4 77 218 498 369 +198 3 0 0 4 218 31 281 498 +199 3 0 0 4 369 498 372 141 +200 3 0 0 4 498 281 109 372 +201 3 0 0 4 79 371 499 222 +202 3 0 0 4 371 141 370 499 +203 3 0 0 4 222 499 285 32 +204 3 0 0 4 499 370 111 285 +205 3 0 0 4 141 372 500 370 +206 3 0 0 4 372 109 282 500 +207 3 0 0 4 370 500 286 111 +208 3 0 0 4 500 282 44 286 +209 3 0 0 4 31 219 501 281 +210 3 0 0 4 219 78 373 501 +211 3 0 0 4 281 501 375 109 +212 3 0 0 4 501 373 142 375 +213 3 0 0 4 78 220 502 373 +214 3 0 0 4 220 5 177 502 +215 3 0 0 4 373 502 376 142 +216 3 0 0 4 502 177 57 376 +217 3 0 0 4 109 375 503 282 +218 3 0 0 4 375 142 374 503 +219 3 0 0 4 282 503 287 44 +220 3 0 0 4 503 374 112 287 +221 3 0 0 4 142 376 504 374 +222 3 0 0 4 376 57 178 504 +223 3 0 0 4 374 504 288 112 +224 3 0 0 4 504 178 21 288 +225 3 0 0 4 32 285 505 223 +226 3 0 0 4 285 111 377 505 +227 3 0 0 4 223 505 379 80 +228 3 0 0 4 505 377 143 379 +229 3 0 0 4 111 286 506 377 +230 3 0 0 4 286 44 283 506 +231 3 0 0 4 377 506 380 143 +232 3 0 0 4 506 283 110 380 +233 3 0 0 4 80 379 507 224 +234 3 0 0 4 379 143 378 507 +235 3 0 0 4 224 507 209 9 +236 3 0 0 4 507 378 73 209 +237 3 0 0 4 143 380 508 378 +238 3 0 0 4 380 110 284 508 +239 3 0 0 4 378 508 210 73 +240 3 0 0 4 508 284 29 210 +241 3 0 0 4 44 287 509 283 +242 3 0 0 4 287 112 381 509 +243 3 0 0 4 283 509 383 110 +244 3 0 0 4 509 381 144 383 +245 3 0 0 4 112 288 510 381 +246 3 0 0 4 288 21 179 510 +247 3 0 0 4 381 510 384 144 +248 3 0 0 4 510 179 58 384 +249 3 0 0 4 110 383 511 284 +250 3 0 0 4 383 144 382 511 +251 3 0 0 4 284 511 211 29 +252 3 0 0 4 511 382 74 211 +253 3 0 0 4 144 384 512 382 +254 3 0 0 4 384 58 180 512 +255 3 0 0 4 382 512 212 74 +256 3 0 0 4 512 180 4 212 +257 3 0 0 4 6 185 513 193 +258 3 0 0 4 185 61 385 513 +259 3 0 0 4 193 513 387 65 +260 3 0 0 4 513 385 145 387 +261 3 0 0 4 61 186 514 385 +262 3 0 0 4 186 23 289 514 +263 3 0 0 4 385 514 388 145 +264 3 0 0 4 514 289 113 388 +265 3 0 0 4 65 387 515 194 +266 3 0 0 4 387 145 386 515 +267 3 0 0 4 194 515 293 25 +268 3 0 0 4 515 386 115 293 +269 3 0 0 4 145 388 516 386 +270 3 0 0 4 388 113 290 516 +271 3 0 0 4 386 516 294 115 +272 3 0 0 4 516 290 45 294 +273 3 0 0 4 23 187 517 289 +274 3 0 0 4 187 62 389 517 +275 3 0 0 4 289 517 391 113 +276 3 0 0 4 517 389 146 391 +277 3 0 0 4 62 188 518 389 +278 3 0 0 4 188 1 165 518 +279 3 0 0 4 389 518 392 146 +280 3 0 0 4 518 165 51 392 +281 3 0 0 4 113 391 519 290 +282 3 0 0 4 391 146 390 519 +283 3 0 0 4 290 519 295 45 +284 3 0 0 4 519 390 116 295 +285 3 0 0 4 146 392 520 390 +286 3 0 0 4 392 51 166 520 +287 3 0 0 4 390 520 296 116 +288 3 0 0 4 520 166 18 296 +289 3 0 0 4 25 293 521 195 +290 3 0 0 4 293 115 393 521 +291 3 0 0 4 195 521 395 66 +292 3 0 0 4 521 393 147 395 +293 3 0 0 4 115 294 522 393 +294 3 0 0 4 294 45 291 522 +295 3 0 0 4 393 522 396 147 +296 3 0 0 4 522 291 114 396 +297 3 0 0 4 66 395 523 196 +298 3 0 0 4 395 147 394 523 +299 3 0 0 4 196 523 237 14 +300 3 0 0 4 523 394 87 237 +301 3 0 0 4 147 396 524 394 +302 3 0 0 4 396 114 292 524 +303 3 0 0 4 394 524 238 87 +304 3 0 0 4 524 292 36 238 +305 3 0 0 4 45 295 525 291 +306 3 0 0 4 295 116 397 525 +307 3 0 0 4 291 525 399 114 +308 3 0 0 4 525 397 148 399 +309 3 0 0 4 116 296 526 397 +310 3 0 0 4 296 18 167 526 +311 3 0 0 4 397 526 400 148 +312 3 0 0 4 526 167 52 400 +313 3 0 0 4 114 399 527 292 +314 3 0 0 4 399 148 398 527 +315 3 0 0 4 292 527 239 36 +316 3 0 0 4 527 398 88 239 +317 3 0 0 4 148 400 528 398 +318 3 0 0 4 400 52 168 528 +319 3 0 0 4 398 528 240 88 +320 3 0 0 4 528 168 11 240 +321 3 0 0 4 14 237 529 241 +322 3 0 0 4 237 87 401 529 +323 3 0 0 4 241 529 403 89 +324 3 0 0 4 529 401 149 403 +325 3 0 0 4 87 238 530 401 +326 3 0 0 4 238 36 297 530 +327 3 0 0 4 401 530 404 149 +328 3 0 0 4 530 297 117 404 +329 3 0 0 4 89 403 531 242 +330 3 0 0 4 403 149 402 531 +331 3 0 0 4 242 531 301 37 +332 3 0 0 4 531 402 119 301 +333 3 0 0 4 149 404 532 402 +334 3 0 0 4 404 117 298 532 +335 3 0 0 4 402 532 302 119 +336 3 0 0 4 532 298 46 302 +337 3 0 0 4 36 239 533 297 +338 3 0 0 4 239 88 405 533 +339 3 0 0 4 297 533 407 117 +340 3 0 0 4 533 405 150 407 +341 3 0 0 4 88 240 534 405 +342 3 0 0 4 240 11 229 534 +343 3 0 0 4 405 534 408 150 +344 3 0 0 4 534 229 83 408 +345 3 0 0 4 117 407 535 298 +346 3 0 0 4 407 150 406 535 +347 3 0 0 4 298 535 303 46 +348 3 0 0 4 535 406 120 303 +349 3 0 0 4 150 408 536 406 +350 3 0 0 4 408 83 230 536 +351 3 0 0 4 406 536 304 120 +352 3 0 0 4 536 230 34 304 +353 3 0 0 4 37 301 537 243 +354 3 0 0 4 301 119 409 537 +355 3 0 0 4 243 537 411 90 +356 3 0 0 4 537 409 151 411 +357 3 0 0 4 119 302 538 409 +358 3 0 0 4 302 46 299 538 +359 3 0 0 4 409 538 412 151 +360 3 0 0 4 538 299 118 412 +361 3 0 0 4 90 411 539 244 +362 3 0 0 4 411 151 410 539 +363 3 0 0 4 244 539 245 15 +364 3 0 0 4 539 410 91 245 +365 3 0 0 4 151 412 540 410 +366 3 0 0 4 412 118 300 540 +367 3 0 0 4 410 540 246 91 +368 3 0 0 4 540 300 38 246 +369 3 0 0 4 46 303 541 299 +370 3 0 0 4 303 120 413 541 +371 3 0 0 4 299 541 415 118 +372 3 0 0 4 541 413 152 415 +373 3 0 0 4 120 304 542 413 +374 3 0 0 4 304 34 231 542 +375 3 0 0 4 413 542 416 152 +376 3 0 0 4 542 231 84 416 +377 3 0 0 4 118 415 543 300 +378 3 0 0 4 415 152 414 543 +379 3 0 0 4 300 543 247 38 +380 3 0 0 4 543 414 92 247 +381 3 0 0 4 152 416 544 414 +382 3 0 0 4 416 84 232 544 +383 3 0 0 4 414 544 248 92 +384 3 0 0 4 544 232 12 248 +385 3 0 0 4 16 253 545 249 +386 3 0 0 4 253 95 417 545 +387 3 0 0 4 249 545 419 93 +388 3 0 0 4 545 417 153 419 +389 3 0 0 4 95 254 546 417 +390 3 0 0 4 254 40 305 546 +391 3 0 0 4 417 546 420 153 +392 3 0 0 4 546 305 121 420 +393 3 0 0 4 93 419 547 250 +394 3 0 0 4 419 153 418 547 +395 3 0 0 4 250 547 309 39 +396 3 0 0 4 547 418 123 309 +397 3 0 0 4 153 420 548 418 +398 3 0 0 4 420 121 306 548 +399 3 0 0 4 418 548 310 123 +400 3 0 0 4 548 306 47 310 +401 3 0 0 4 40 255 549 305 +402 3 0 0 4 255 96 421 549 +403 3 0 0 4 305 549 423 121 +404 3 0 0 4 549 421 154 423 +405 3 0 0 4 96 256 550 421 +406 3 0 0 4 256 15 245 550 +407 3 0 0 4 421 550 424 154 +408 3 0 0 4 550 245 91 424 +409 3 0 0 4 121 423 551 306 +410 3 0 0 4 423 154 422 551 +411 3 0 0 4 306 551 311 47 +412 3 0 0 4 551 422 124 311 +413 3 0 0 4 154 424 552 422 +414 3 0 0 4 424 91 246 552 +415 3 0 0 4 422 552 312 124 +416 3 0 0 4 552 246 38 312 +417 3 0 0 4 39 309 553 251 +418 3 0 0 4 309 123 425 553 +419 3 0 0 4 251 553 427 94 +420 3 0 0 4 553 425 155 427 +421 3 0 0 4 123 310 554 425 +422 3 0 0 4 310 47 307 554 +423 3 0 0 4 425 554 428 155 +424 3 0 0 4 554 307 122 428 +425 3 0 0 4 94 427 555 252 +426 3 0 0 4 427 155 426 555 +427 3 0 0 4 252 555 233 13 +428 3 0 0 4 555 426 85 233 +429 3 0 0 4 155 428 556 426 +430 3 0 0 4 428 122 308 556 +431 3 0 0 4 426 556 234 85 +432 3 0 0 4 556 308 35 234 +433 3 0 0 4 47 311 557 307 +434 3 0 0 4 311 124 429 557 +435 3 0 0 4 307 557 431 122 +436 3 0 0 4 557 429 156 431 +437 3 0 0 4 124 312 558 429 +438 3 0 0 4 312 38 247 558 +439 3 0 0 4 429 558 432 156 +440 3 0 0 4 558 247 92 432 +441 3 0 0 4 122 431 559 308 +442 3 0 0 4 431 156 430 559 +443 3 0 0 4 308 559 235 35 +444 3 0 0 4 559 430 86 235 +445 3 0 0 4 156 432 560 430 +446 3 0 0 4 432 92 248 560 +447 3 0 0 4 430 560 236 86 +448 3 0 0 4 560 248 12 236 +449 3 0 0 4 10 225 561 217 +450 3 0 0 4 225 81 433 561 +451 3 0 0 4 217 561 435 77 +452 3 0 0 4 561 433 157 435 +453 3 0 0 4 81 226 562 433 +454 3 0 0 4 226 33 313 562 +455 3 0 0 4 433 562 436 157 +456 3 0 0 4 562 313 125 436 +457 3 0 0 4 77 435 563 218 +458 3 0 0 4 435 157 434 563 +459 3 0 0 4 218 563 317 31 +460 3 0 0 4 563 434 127 317 +461 3 0 0 4 157 436 564 434 +462 3 0 0 4 436 125 314 564 +463 3 0 0 4 434 564 318 127 +464 3 0 0 4 564 314 48 318 +465 3 0 0 4 33 227 565 313 +466 3 0 0 4 227 82 437 565 +467 3 0 0 4 313 565 439 125 +468 3 0 0 4 565 437 158 439 +469 3 0 0 4 82 228 566 437 +470 3 0 0 4 228 16 249 566 +471 3 0 0 4 437 566 440 158 +472 3 0 0 4 566 249 93 440 +473 3 0 0 4 125 439 567 314 +474 3 0 0 4 439 158 438 567 +475 3 0 0 4 314 567 319 48 +476 3 0 0 4 567 438 128 319 +477 3 0 0 4 158 440 568 438 +478 3 0 0 4 440 93 250 568 +479 3 0 0 4 438 568 320 128 +480 3 0 0 4 568 250 39 320 +481 3 0 0 4 31 317 569 219 +482 3 0 0 4 317 127 441 569 +483 3 0 0 4 219 569 443 78 +484 3 0 0 4 569 441 159 443 +485 3 0 0 4 127 318 570 441 +486 3 0 0 4 318 48 315 570 +487 3 0 0 4 441 570 444 159 +488 3 0 0 4 570 315 126 444 +489 3 0 0 4 78 443 571 220 +490 3 0 0 4 443 159 442 571 +491 3 0 0 4 220 571 181 5 +492 3 0 0 4 571 442 59 181 +493 3 0 0 4 159 444 572 442 +494 3 0 0 4 444 126 316 572 +495 3 0 0 4 442 572 182 59 +496 3 0 0 4 572 316 22 182 +497 3 0 0 4 48 319 573 315 +498 3 0 0 4 319 128 445 573 +499 3 0 0 4 315 573 447 126 +500 3 0 0 4 573 445 160 447 +501 3 0 0 4 128 320 574 445 +502 3 0 0 4 320 39 251 574 +503 3 0 0 4 445 574 448 160 +504 3 0 0 4 574 251 94 448 +505 3 0 0 4 126 447 575 316 +506 3 0 0 4 447 160 446 575 +507 3 0 0 4 316 575 183 22 +508 3 0 0 4 575 446 60 183 +509 3 0 0 4 160 448 576 446 +510 3 0 0 4 448 94 252 576 +511 3 0 0 4 446 576 184 60 +512 3 0 0 4 576 252 13 184 +$ENDELM diff --git a/tests/manifold/elliptical_manifold_02.cc b/tests/manifold/elliptical_manifold_02.cc new file mode 100644 index 0000000000..00d9e8b7e9 --- /dev/null +++ b/tests/manifold/elliptical_manifold_02.cc @@ -0,0 +1,111 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2016 - 2018 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.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + +// This test verifies the correct functioning of pull_back() and push_forward(). +// It checks that pull_back(push_forward(input)) returns input within a +// given tolerance. + +#include "../tests.h" + + +// all include files you need here +#include +#include +#include +#include +#include +#include + +#define TOLERANCE 1e-12 + +// Helper functions +template +Point +test_push(const Tensor<1, spacedim> &axis, + const double c_parameter, + const Point & space_point, + unsigned int ref = 1) +{ + EllipticalManifold manifold(Point(), + axis, + c_parameter); + const Point chart_point(manifold.push_forward(space_point)); + deallog << space_point << " -> "; + deallog << chart_point << std::endl; + return chart_point; +} +template +Point +test_pull(const Tensor<1, spacedim> &axis, + const double c_parameter, + const Point & chart_point, + unsigned int ref = 1) +{ + EllipticalManifold manifold(Point(), + axis, + c_parameter); + const Point space_point(manifold.pull_back(chart_point)); + deallog << space_point << " <- "; + deallog << chart_point << std::endl; + return space_point; +} + +// Function that tests pull_back() and push_forward(). +void +local_test(const Tensor<1, 2> &axis, + const double c_parameter, + const Point<2> & space_point) +{ + const Point<2> pt1 = test_push<2, 2>(axis, c_parameter, space_point); + const Point<2> pt2 = test_pull<2, 2>(axis, c_parameter, pt1); + if ((space_point - pt2).norm() < TOLERANCE) + { + deallog << "OK" << std::endl; + } + else + { + deallog << "FAILED" << std::endl; + } +} + +void +test() +{ + { + // test on a default manifold + const Tensor<1, 2> axis({1.0, 0.0}); + const double c_parameter(0.1); + local_test(axis, c_parameter, Point<2>(1.1, 0.0)); + local_test(axis, c_parameter, Point<2>(2.0, 0.0)); + local_test(axis, c_parameter, Point<2>(3.0, 0.0)); + local_test(axis, c_parameter, Point<2>(4.0, 2.0)); + } + { + // test on a rotated manifold + const Tensor<1, 2> axis({1.0, -1.0}); + const double c_parameter(0.1); + local_test(axis, c_parameter, Point<2>(1.1, 0.0)); + local_test(axis, c_parameter, Point<2>(2.0, 0.0)); + local_test(axis, c_parameter, Point<2>(3.0, 0.0)); + local_test(axis, c_parameter, Point<2>(4.0, 2.0)); + } +} + +int +main() +{ + initlog(); + test(); +} diff --git a/tests/manifold/elliptical_manifold_02.output b/tests/manifold/elliptical_manifold_02.output new file mode 100644 index 0000000000..755935b8f6 --- /dev/null +++ b/tests/manifold/elliptical_manifold_02.output @@ -0,0 +1,25 @@ + +DEAL::1.10000 0.00000 -> 0.166852 0.00000 +DEAL::1.10000 0.00000 <- 0.166852 0.00000 +DEAL::OK +DEAL::2.00000 0.00000 -> 0.376220 0.00000 +DEAL::2.00000 0.00000 <- 0.376220 0.00000 +DEAL::OK +DEAL::3.00000 0.00000 -> 1.00677 0.00000 +DEAL::3.00000 0.00000 <- 1.00677 0.00000 +DEAL::OK +DEAL::4.00000 2.00000 -> -1.13642 2.48147 +DEAL::4.00000 2.00000 <- -1.13642 2.48147 +DEAL::OK +DEAL::1.10000 0.00000 -> 0.117982 -0.117982 +DEAL::1.10000 0.00000 <- 0.117982 -0.117982 +DEAL::OK +DEAL::2.00000 0.00000 -> 0.266027 -0.266027 +DEAL::2.00000 0.00000 <- 0.266027 -0.266027 +DEAL::OK +DEAL::3.00000 0.00000 -> 0.711891 -0.711891 +DEAL::3.00000 0.00000 <- 0.711891 -0.711891 +DEAL::OK +DEAL::4.00000 2.00000 -> 0.951088 2.55823 +DEAL::4.00000 2.00000 <- 0.951088 2.55823 +DEAL::OK