From f472f6d820272baf4c9b09d193c48d5b5e452a45 Mon Sep 17 00:00:00 2001 From: Martin Kronbichler Date: Thu, 18 May 2017 18:49:10 +0200 Subject: [PATCH] Transfinite interpolation manifold. Added tests. Adjusted division by zero in MappingQGeneric. Disable using additional points on TransfiniteInterpolationManifold --- .../circular_mesh_only_boundary_manifold.png | Bin 0 -> 25152 bytes ...ircular_mesh_transfinite_interpolation.png | Bin 0 -> 24742 bytes include/deal.II/grid/manifold_lib.h | 276 +++++++++ source/fe/mapping_q_generic.cc | 27 +- source/grid/manifold_lib.cc | 541 +++++++++++++++++- source/grid/manifold_lib.inst.in | 3 + tests/manifold/transfinite_manifold_01.cc | 152 +++++ tests/manifold/transfinite_manifold_01.output | 540 +++++++++++++++++ tests/manifold/transfinite_manifold_02.cc | 161 ++++++ tests/manifold/transfinite_manifold_02.output | 540 +++++++++++++++++ tests/manifold/transfinite_manifold_03.cc | 143 +++++ tests/manifold/transfinite_manifold_03.output | 25 + tests/manifold/transfinite_manifold_04.cc | 124 ++++ tests/manifold/transfinite_manifold_04.output | 194 +++++++ 14 files changed, 2714 insertions(+), 12 deletions(-) create mode 100644 doc/doxygen/images/circular_mesh_only_boundary_manifold.png create mode 100644 doc/doxygen/images/circular_mesh_transfinite_interpolation.png create mode 100644 tests/manifold/transfinite_manifold_01.cc create mode 100644 tests/manifold/transfinite_manifold_01.output create mode 100644 tests/manifold/transfinite_manifold_02.cc create mode 100644 tests/manifold/transfinite_manifold_02.output create mode 100644 tests/manifold/transfinite_manifold_03.cc create mode 100644 tests/manifold/transfinite_manifold_03.output create mode 100644 tests/manifold/transfinite_manifold_04.cc create mode 100644 tests/manifold/transfinite_manifold_04.output diff --git a/doc/doxygen/images/circular_mesh_only_boundary_manifold.png b/doc/doxygen/images/circular_mesh_only_boundary_manifold.png new file mode 100644 index 0000000000000000000000000000000000000000..fb502d5ef301792dcf4dc9c20b53e59e8c737f7a GIT binary patch literal 25152 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

tKe51Q z0x`Q5AppZ}5J8$Wwu6HYwXJ-8xPi2HWqC8we)RYa;h!L|3JSiK)1iW*q@V{DVsG_j zZhc(A4ZIc{E(CicpPnH|4Tn`!wDxt!d3=sc5EzGoBWuwgHi2J1bQmFTYu%>&bsS3W zKEH*-bk|cYuczNyHXfnF@<;<3{!z1U1c5Rz7vzyGo^EHZBIrVtD_5tjzEXCD?-;Ba znk7Rc{1XHgLc#bJ69I6=lUOsrA<8)drzi%w*;s;wQdD@bh`br;$$l+<;h!L|5DI$S z{rJDd>UJ8Q9KYp$H~bRp5CvMB-R*^qBuh0ExRI$2MC)K1al&ghI(LVy zWa*&+%vOQD{^SEceXts5z+-b&LuG#hiUrN+sS z_p~7msoS5xPY}2g9V9h~aO#w9*&xEty3)s4+@lqT=YrRMBr!JOpCE806l^}>!G;bc z^>-jcXp|iVHN#;wCsL|^1uDlCJI@T&?APKAhA>S{uonc%C{7Ja2Un2;T_QyVlCM|? zO8t0q>R-4->dh*`p(1~Rz)#abNP~#R?37fYJ$=?k`EvWDCrz^YQCSALgs^5SpYNd~#uI z`6$6*DcEyHL9WZDth^^_&x-sB0(YZ>^&3P`b+H%1m9@0IJD9f?g!fknLp2+YtO|Y# z0%b@5ql$L^K0M$iuL8}oNm6wHrXYSWx~p$PQm-o<^~xyWPz65)fjgt%lo#$a4{M9( zc8}smnGC|<}bg(RGt0@QiHMO%Z zv%MJR*Ep)AT9bl6S#O6>+ayKyU`jkGuT?Nm8Tqhn6N-Z$RXDpT_$dgKrQixr6uVt? zvCB3~x@MNj89kj6ibrVKi%sAs2$U7_+Sn5=&v&3Q8v`b`{^Rk}vV1c9=5 zxPmt!ORRZ6MM{@*D6dgdPcq0VMEUhy5_#(Eic+6HL7=R<&rKJ9A+al0oCQn*B}|BYZ8fSk&D-(Zto?>k0YTWefrM)E}_GPY@`p z1%&K^_gr1<6?00nzFIoriw}puRkOzrYBE8ftb|LwZhK%$-a5zL*_={&D;@_bco1O- zTVI!)R+J!6R+m_iwrIfy5j#an*CKocCpm!mX>|z#WdcH?E;gh)ggPaWV9!6Fq>2|R z*H?!lL7;3&ApEcI5^w9Ck~S+h4irH&V_w-X^68tBw0pF21c9=(>0l!VaIV~|l(RU| z4oJCPS#Ri9qrQIAYA+kM%*6ZzfwHZz5V)mpJ)<8B84maK%-3qXy^s8}FUyEqI&r$A z^M@L$z)uh;6A*683r7H84`r4O-XgtggiH`96A&7?+FDrHhlxD+8O= zZA#!L2$Ts3N8JGss5)7iKp&SP;Wk3oX6ao8xT=ppgQFGr$pnG2M<5LL4u3zrWl8%h zS=_8a#5lSqHW?Q9$pnG2cV?E=GO%r}@WK#rT>|!=zHittgnTkVplq5H1{6wPpZpOx z{1oh+zAvx0$yE$N%SI*$lwp7{oi-(6VSUmT-;?dU$1wl^0jWtuK~%5ErxEj$2?Aww zAS^N%QNx7@U)I31DrAB{84C!3{>A34UL&P)f+S{%f;~84Rkn*v5Gac#VHMm>VxGkZ z3EyXhvt@!nnXEJxo(A?Q32Zo`6rVRCpG*)a6BdrL!;XvpvJV}cjXK;~$R`s7$`-)F zK@SywWB1v9Nd;eX>N-#vo-#q8Y#A(EsCr>bvWOkOYAs}fK$*-=3fr=+Ax^%y6qkC6 zPi~M6E98?20%e6zs`lfd9UCKf1@eVQ*0LXPdpjAzPZGO<9JYyp0$%_x%v+y4U#CfgbU SPp2{f0000*%t0eJ@ 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 W*hvF!7|ECb0000 + * Wikipedia + * Given a point $(u,v)$ on the chart, the image of this point in real space + * is given by + * @f{align*}{ + * \bf S(u,v) &= (1-v)\bf c_0(u)+v \bf c_1(u) + (1-u)\bf c_2(v) + u \bf c_3(v) \\ + * &\quad - \begin[(1-u)(1-v) \bf x_0 + u(1-v) \bf x_1 + (1-u)v \bf x_2 + uv \bf x_3 \right] + * @f} + * where $\bf x_0, \bf x_1, \bf x_2, \bf x_3$ denote the four bounding vertices + * bounding the image space and $\bf c_0, \bf c_1, \bf c_2, \bf c_3$ are the + * four curves describing the lines of the cell. If a curved manifold is + * attached to any of these lines, the evaluation is done according to + * Manifold::get_new_point() with the two end points of the line and + * appropriate weight. In 3D, the generalization of this formula is + * implemented, creating a weighted sum of the vertices (positive + * contribution), the lines (negative), and the faces (positive contribution). + * + * This manifold is usually attached to a coarse mesh and then places new + * points as a combination of the descriptions on the boundaries, weighted + * appropriately according to the position of the point on the original chart + * point $(u,v). Whenever possible, this manifold should be preferred over + * setting only a curved manifold on the boundary of a mesh, since the latter + * will need to switch from a curved description to a straight description in a + * single layer of elements, which causes an error order on cells close to the + * boundary that does not exceed 3 no matter how high the degree of the + * polynomial mapping and the finite element space. Using this class instead, + * the curved nature of the manifold that is originally contained in one + * coarse mesh layer will be applied to more than one fine mesh + * layer once the mesh gets refined, restoring the optimal convergence rates of + * the underlying finite element and mapping as appropriate. + * + * If no curved boundaries surround a coarse cell, this class reduces to a flat + * manifold description. + * + * To give an example of using this class, the following code attaches a + * transfinite manifold to a circle: + * + * @code + * PolarManifold polar_manifold; + * TransfiniteInterpolationManifold inner_manifold; + * + * Triangulation triangulation; + * GridGenerator::hyper_ball (triangulation); + * + * triangulation.set_all_manifold_ids(1); + * triangulation.set_all_manifold_ids_on_boundary(0); + * triangulation.set_manifold (0, polar_manifold); + * inner_manifold.initialize(triangulation); + * triangulation.set_manifold (1, inner_manifold); + * triangulation.refine_global(4); + * @endcode + * + * In this code, we first set all manifold ids to the id of the transfinite + * interpolation, and then re-set the manifold ids on the boundary to identify + * the curved boundary described by the polar manifold. With this code, one + * gets a really nice mesh: + * + *

+ * @image html circular_mesh_transfinite_interpolation.png + *

+ * + * which is obviously much nicer than the polar manifold applied to just the + * boundary: + * + *

+ * @image html circular_mesh_only_boundary_manifold.png + *

+ * + * @note In the implementation of this class, the manifolds surrounding a + * coarse cell are queried repeatedly to compute points on their interior. For + * optimal mesh quality, those manifolds should be compatible with a chart + * notion. For example, computing a point that is 0.25 along the line between + * two vertices using the weights 0.25 and 0.75 for the two vertices should + * give the same result as first computing the mid point at 0.5 and then again + * compute the midpoint between the first vertex and coarse mid point. This is + * the case for PolarManifold but not for Spherical manifold, so be careful + * when using the latter. In case the quality of the manifold is not good + * enough, upon mesh refinement it may happen that the transformation to a + * chart inside the get_new_point() or add_new_point() methods produces points + * that are outside the unit cells, then this class throws an exception of type + * Manifold@::ExcTransformationFailed. If that happens, the mesh + * should be refined before applying this class, as done in the following + * example: + * @code + * SphericalManifold spherical_manifold; + * TransfiniteInterpolationManifold inner_manifold; + * Triangulation triangulation; + * GridGenerator::hyper_ball (triangulation); + * triangulation.set_all_manifold_ids(1); + * triangulation.set_all_manifold_ids_on_boundary(0); + * triangulation.set_manifold (0, polar_manifold); + * inner_manifold.initialize(triangulation); + * triangulation.set_manifold (1, inner_manifold); + * triangulation.refine_global(1); + * // initialize the transfinite manifold again + * inner_manifold.initialize(triangulation); + * triangulation.refine_global(4); + * @endcode + * + * @note For performance and accuracy reasons, it is recommended to apply the + * transfinite manifold to as coarse a mesh as possible. Regarding accuracy, + * the curved description can only be applied to new points created from a + * given neighborhood, and the grid quality is typically higher when extending + * the curved description over as large a domain as possible. Regarding + * performance, the identification of the correct coarse cell in the + * get_new_point() method needs to pass all coarse cells, so expect a quadratic + * complexity in the number of coarse cells. Thus, the current implementation + * is only really economical when there are not more than a few hundred coarse + * cells. To make performance better for larger numbers of cells, one could + * extend the current implementation by a pre-identification of relevant cells + * with axis-aligned bounding boxes. + * + * @author Martin Kronbichler, Luca Heltai, 2017 + */ +template +class TransfiniteInterpolationManifold : public Manifold +{ +public: + /** + * Constructor. + */ + TransfiniteInterpolationManifold(); + + /** + * Initializes the manifold with a coarse mesh. The prerequisite for using + * this class is that the input triangulation is uniformly refined and the + * manifold is later attached to the same triangulation. + * + * @note The triangulation used to construct the manifold must not be + * destroyed during the usage of this object. + */ + void initialize (const Triangulation &triangulation); + + /** + * Return the point which shall become the new vertex surrounded by the + * given points @p surrounding_points. @p weights contains appropriate + * weights for the surrounding points according to which the manifold + * determines the new point's position. + * + * The implementation in this class overrides the method in the base class + * and computes the new point by a transfinite interpolation. The first step + * in the implementation is to identify the coarse cell on which the + * surrounding points are located. Then, the coordinates are transformed to + * the unit coordinates on the coarse cell by a Newton iteration, where the + * new point is then computed according to the weights. Finally, it is + * pushed forward to the real space according to the transfinite + * interpolation. + */ + virtual + Point + get_new_point (const std::vector > &surrounding_points, + const std::vector &weights) const; + + /** + * Compute a new set of points that interpolate between the given points + * @p surrounding_points. @p weights is a table with as many columns as + * @p surrounding_points.size(). The number of rows in @p weights determines + * how many new points will be computed and appended to the last input + * argument @p new_points. After exit of this function, the size of + * @p new_points equals the size at entry plus the number of rows in + * @p weights. + * + * The implementation in this class overrides the method in the base class + * and computes the new point by a transfinite interpolation. The first step + * in the implementation is to identify the coarse cell on which the + * surrounding points are located. Then, the coordinates are transformed to + * the unit coordinates on the coarse cell by a Newton iteration, where the + * new points are then computed according to the weights. Finally, the is + * pushed forward to the real space according to the transfinite + * interpolation. + * + * The implementation does not allow for @p surrounding_points and + * @p new_points to point to the same vector, so make sure to pass different + * objects into the function. + */ + virtual + void + add_new_points (const std::vector > &surrounding_points, + const Table<2,double> &weights, + std::vector > &new_points) const; + +private: + /** + * Internal function to identify the most suitable cells (=charts) where the + * given surrounding points are located. We use a cheap algorithm to identify + * the cells and rank the cells by probability before we actually do the + * search inside the relevant cells. The cells are sorted by the distance of + * a Q1 approximation of the inverse mapping to the unit cell of the + * surrounding points. We expect at most 10 cells (it should be less than 8 + * candidates even in 3D, typically only two or three), so get an array with + * 10 entries of a the indices cell->index(). + */ + std::array + get_possible_cells_around_points(const std::vector > &surrounding_points) const; + + /** + * Finalizes the identification of the correct chart and returns the location + * of the surrounding points on the chart. This method internally calls + * @p get_possible_cells_around_points(). + */ + std::pair::cell_iterator, + std::vector > > + compute_chart_points(const std::vector > &surrounding_points) const; + + /** + * Pull back operation into the unit coordinates on the given coarse cell. + * + * @note This internal function is currently not compatible with the + * ChartManifold::pull_back() function because the given class represents an + * atlas of charts, not a single chart. Thus, the pull_back() operation is + * only valid with the additional information of the chart, given by a cell + * on the coarse grid. An alternative implementation could shift the index + * depending on the coarse cell for a 1-to-1 relation between the chart space + * and the image space. + */ + Point + pull_back(const typename Triangulation::cell_iterator &cell, + const Point &p) const; + + /** + * Push forward operation. + * + * @note This internal function is currently not compatible with the + * ChartManifold::pull_back() function because the given class represents an + * atlas of charts, not a single chart. Thus, the pull_back() operation is + * only valid with the additional information of the chart, given by a cell + * on the coarse grid. An alternative implementation could shift the index + * depending on the coarse cell for a 1-to-1 relation between the chart space + * and the image space. + */ + Point + push_forward(const typename Triangulation::cell_iterator &cell, + const Point &chart_point) const; + + /** + * Gradient of the push_forward method. + */ + DerivativeForm<1,dim,spacedim> + push_forward_gradient(const typename Triangulation::cell_iterator &cell, + const Point &chart_point) const; + + /** + * The underlying triangulation. + */ + const Triangulation *triangulation; + + /** + * The level of the mesh cells where the transfinite approximation is + * applied, usually level 0. + */ + int level_coarse; + + /** + * In case there all surrounding manifolds are the transfinite manifold or + * have default (invalid) manifold id, the manifold degenerates to a flat + * manifold and we can choose cheaper algorithms for the push_forward method. + */ + std::vector coarse_cell_is_flat; + + /** + * A flat manifold used to compute new points in the chart space where it we + * use a FlatManifold description. + */ + FlatManifold chart_manifold; +}; + DEAL_II_NAMESPACE_CLOSE #endif diff --git a/source/fe/mapping_q_generic.cc b/source/fe/mapping_q_generic.cc index 2eb5cf2f6d..5338286124 100644 --- a/source/fe/mapping_q_generic.cc +++ b/source/fe/mapping_q_generic.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -1461,6 +1462,8 @@ namespace } // Solve [f'(x)]d=f(x) + AssertThrow(determinant(df) > 0, + (typename Mapping::ExcTransformationFailed())); Tensor<2,spacedim> df_inverse = invert(df); const Tensor<1,spacedim> delta = df_inverse * static_cast&>(f); @@ -3792,21 +3795,23 @@ compute_mapping_support_points(const typename Triangulation::cell_ if (this->polynomial_degree > 1) { // check if all entities have the same manifold id which is when we can - // simply ask the manifold for all points + // simply ask the manifold for all points. the transfinite manifold can + // do the interpolation better than this class, so if we detect that we + // do not have to change anything here Assert(dim<=3, ExcImpossibleInDim(dim)); bool all_manifold_ids_are_equal = (dim == spacedim); - if (dim > 1) - for (unsigned int l=0; l::lines_per_cell; ++l) - if (&cell->line(l)->get_manifold() != &cell->get_manifold()) - all_manifold_ids_are_equal = false; - if (dim == 3) - if (check_identical_manifolds_of_quads(cell) == false) - all_manifold_ids_are_equal = false; - if (all_manifold_ids_are_equal) + if (all_manifold_ids_are_equal && + dynamic_cast*>(&cell->get_manifold()) == nullptr) { - std::vector > vertices(a); - cell->get_manifold().add_new_points(vertices, support_point_weights_cell, a); + if (dim > 1) + for (unsigned int l=0; l::lines_per_cell; ++l) + if (&cell->line(l)->get_manifold() != &cell->get_manifold()) + all_manifold_ids_are_equal = false; + if (dim == 3) + if (check_identical_manifolds_of_quads(cell) == false) + all_manifold_ids_are_equal = false; } + else switch (dim) { diff --git a/source/grid/manifold_lib.cc b/source/grid/manifold_lib.cc index 46c46eb371..1de6dbb333 100644 --- a/source/grid/manifold_lib.cc +++ b/source/grid/manifold_lib.cc @@ -13,12 +13,14 @@ // // --------------------------------------------------------------------- +#include +#include #include #include #include #include -#include #include +#include #include DEAL_II_NAMESPACE_OPEN @@ -549,6 +551,543 @@ TorusManifold::push_forward_gradient(const Point<3> &chart_point) const +template +TransfiniteInterpolationManifold::TransfiniteInterpolationManifold() + : + triangulation(nullptr), + level_coarse (-1) +{} + + + +template +void +TransfiniteInterpolationManifold +::initialize(const Triangulation &triangulation) +{ + this->triangulation = &triangulation; + // in case the triangulatoin is cleared, remove the pointers by a signal + triangulation.signals.clear.connect + ([&]() -> void {this->triangulation = nullptr; this->level_coarse = -1;}); + level_coarse = triangulation.last()->level(); + coarse_cell_is_flat.resize(triangulation.n_cells(level_coarse), false); + typename Triangulation::active_cell_iterator + cell = triangulation.begin(level_coarse), + endc = triangulation.end(level_coarse); + for ( ; cell != endc; ++cell) + { + bool cell_is_flat = true; + for (unsigned int l=0; l::lines_per_cell; ++l) + if (cell->line(l)->manifold_id() != cell->manifold_id() && + cell->line(l)->manifold_id() != numbers::invalid_manifold_id) + cell_is_flat = false; + if (dim > 2) + for (unsigned int q=0; q::quads_per_cell; ++q) + if (cell->quad(q)->manifold_id() != cell->manifold_id() && + cell->quad(q)->manifold_id() != numbers::invalid_manifold_id) + cell_is_flat = false; + AssertIndexRange(static_cast(cell->index()), + coarse_cell_is_flat.size()); + coarse_cell_is_flat[cell->index()] = cell_is_flat; + } +} + + + +namespace +{ + // version for 1D + template + Point + compute_transfinite_interpolation(const AccessorType &cell, + const Point<1> &chart_point, + const bool cell_is_flat) + { + return cell.vertex(0) * (1.-chart_point[0]) + cell.vertex(1) * chart_point[0]; + } + + // version for 2D + template + Point + compute_transfinite_interpolation(const AccessorType &cell, + const Point<2> &chart_point, + const bool cell_is_flat) + { + const unsigned int spacedim = AccessorType::space_dimension; + const types::manifold_id my_manifold_id = cell.manifold_id(); + + // formula see wikipedia + // https://en.wikipedia.org/wiki/Transfinite_interpolation + // S(u,v) = (1-v)c_1(u)+v c_3(u) + (1-u)c_2(v) + u c_4(v) - + // [(1-u)(1-v)P_0 + u(1-v) P_1 + (1-u)v P_2 + uv P_3] + + Point new_point; + if (cell_is_flat) + for (unsigned int v=0; v::vertices_per_cell; ++v) + new_point += GeometryInfo<2>::d_linear_shape_function(chart_point, v) * + cell.vertex(v); + else + { + // We subtract the contribution of the vertices (second line in formula). + // If a line applies the same manifold as the cell, we also subtract a + // weighted part of the vertex, so accumulate the final weight of the + // the vertices while going through the faces (this is a bit artificial + // in 2D but it becomes clear in 3D where we avoid looking at the faces' + // orientation and other complications). + double weights_vertices[GeometryInfo<2>::vertices_per_cell]; + for (unsigned int v=0; v::vertices_per_cell; ++v) + weights_vertices[v] = -GeometryInfo<2>::d_linear_shape_function(chart_point, v); + + // add the contribution from the lines around the cell (first line in + // formula) + std::vector weights(GeometryInfo<2>::vertices_per_face); + std::vector > points(GeometryInfo<2>::vertices_per_face); + for (unsigned int line=0; line::lines_per_cell; ++line) + { + const double my_weight = line%2 ? chart_point[line/2] : 1-chart_point[line/2]; + const double line_point = chart_point[1-line/2]; + + // Same manifold or invalid id which will go back to the same class -> + // adds to the vertices + if (cell.line(line)->manifold_id() == my_manifold_id || + cell.line(line)->manifold_id() == numbers::invalid_manifold_id) + { + weights_vertices[GeometryInfo<2>::line_to_cell_vertices(line,0)] + += my_weight * (1.-line_point); + weights_vertices[GeometryInfo<2>::line_to_cell_vertices(line,1)] + += my_weight * line_point; + } + else + { + points[0] = cell.vertex(GeometryInfo<2>::line_to_cell_vertices(line,0)); + points[1] = cell.vertex(GeometryInfo<2>::line_to_cell_vertices(line,1)); + weights[0] = 1. - line_point; + weights[1] = line_point; + new_point += my_weight * + cell.line(line)->get_manifold().get_new_point(points, weights); + } + } + + // subtract contribution from the vertices (second line in formula) + for (unsigned int v=0; v::vertices_per_cell; ++v) + new_point += weights_vertices[v] * cell.vertex(v); + } + + return new_point; + } + + // version for 3D + template + Point + compute_transfinite_interpolation(const AccessorType &cell, + const Point<3> &chart_point, + const bool cell_is_flat) + { + const unsigned int dim = AccessorType::dimension; + const unsigned int spacedim = AccessorType::space_dimension; + const types::manifold_id my_manifold_id = cell.manifold_id(); + + // Same approach as in 2D, but adding the faces, subtracting the edges, and + // adding the vertices + Point new_point; + + if (cell_is_flat) + for (unsigned int v=0; v::vertices_per_cell; ++v) + new_point += GeometryInfo<3>::d_linear_shape_function(chart_point, v) * + cell.vertex(v); + else + { + // identify the weights for the vertices and lines to be accumulated + double weights_vertices[GeometryInfo<3>::vertices_per_cell]; + for (unsigned int v=0; v::vertices_per_cell; ++v) + weights_vertices[v] = GeometryInfo<3>::d_linear_shape_function(chart_point, v); + double weights_lines[GeometryInfo<3>::lines_per_cell]; + for (unsigned int line=0; line::lines_per_cell; ++line) + weights_lines[line] = 0; + + // start with the contributions of the faces + std::vector weights; + std::vector > points; + for (unsigned int face=0; face::faces_per_cell; ++face) + { + Point<2> quad_point(chart_point[(face/2+1)%3], chart_point[(face/2+2)%3]); + const double my_weight = face%2 ? chart_point[face/2] : 1-chart_point[face/2]; + + if (std::abs(my_weight) < 1e-13) + continue; + + // same manifold or invalid id which will go back to the same class + // -> face will interpolate from the surrounding lines and vertices + if (cell.face(face)->manifold_id() == my_manifold_id || + cell.face(face)->manifold_id() == numbers::invalid_manifold_id) + { + for (unsigned int line=0; line::lines_per_cell; ++line) + { + const double line_weight = line%2 ? quad_point[line/2] : 1-quad_point[line/2]; + weights_lines[GeometryInfo<3>::face_to_cell_lines(face, line)] += + my_weight * line_weight; + } + for (unsigned int v=0; v::vertices_per_cell; ++v) + weights_vertices[GeometryInfo<3>::face_to_cell_vertices(face, v)] + -= GeometryInfo<2>::d_linear_shape_function(quad_point, v) * my_weight; + } + else + { + points.resize(GeometryInfo<2>::vertices_per_cell); + weights.resize(GeometryInfo<2>::vertices_per_cell); + for (unsigned int v=0; v::vertices_per_cell; ++v) + { + points[v] = cell.vertex(GeometryInfo<3>::face_to_cell_vertices(face,v)); + weights[v] = GeometryInfo<2>::d_linear_shape_function(quad_point, v); + } + new_point += my_weight * + cell.face(face)->get_manifold().get_new_point(points, weights); + } + } + + // next subtract the contributions of the lines + for (unsigned int line=0; line::lines_per_cell; ++line) + { + const double line_point = (line < 8 ? chart_point[1-(line%4)/2] : chart_point[2]); + double my_weight = 0.; + if (line < 8) + { + const unsigned int subline = line%4; + my_weight = subline % 2 ? chart_point[subline/2] : 1-chart_point[subline/2]; + my_weight *= line/4 ? chart_point[2] : (1-chart_point[2]); + } + else + { + Point<2> xy(chart_point[0], chart_point[1]); + my_weight = GeometryInfo<2>::d_linear_shape_function(xy, line-8); + } + my_weight -= weights_lines[line]; + + if (std::abs(my_weight) < 1e-13) + continue; + + if (cell.line(line)->manifold_id() == my_manifold_id || + cell.line(line)->manifold_id() == numbers::invalid_manifold_id) + { + weights_vertices[GeometryInfo<3>::line_to_cell_vertices(line,0)] + -= my_weight * (1.-line_point); + weights_vertices[GeometryInfo<3>::line_to_cell_vertices(line,1)] + -= my_weight * (line_point); + } + else + { + points.resize(2); + weights.resize(2); + points[0] = cell.vertex(GeometryInfo<3>::line_to_cell_vertices(line,0)); + points[1] = cell.vertex(GeometryInfo<3>::line_to_cell_vertices(line,1)); + weights[0] = 1. - line_point; + weights[1] = line_point; + new_point -= my_weight * + cell.line(line)->get_manifold().get_new_point(points, weights); + } + } + + // finally add the contribution of the + for (unsigned int v=0; v::vertices_per_cell; ++v) + new_point += weights_vertices[v] * cell.vertex(v); + } + return new_point; + } +} + + + +template +Point +TransfiniteInterpolationManifold +::push_forward(const typename Triangulation::cell_iterator &cell, + const Point &chart_point) const +{ + AssertDimension(cell->level(), level_coarse); + + // check that the point is in the unit cell which is the current chart + // Tolerance 1e-6 chosen that the method also works with + // SphericalManifold + Assert(GeometryInfo::is_inside_unit_cell(chart_point, 1e-6), + ExcMessage("chart_point is not in unit interval")); + + return compute_transfinite_interpolation(*cell, chart_point, + coarse_cell_is_flat[cell->index()]); +} + + + +template +DerivativeForm<1,dim,spacedim> +TransfiniteInterpolationManifold +::push_forward_gradient(const typename Triangulation::cell_iterator &cell, + const Point &chart_point) const +{ + // compute the derivative with the help of finite differences + Point point = compute_transfinite_interpolation(*cell, chart_point, + coarse_cell_is_flat[cell->index()]); + DerivativeForm<1,dim,spacedim> grad; + for (unsigned int d=0; d modified = chart_point; + const double step = chart_point[d] > 0.5 ? -1e-8 : 1e-8; + + // avoid checking outside of the unit interval + modified[d] += step; + Tensor<1,spacedim> difference = + compute_transfinite_interpolation(*cell, modified, + coarse_cell_is_flat[cell->index()]) - point; + for (unsigned int e=0; e +Point +TransfiniteInterpolationManifold +::pull_back(const typename Triangulation::cell_iterator &cell, + const Point &point) const +{ + Point outside; + for (unsigned int d=0; d chart_point; + try + { + chart_point = GeometryInfo::project_to_unit_cell(StaticMappingQ1::mapping.transform_real_to_unit_cell(cell, point)); + } + catch (typename Mapping::ExcTransformationFailed) + { + for (unsigned int d=0; d residual = point - compute_transfinite_interpolation(*cell, chart_point, + coarse_cell_is_flat[cell->index()]); + const double tolerance = 1e-21 * cell->diameter() * cell->diameter(); + double residual_norm_square = residual.norm_square(); + for (unsigned int i=0; i<100; ++i) + { + if (residual_norm_square < tolerance) + return chart_point; + + // if the determinant is zero, the mapping is not invertible and we are + // outside the valid chart region + DerivativeForm<1,dim,spacedim> grad = push_forward_gradient(cell, chart_point); + if (grad.determinant() <= 0.0) + return outside; + DerivativeForm<1,dim,spacedim> inv_grad = grad.covariant_form(); + Tensor<1,dim> update; + for (unsigned int d=0; d 1e-7) + { + Point guess = chart_point + alpha*update; + residual = point - compute_transfinite_interpolation(*cell, guess, + coarse_cell_is_flat[cell->index()]); + const double residual_norm_new = residual.norm_square(); + if (residual_norm_new < residual_norm_square) + { + residual_norm_square = residual_norm_new; + chart_point += alpha*update; + break; + } + else + alpha *= 0.5; + } + if (alpha < 1e-7) + return outside; + } + return outside; +} + + + +template +std::array +TransfiniteInterpolationManifold +::get_possible_cells_around_points(const std::vector > &points) const +{ + // The methods to identify cells around points in GridTools are all written + // for the active cells, but we are here looking at some cells at the coarse + // level. + Assert(triangulation != nullptr, ExcNotInitialized()); + Assert(triangulation->begin_active()->level() >= level_coarse, + ExcMessage("The manifold was initialized with level " + + Utilities::to_string(level_coarse) + " but there are now" + + "active cells on a lower level. Coarsening the mesh is " + + "currently not supported")); + + // This computes the distance of the surrouding points transformed to the unit + // cell from the unit cell. + typename Triangulation::cell_iterator + cell = triangulation->begin(level_coarse), + endc = triangulation->end(level_coarse), + best_fit = cell; + const double circle_gap = 1.3; + std::vector > distances_and_cells; + for ( ; cell != endc; ++cell) + { + // only consider cells where the current manifold is attached + if (&cell->get_manifold() != this) + continue; + + // cheap check: if any of the points is not inside a circle around the + // center of the loop, we can skip the expensive part below (this assumes + // that the manifold does not deform the grid too much) + Point center; + for (unsigned int v=0; v::vertices_per_cell; ++v) + center += cell->vertex(v); + center *= 1./GeometryInfo::vertices_per_cell; + double radius_square = 0.; + for (unsigned int v=0; v::vertices_per_cell; ++v) + radius_square = std::max(radius_square, (center-cell->vertex(v)).norm_square()); + bool inside_circle = true; + for (unsigned int i=0; i radius_square*circle_gap) + { + inside_circle = false; + break; + } + if (inside_circle == false) + continue; + + // expensive search + try + { + double current_distance = 0; + for (unsigned int i=0; i point = StaticMappingQ1::mapping.transform_real_to_unit_cell(cell, points[i]); + current_distance += GeometryInfo::distance_to_unit_cell(point); + } + distances_and_cells.emplace_back(current_distance, cell->index()); + } + catch (typename Mapping::ExcTransformationFailed &) + { + // in case the transformation by the mapping fails, use the radius + distances_and_cells.emplace_back(std::sqrt(radius_square), cell->index()); + } + } + // no coarse cell could be found -> transformation failed + AssertThrow(distances_and_cells.size() > 0, + (typename Mapping::ExcTransformationFailed())); + std::sort(distances_and_cells.begin(), distances_and_cells.end()); + std::array cells; + cells.fill(numbers::invalid_unsigned_int); + for (unsigned int i=0; i +std::pair::cell_iterator, + std::vector > > + TransfiniteInterpolationManifold + ::compute_chart_points (const std::vector > &surrounding_points) const +{ + std::pair::cell_iterator, + std::vector > > chart_points; + chart_points.second.resize(surrounding_points.size()); + + std::array nearby_cells = + get_possible_cells_around_points(surrounding_points); + + // check whether all points are inside the unit cell of the current chart + for (unsigned int c=0; c::ExcTransformationFailed())); + typename Triangulation::cell_iterator cell(triangulation, + level_coarse, + nearby_cells[c]); + bool inside_unit_cell = true; + for (unsigned int i=0; i::is_inside_unit_cell(chart_points.second[i], + 1e-6) == false) + { + inside_unit_cell = false; + break; + } + } + if (inside_unit_cell == true) + { + chart_points.first = cell; + return chart_points; + } + } + + // a valid inversion should have returned a point above. + AssertThrow(false, + (typename Mapping::ExcTransformationFailed())); + chart_points.second.clear(); + return chart_points; +} + + + +template +Point +TransfiniteInterpolationManifold +::get_new_point (const std::vector > &surrounding_points, + const std::vector &weights) const +{ + const std::pair::cell_iterator, + std::vector > > chart_points = + compute_chart_points(surrounding_points); + + const Point p_chart = chart_manifold.get_new_point(chart_points.second,weights); + + return push_forward(chart_points.first, p_chart); +} + + + +template +void +TransfiniteInterpolationManifold:: +add_new_points (const std::vector > &surrounding_points, + const Table<2,double> &weights, + std::vector > &new_points) const +{ + Assert(weights.size(0) > 0, ExcEmptyObject()); + AssertDimension(surrounding_points.size(), weights.size(1)); + + const std::pair::cell_iterator, + std::vector > > chart_points = + compute_chart_points(surrounding_points); + + std::vector > new_points_on_chart; + new_points_on_chart.reserve(weights.size(0)); + chart_manifold.add_new_points(chart_points.second, weights, new_points_on_chart); + + for (unsigned int row=0; row; template class SphericalManifold; template class CylindricalManifold; +#if deal_II_dimension > 1 + template class TransfiniteInterpolationManifold; +#endif #endif #if deal_II_dimension == deal_II_space_dimension template class TorusManifold; diff --git a/tests/manifold/transfinite_manifold_01.cc b/tests/manifold/transfinite_manifold_01.cc new file mode 100644 index 0000000000..c5b946c033 --- /dev/null +++ b/tests/manifold/transfinite_manifold_01.cc @@ -0,0 +1,152 @@ +//------------------------------------------------------------------- +// Copyright (C) 2017 by the deal.II authors. +// +// This file is subject to LGPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//------------------------------------------------------------------- + + +// Test that the transfinite manifold creates good points for a circle, a +// cylinder, and a sphere + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include + + +template +void do_test(const Triangulation &tria) +{ + for (typename Triangulation::cell_iterator cell = tria.begin(); + cell != tria.end(); ++cell) + { + deallog << "Lines on cell with center: " << cell->center() << std::endl; + for (unsigned int line=0; line::lines_per_cell; ++line) + deallog << cell->line(line)->center(/*respect_manifold=*/true) << std::endl; + deallog << "Faces on cell with center: " << cell->center() << std::endl; + for (unsigned int face=0; face::faces_per_cell; ++face) + deallog << cell->face(face)->center(/*respect_manifold=*/true) << std::endl; + deallog << "Center with manifold: " << cell->center(true) << std::endl; + for (unsigned int face=0; face::faces_per_cell; ++face) + if (cell->at_boundary(face)) + { + std::vector > points; + points.push_back(cell->face(face)->vertex(0)); + points.push_back(cell->face(face)->vertex(1)); + std::vector weights(2); + weights[0] = 0.1; + weights[1] = 0.9; + Point p = cell->get_manifold().get_new_point(points, weights); + Point pref = cell->face(face)->get_manifold().get_new_point(points, weights); + deallog << "Distance between cell manifold and face manifold: " + << (pref-p) << std::endl; + weights[0] = 0.55; + weights[1] = 0.45; + p = cell->get_manifold().get_new_point(points, weights); + pref = cell->face(face)->get_manifold().get_new_point(points, weights); + deallog << "Distance between cell manifold and face manifold: " + << (pref-p) << std::endl; + } + } + deallog << std::endl; +} + +template +void test_polar() +{ + deallog << "Testing with PolarManifold dim=" << dim + << ", spacedim="<< spacedim << std::endl; + + PolarManifold polar_manifold; + TransfiniteInterpolationManifold manifold; + + Triangulation tria; + GridGenerator::hyper_ball (tria); + + // set all entities to the transfinite manifold except for the boundary where + // we put the polar manifold + tria.set_all_manifold_ids(1); + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold (0, polar_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + do_test(tria); +} + +template +void test_spherical() +{ + deallog << "Testing with SphericalManifold dim=" << dim + << ", spacedim="<< spacedim << std::endl; + + SphericalManifold polar_manifold; + TransfiniteInterpolationManifold manifold; + + Triangulation tria; + GridGenerator::hyper_ball (tria); + + // set all entities to the transfinite manifold except for the boundary where + // we put the polar manifold + tria.set_all_manifold_ids(1); + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold (0, polar_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + do_test(tria); +} + +void test_cylinder(unsigned int ref=1) +{ + const unsigned int dim=3, spacedim = 3; + deallog << "Testing with CylindricalManifold in 3d" << std::endl; + + CylindricalManifold cylinder_manifold; + TransfiniteInterpolationManifold manifold; + Triangulation tria; + GridGenerator::cylinder (tria); + tria.set_all_manifold_ids(1); + + for (typename Triangulation::active_cell_iterator + cell=tria.begin_active(); cell!=tria.end(); ++cell) + { + for (unsigned int face=0; face::faces_per_cell; ++face) + if (cell->at_boundary(face)) + { + bool cell_at_surfaces = true; + for (unsigned int i=1; i::vertices_per_face; ++i) + if (std::abs(cell->face(face)->vertex(i)[0] - cell->face(face)->vertex(0)[0]) > 1e-10) + cell_at_surfaces = false; + if (cell_at_surfaces == false) + cell->face(face)->set_all_manifold_ids(0); + } + } + tria.set_manifold (0, cylinder_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + do_test(tria); +} + +int main () +{ + initlog(); + + test_polar<2,2>(); + test_spherical<2,2>(); + test_spherical<3,3>(); + test_cylinder(); + + return 0; +} + diff --git a/tests/manifold/transfinite_manifold_01.output b/tests/manifold/transfinite_manifold_01.output new file mode 100644 index 0000000000..602efe0fc8 --- /dev/null +++ b/tests/manifold/transfinite_manifold_01.output @@ -0,0 +1,540 @@ + +DEAL::Testing with PolarManifold dim=2, spacedim=2 +DEAL::Lines on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Faces on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Center with manifold: -9.71445e-17 -0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Faces on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Center with manifold: -0.646447 5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Faces on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Center with manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Center with manifold: 0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Faces on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Center with manifold: 2.77556e-17 0.646447 +DEAL::Distance between cell manifold and face manifold: 2.22045e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: 0.00000 1.11022e-16 +DEAL:: +DEAL::Testing with SphericalManifold dim=2, spacedim=2 +DEAL::Lines on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::0.00000 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Faces on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::0.00000 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Center with manifold: 0.00000 -0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Faces on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Center with manifold: -0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Faces on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Center with manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Center with manifold: 0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -1.38778e-17 0.500000 +DEAL::0.00000 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Faces on cell with center: -1.38778e-17 0.500000 +DEAL::0.00000 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Center with manifold: 0.00000 0.646447 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -2.22045e-16 +DEAL::Distance between cell manifold and face manifold: 6.93889e-17 1.11022e-16 +DEAL:: +DEAL::Testing with SphericalManifold dim=3, spacedim=3 +DEAL::Lines on cell with center: 0.00000 0.00000 -6.93889e-18 +DEAL::-0.211325 0.00000 -0.211325 +DEAL::0.211325 -1.38778e-17 -0.211325 +DEAL::0.00000 -0.211325 -0.211325 +DEAL::0.00000 0.211325 -0.211325 +DEAL::-0.211325 -1.38778e-17 0.211325 +DEAL::0.211325 -1.38778e-17 0.211325 +DEAL::0.00000 -0.211325 0.211325 +DEAL::0.00000 0.211325 0.211325 +DEAL::-0.211325 -0.211325 0.00000 +DEAL::0.211325 -0.211325 -1.38778e-17 +DEAL::-0.211325 0.211325 -1.38778e-17 +DEAL::0.211325 0.211325 -1.38778e-17 +DEAL::Faces on cell with center: 0.00000 0.00000 -6.93889e-18 +DEAL::-0.211325 -2.08167e-17 -4.85723e-17 +DEAL::0.211325 0.00000 -4.16334e-17 +DEAL::0.00000 -0.211325 0.00000 +DEAL::-3.46945e-17 0.211325 -1.38778e-17 +DEAL::-1.38778e-17 -6.93889e-18 -0.211325 +DEAL::-1.38778e-17 -2.77556e-17 0.211325 +DEAL::Center with manifold: -9.36751e-17 -4.85723e-17 -7.63278e-17 +DEAL::Lines on cell with center: 0.00000 0.00000 -0.394338 +DEAL::-0.707107 0.00000 -0.707107 +DEAL::0.707107 0.00000 -0.707107 +DEAL::0.00000 -0.707107 -0.707107 +DEAL::0.00000 0.707107 -0.707107 +DEAL::-0.211325 0.00000 -0.211325 +DEAL::0.211325 -1.38778e-17 -0.211325 +DEAL::0.00000 -0.211325 -0.211325 +DEAL::0.00000 0.211325 -0.211325 +DEAL::-0.394338 -0.394338 -0.394338 +DEAL::0.394338 -0.394338 -0.394338 +DEAL::-0.394338 0.394338 -0.394338 +DEAL::0.394338 0.394338 -0.394338 +DEAL::Faces on cell with center: 0.00000 0.00000 -0.394338 +DEAL::-0.459216 6.93889e-18 -0.459216 +DEAL::0.459216 0.00000 -0.459216 +DEAL::6.93889e-18 -0.459216 -0.459216 +DEAL::0.00000 0.459216 -0.459216 +DEAL::0.00000 0.00000 -1.00000 +DEAL::-1.38778e-17 -6.93889e-18 -0.211325 +DEAL::Center with manifold: -1.17961e-16 3.46945e-18 -0.605662 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -1.11022e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: -1.38778e-17 -1.11022e-16 -1.11022e-16 +DEAL::Lines on cell with center: 0.394338 0.00000 2.08167e-17 +DEAL::0.394338 -0.394338 -0.394338 +DEAL::0.394338 0.394338 -0.394338 +DEAL::0.707107 0.00000 -0.707107 +DEAL::0.211325 -1.38778e-17 -0.211325 +DEAL::0.394338 -0.394338 0.394338 +DEAL::0.394338 0.394338 0.394338 +DEAL::0.707107 0.00000 0.707107 +DEAL::0.211325 -1.38778e-17 0.211325 +DEAL::0.707107 -0.707107 0.00000 +DEAL::0.707107 0.707107 0.00000 +DEAL::0.211325 -0.211325 -1.38778e-17 +DEAL::0.211325 0.211325 -1.38778e-17 +DEAL::Faces on cell with center: 0.394338 0.00000 2.08167e-17 +DEAL::0.459216 -0.459216 0.00000 +DEAL::0.459216 0.459216 0.00000 +DEAL::1.00000 0.00000 0.00000 +DEAL::0.211325 0.00000 -4.16334e-17 +DEAL::0.459216 0.00000 -0.459216 +DEAL::0.459216 0.00000 0.459216 +DEAL::Center with manifold: 0.605662 2.42861e-17 -6.24500e-17 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -1.11022e-16 5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -1.11022e-16 -1.38778e-17 +DEAL::Lines on cell with center: 0.00000 2.08167e-17 0.394338 +DEAL::-0.394338 -0.394338 0.394338 +DEAL::0.394338 -0.394338 0.394338 +DEAL::0.00000 -0.707107 0.707107 +DEAL::0.00000 -0.211325 0.211325 +DEAL::-0.394338 0.394338 0.394338 +DEAL::0.394338 0.394338 0.394338 +DEAL::0.00000 0.707107 0.707107 +DEAL::0.00000 0.211325 0.211325 +DEAL::-0.707107 0.00000 0.707107 +DEAL::0.707107 0.00000 0.707107 +DEAL::-0.211325 -1.38778e-17 0.211325 +DEAL::0.211325 -1.38778e-17 0.211325 +DEAL::Faces on cell with center: 0.00000 2.08167e-17 0.394338 +DEAL::-0.459216 0.00000 0.459216 +DEAL::0.459216 0.00000 0.459216 +DEAL::0.00000 0.00000 1.00000 +DEAL::-1.38778e-17 -2.77556e-17 0.211325 +DEAL::6.93889e-18 -0.459216 0.459216 +DEAL::0.00000 0.459216 0.459216 +DEAL::Center with manifold: 2.42861e-17 -6.24500e-17 0.605662 +DEAL::Distance between cell manifold and face manifold: -1.11022e-16 5.55112e-17 1.11022e-16 +DEAL::Distance between cell manifold and face manifold: -1.11022e-16 -1.94289e-16 1.11022e-16 +DEAL::Lines on cell with center: -0.394338 3.46945e-18 1.73472e-17 +DEAL::-0.707107 0.00000 -0.707107 +DEAL::-0.211325 0.00000 -0.211325 +DEAL::-0.394338 -0.394338 -0.394338 +DEAL::-0.394338 0.394338 -0.394338 +DEAL::-0.707107 0.00000 0.707107 +DEAL::-0.211325 -1.38778e-17 0.211325 +DEAL::-0.394338 -0.394338 0.394338 +DEAL::-0.394338 0.394338 0.394338 +DEAL::-0.707107 -0.707107 0.00000 +DEAL::-0.211325 -0.211325 0.00000 +DEAL::-0.707107 0.707107 0.00000 +DEAL::-0.211325 0.211325 -1.38778e-17 +DEAL::Faces on cell with center: -0.394338 3.46945e-18 1.73472e-17 +DEAL::-1.00000 0.00000 0.00000 +DEAL::-0.211325 -2.08167e-17 -4.85723e-17 +DEAL::-0.459216 -0.459216 6.93889e-18 +DEAL::-0.459216 0.459216 0.00000 +DEAL::-0.459216 6.93889e-18 -0.459216 +DEAL::-0.459216 0.00000 0.459216 +DEAL::Center with manifold: -0.605662 -3.46945e-17 -1.04083e-17 +DEAL::Distance between cell manifold and face manifold: -1.11022e-16 1.11022e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: -1.11022e-16 -1.38778e-17 -1.11022e-16 +DEAL::Lines on cell with center: 0.00000 -0.394338 2.08167e-17 +DEAL::-0.394338 -0.394338 -0.394338 +DEAL::0.394338 -0.394338 -0.394338 +DEAL::0.00000 -0.707107 -0.707107 +DEAL::0.00000 -0.211325 -0.211325 +DEAL::-0.394338 -0.394338 0.394338 +DEAL::0.394338 -0.394338 0.394338 +DEAL::0.00000 -0.707107 0.707107 +DEAL::0.00000 -0.211325 0.211325 +DEAL::-0.707107 -0.707107 0.00000 +DEAL::0.707107 -0.707107 0.00000 +DEAL::-0.211325 -0.211325 0.00000 +DEAL::0.211325 -0.211325 -1.38778e-17 +DEAL::Faces on cell with center: 0.00000 -0.394338 2.08167e-17 +DEAL::-0.459216 -0.459216 6.93889e-18 +DEAL::0.459216 -0.459216 0.00000 +DEAL::0.00000 -1.00000 0.00000 +DEAL::0.00000 -0.211325 0.00000 +DEAL::6.93889e-18 -0.459216 -0.459216 +DEAL::6.93889e-18 -0.459216 0.459216 +DEAL::Center with manifold: 2.42861e-17 -0.605662 -6.24500e-17 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -2.22045e-16 -5.55112e-17 +DEAL::Distance between cell manifold and face manifold: -2.22045e-16 -2.22045e-16 -9.71445e-17 +DEAL::Lines on cell with center: 3.46945e-18 0.394338 1.73472e-17 +DEAL::0.00000 0.707107 -0.707107 +DEAL::0.00000 0.211325 -0.211325 +DEAL::-0.394338 0.394338 -0.394338 +DEAL::0.394338 0.394338 -0.394338 +DEAL::0.00000 0.707107 0.707107 +DEAL::0.00000 0.211325 0.211325 +DEAL::-0.394338 0.394338 0.394338 +DEAL::0.394338 0.394338 0.394338 +DEAL::-0.707107 0.707107 0.00000 +DEAL::-0.211325 0.211325 -1.38778e-17 +DEAL::0.707107 0.707107 0.00000 +DEAL::0.211325 0.211325 -1.38778e-17 +DEAL::Faces on cell with center: 3.46945e-18 0.394338 1.73472e-17 +DEAL::0.00000 1.00000 0.00000 +DEAL::-3.46945e-17 0.211325 -1.38778e-17 +DEAL::-0.459216 0.459216 0.00000 +DEAL::0.459216 0.459216 0.00000 +DEAL::0.00000 0.459216 -0.459216 +DEAL::0.00000 0.459216 0.459216 +DEAL::Center with manifold: -3.46945e-17 0.605662 -1.04083e-17 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 1.11022e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: -1.38778e-17 1.11022e-16 -1.11022e-16 +DEAL:: +DEAL::Testing with CylindricalManifold in 3d +DEAL::Lines on cell with center: -0.500000 0.00000 -0.500000 +DEAL::-0.500000 0.707107 -0.707107 +DEAL::-0.500000 -0.707107 -0.707107 +DEAL::-1.00000 0.00000 -1.00000 +DEAL::0.00000 0.00000 -1.00000 +DEAL::-0.500000 0.292893 -0.292893 +DEAL::-0.500000 -0.292893 -0.292893 +DEAL::-1.00000 0.00000 -0.292893 +DEAL::0.00000 0.00000 -0.292893 +DEAL::-1.00000 0.500000 -0.500000 +DEAL::-1.00000 -0.500000 -0.500000 +DEAL::0.00000 0.500000 -0.500000 +DEAL::0.00000 -0.500000 -0.500000 +DEAL::Faces on cell with center: -0.500000 0.00000 -0.500000 +DEAL::-0.500000 0.500000 -0.500000 +DEAL::-0.500000 -0.500000 -0.500000 +DEAL::-1.00000 0.00000 -0.646447 +DEAL::0.00000 0.00000 -0.646447 +DEAL::-0.500000 0.00000 -1.00000 +DEAL::-0.500000 0.00000 -0.292893 +DEAL::Center with manifold: -0.500000 0.00000 -0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 0.500000 -6.93889e-18 +DEAL::-0.500000 0.707107 -0.707107 +DEAL::-0.500000 0.292893 -0.292893 +DEAL::-1.00000 0.500000 -0.500000 +DEAL::0.00000 0.500000 -0.500000 +DEAL::-0.500000 0.707107 0.707107 +DEAL::-0.500000 0.292893 0.292893 +DEAL::-1.00000 0.500000 0.500000 +DEAL::0.00000 0.500000 0.500000 +DEAL::-1.00000 1.00000 0.00000 +DEAL::-1.00000 0.292893 0.00000 +DEAL::0.00000 1.00000 0.00000 +DEAL::0.00000 0.292893 0.00000 +DEAL::Faces on cell with center: -0.500000 0.500000 -6.93889e-18 +DEAL::-0.500000 1.00000 0.00000 +DEAL::-0.500000 0.292893 0.00000 +DEAL::-1.00000 0.646447 0.00000 +DEAL::0.00000 0.646447 0.00000 +DEAL::-0.500000 0.500000 -0.500000 +DEAL::-0.500000 0.500000 0.500000 +DEAL::Center with manifold: -0.500000 0.646447 1.66533e-16 +DEAL::Distance between cell manifold and face manifold: -2.77556e-17 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 0.00000 1.38778e-17 +DEAL::-0.500000 0.292893 -0.292893 +DEAL::-0.500000 -0.292893 -0.292893 +DEAL::-1.00000 0.00000 -0.292893 +DEAL::0.00000 0.00000 -0.292893 +DEAL::-0.500000 0.292893 0.292893 +DEAL::-0.500000 -0.292893 0.292893 +DEAL::-1.00000 0.00000 0.292893 +DEAL::0.00000 0.00000 0.292893 +DEAL::-1.00000 0.292893 0.00000 +DEAL::-1.00000 -0.292893 0.00000 +DEAL::0.00000 0.292893 0.00000 +DEAL::0.00000 -0.292893 0.00000 +DEAL::Faces on cell with center: -0.500000 0.00000 1.38778e-17 +DEAL::-0.500000 0.292893 0.00000 +DEAL::-0.500000 -0.292893 0.00000 +DEAL::-1.00000 0.00000 0.00000 +DEAL::0.00000 0.00000 0.00000 +DEAL::-0.500000 0.00000 -0.292893 +DEAL::-0.500000 0.00000 0.292893 +DEAL::Center with manifold: -0.500000 0.00000 6.93889e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 -0.500000 0.00000 +DEAL::-0.500000 -0.707107 -0.707107 +DEAL::-0.500000 -0.707107 0.707107 +DEAL::-1.00000 -1.00000 0.00000 +DEAL::0.00000 -1.00000 0.00000 +DEAL::-0.500000 -0.292893 -0.292893 +DEAL::-0.500000 -0.292893 0.292893 +DEAL::-1.00000 -0.292893 0.00000 +DEAL::0.00000 -0.292893 0.00000 +DEAL::-1.00000 -0.500000 -0.500000 +DEAL::-1.00000 -0.500000 0.500000 +DEAL::0.00000 -0.500000 -0.500000 +DEAL::0.00000 -0.500000 0.500000 +DEAL::Faces on cell with center: -0.500000 -0.500000 0.00000 +DEAL::-0.500000 -0.500000 -0.500000 +DEAL::-0.500000 -0.500000 0.500000 +DEAL::-1.00000 -0.646447 0.00000 +DEAL::0.00000 -0.646447 0.00000 +DEAL::-0.500000 -1.00000 0.00000 +DEAL::-0.500000 -0.292893 0.00000 +DEAL::Center with manifold: -0.500000 -0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 6.93889e-18 0.500000 +DEAL::-0.500000 0.707107 0.707107 +DEAL::-0.500000 0.292893 0.292893 +DEAL::-1.00000 0.500000 0.500000 +DEAL::0.00000 0.500000 0.500000 +DEAL::-0.500000 -0.707107 0.707107 +DEAL::-0.500000 -0.292893 0.292893 +DEAL::-1.00000 -0.500000 0.500000 +DEAL::0.00000 -0.500000 0.500000 +DEAL::-1.00000 0.00000 1.00000 +DEAL::-1.00000 0.00000 0.292893 +DEAL::0.00000 0.00000 1.00000 +DEAL::0.00000 0.00000 0.292893 +DEAL::Faces on cell with center: -0.500000 6.93889e-18 0.500000 +DEAL::-0.500000 0.00000 1.00000 +DEAL::-0.500000 0.00000 0.292893 +DEAL::-1.00000 0.00000 0.646447 +DEAL::0.00000 0.00000 0.646447 +DEAL::-0.500000 0.500000 0.500000 +DEAL::-0.500000 -0.500000 0.500000 +DEAL::Center with manifold: -0.500000 -1.66533e-16 0.646447 +DEAL::Distance between cell manifold and face manifold: -2.77556e-17 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 -0.500000 +DEAL::0.500000 0.707107 -0.707107 +DEAL::0.500000 -0.707107 -0.707107 +DEAL::0.00000 0.00000 -1.00000 +DEAL::1.00000 0.00000 -1.00000 +DEAL::0.500000 0.292893 -0.292893 +DEAL::0.500000 -0.292893 -0.292893 +DEAL::0.00000 0.00000 -0.292893 +DEAL::1.00000 0.00000 -0.292893 +DEAL::0.00000 0.500000 -0.500000 +DEAL::0.00000 -0.500000 -0.500000 +DEAL::1.00000 0.500000 -0.500000 +DEAL::1.00000 -0.500000 -0.500000 +DEAL::Faces on cell with center: 0.500000 0.00000 -0.500000 +DEAL::0.500000 0.500000 -0.500000 +DEAL::0.500000 -0.500000 -0.500000 +DEAL::0.00000 0.00000 -0.646447 +DEAL::1.00000 0.00000 -0.646447 +DEAL::0.500000 0.00000 -1.00000 +DEAL::0.500000 0.00000 -0.292893 +DEAL::Center with manifold: 0.500000 0.00000 -0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.500000 -6.93889e-18 +DEAL::0.500000 0.707107 -0.707107 +DEAL::0.500000 0.292893 -0.292893 +DEAL::0.00000 0.500000 -0.500000 +DEAL::1.00000 0.500000 -0.500000 +DEAL::0.500000 0.707107 0.707107 +DEAL::0.500000 0.292893 0.292893 +DEAL::0.00000 0.500000 0.500000 +DEAL::1.00000 0.500000 0.500000 +DEAL::0.00000 1.00000 0.00000 +DEAL::0.00000 0.292893 0.00000 +DEAL::1.00000 1.00000 0.00000 +DEAL::1.00000 0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.500000 -6.93889e-18 +DEAL::0.500000 1.00000 0.00000 +DEAL::0.500000 0.292893 0.00000 +DEAL::0.00000 0.646447 0.00000 +DEAL::1.00000 0.646447 0.00000 +DEAL::0.500000 0.500000 -0.500000 +DEAL::0.500000 0.500000 0.500000 +DEAL::Center with manifold: 0.500000 0.646447 1.66533e-16 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 1.38778e-17 +DEAL::0.500000 0.292893 -0.292893 +DEAL::0.500000 -0.292893 -0.292893 +DEAL::0.00000 0.00000 -0.292893 +DEAL::1.00000 0.00000 -0.292893 +DEAL::0.500000 0.292893 0.292893 +DEAL::0.500000 -0.292893 0.292893 +DEAL::0.00000 0.00000 0.292893 +DEAL::1.00000 0.00000 0.292893 +DEAL::0.00000 0.292893 0.00000 +DEAL::0.00000 -0.292893 0.00000 +DEAL::1.00000 0.292893 0.00000 +DEAL::1.00000 -0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.00000 1.38778e-17 +DEAL::0.500000 0.292893 0.00000 +DEAL::0.500000 -0.292893 0.00000 +DEAL::0.00000 0.00000 0.00000 +DEAL::1.00000 0.00000 0.00000 +DEAL::0.500000 0.00000 -0.292893 +DEAL::0.500000 0.00000 0.292893 +DEAL::Center with manifold: 0.500000 0.00000 6.93889e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 -0.500000 0.00000 +DEAL::0.500000 -0.707107 -0.707107 +DEAL::0.500000 -0.707107 0.707107 +DEAL::0.00000 -1.00000 0.00000 +DEAL::1.00000 -1.00000 0.00000 +DEAL::0.500000 -0.292893 -0.292893 +DEAL::0.500000 -0.292893 0.292893 +DEAL::0.00000 -0.292893 0.00000 +DEAL::1.00000 -0.292893 0.00000 +DEAL::0.00000 -0.500000 -0.500000 +DEAL::0.00000 -0.500000 0.500000 +DEAL::1.00000 -0.500000 -0.500000 +DEAL::1.00000 -0.500000 0.500000 +DEAL::Faces on cell with center: 0.500000 -0.500000 0.00000 +DEAL::0.500000 -0.500000 -0.500000 +DEAL::0.500000 -0.500000 0.500000 +DEAL::0.00000 -0.646447 0.00000 +DEAL::1.00000 -0.646447 0.00000 +DEAL::0.500000 -1.00000 0.00000 +DEAL::0.500000 -0.292893 0.00000 +DEAL::Center with manifold: 0.500000 -0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 6.93889e-18 0.500000 +DEAL::0.500000 0.707107 0.707107 +DEAL::0.500000 0.292893 0.292893 +DEAL::0.00000 0.500000 0.500000 +DEAL::1.00000 0.500000 0.500000 +DEAL::0.500000 -0.707107 0.707107 +DEAL::0.500000 -0.292893 0.292893 +DEAL::0.00000 -0.500000 0.500000 +DEAL::1.00000 -0.500000 0.500000 +DEAL::0.00000 0.00000 1.00000 +DEAL::0.00000 0.00000 0.292893 +DEAL::1.00000 0.00000 1.00000 +DEAL::1.00000 0.00000 0.292893 +DEAL::Faces on cell with center: 0.500000 6.93889e-18 0.500000 +DEAL::0.500000 0.00000 1.00000 +DEAL::0.500000 0.00000 0.292893 +DEAL::0.00000 0.00000 0.646447 +DEAL::1.00000 0.00000 0.646447 +DEAL::0.500000 0.500000 0.500000 +DEAL::0.500000 -0.500000 0.500000 +DEAL::Center with manifold: 0.500000 -1.66533e-16 0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL:: diff --git a/tests/manifold/transfinite_manifold_02.cc b/tests/manifold/transfinite_manifold_02.cc new file mode 100644 index 0000000000..2e9f7552f9 --- /dev/null +++ b/tests/manifold/transfinite_manifold_02.cc @@ -0,0 +1,161 @@ +//------------------------------------------------------------------- +// Copyright (C) 2017 by the deal.II authors. +// +// This file is subject to LGPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//------------------------------------------------------------------- + + +// Similar to transfinite_manifold_01 but now only setting the transfinite +// manifold on the cells at the boundary, skipping the interior ones + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include + + +template +void do_test(const Triangulation &tria) +{ + for (typename Triangulation::cell_iterator cell = tria.begin(); + cell != tria.end(); ++cell) + { + deallog << "Lines on cell with center: " << cell->center() << std::endl; + for (unsigned int line=0; line::lines_per_cell; ++line) + deallog << cell->line(line)->center(/*respect_manifold=*/true) << std::endl; + deallog << "Faces on cell with center: " << cell->center() << std::endl; + for (unsigned int face=0; face::faces_per_cell; ++face) + deallog << cell->face(face)->center(/*respect_manifold=*/true) << std::endl; + deallog << "Center with manifold: " << cell->center(true) << std::endl; + for (unsigned int face=0; face::faces_per_cell; ++face) + if (cell->at_boundary(face)) + { + std::vector > points; + points.push_back(cell->face(face)->vertex(0)); + points.push_back(cell->face(face)->vertex(1)); + std::vector weights(2); + weights[0] = 0.1; + weights[1] = 0.9; + Point p = cell->get_manifold().get_new_point(points, weights); + Point pref = cell->face(face)->get_manifold().get_new_point(points, weights); + deallog << "Distance between cell manifold and face manifold: " + << (pref-p) << std::endl; + weights[0] = 0.55; + weights[1] = 0.45; + p = cell->get_manifold().get_new_point(points, weights); + pref = cell->face(face)->get_manifold().get_new_point(points, weights); + deallog << "Distance between cell manifold and face manifold: " + << (pref-p) << std::endl; + } + } + deallog << std::endl; +} + +template +void test_polar() +{ + deallog << "Testing with PolarManifold dim=" << dim + << ", spacedim="<< spacedim << std::endl; + + PolarManifold polar_manifold; + TransfiniteInterpolationManifold manifold; + + Triangulation tria; + GridGenerator::hyper_ball (tria); + + // set all cells at the boundary to the transfinite manifold except for the + // boundaries where we put the polar manifold + for (typename Triangulation::active_cell_iterator cell = tria.begin(); + cell != tria.end(); ++cell) + if (cell->at_boundary()) + cell->set_manifold_id(1); + + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold (0, polar_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + do_test(tria); +} + +template +void test_spherical() +{ + deallog << "Testing with SphericalManifold dim=" << dim + << ", spacedim="<< spacedim << std::endl; + + SphericalManifold polar_manifold; + TransfiniteInterpolationManifold manifold; + + Triangulation tria; + GridGenerator::hyper_ball (tria); + + // set all cells at the boundary to the transfinite manifold except for the + // boundaries where we put the polar manifold + for (typename Triangulation::active_cell_iterator cell = tria.begin(); + cell != tria.end(); ++cell) + if (cell->at_boundary()) + cell->set_manifold_id(1); + + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold (0, polar_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + do_test(tria); +} + +void test_cylinder(unsigned int ref=1) +{ + const unsigned int dim=3, spacedim = 3; + deallog << "Testing with CylindricalManifold in 3d" << std::endl; + + CylindricalManifold cylinder_manifold; + TransfiniteInterpolationManifold manifold; + Triangulation tria; + GridGenerator::cylinder (tria); + + for (typename Triangulation::active_cell_iterator + cell=tria.begin_active(); cell!=tria.end(); ++cell) + { + if (cell->at_boundary()) + cell->set_manifold_id(1); + for (unsigned int face=0; face::faces_per_cell; ++face) + if (cell->at_boundary(face)) + { + bool cell_at_surfaces = true; + for (unsigned int i=1; i::vertices_per_face; ++i) + if (std::abs(cell->face(face)->vertex(i)[0] - cell->face(face)->vertex(0)[0]) > 1e-10) + cell_at_surfaces = false; + if (cell_at_surfaces == false) + cell->face(face)->set_all_manifold_ids(0); + } + } + tria.set_manifold (0, cylinder_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + do_test(tria); +} + +int main () +{ + initlog(); + + test_polar<2,2>(); + test_spherical<2,2>(); + test_spherical<3,3>(); + test_cylinder(); + + return 0; +} + diff --git a/tests/manifold/transfinite_manifold_02.output b/tests/manifold/transfinite_manifold_02.output new file mode 100644 index 0000000000..75b400ae87 --- /dev/null +++ b/tests/manifold/transfinite_manifold_02.output @@ -0,0 +1,540 @@ + +DEAL::Testing with PolarManifold dim=2, spacedim=2 +DEAL::Lines on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Faces on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Center with manifold: -9.71445e-17 -0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Faces on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Center with manifold: -0.646447 5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Faces on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Center with manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Center with manifold: 0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Faces on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Center with manifold: 2.77556e-17 0.646447 +DEAL::Distance between cell manifold and face manifold: 2.22045e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: 0.00000 1.11022e-16 +DEAL:: +DEAL::Testing with SphericalManifold dim=2, spacedim=2 +DEAL::Lines on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::0.00000 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Faces on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::0.00000 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Center with manifold: 0.00000 -0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Faces on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Center with manifold: -0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Faces on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Center with manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Center with manifold: 0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -1.38778e-17 0.500000 +DEAL::0.00000 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Faces on cell with center: -1.38778e-17 0.500000 +DEAL::0.00000 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Center with manifold: 0.00000 0.646447 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -2.22045e-16 +DEAL::Distance between cell manifold and face manifold: 6.93889e-17 1.11022e-16 +DEAL:: +DEAL::Testing with SphericalManifold dim=3, spacedim=3 +DEAL::Lines on cell with center: 0.00000 0.00000 -6.93889e-18 +DEAL::-0.211325 0.00000 -0.211325 +DEAL::0.211325 0.00000 -0.211325 +DEAL::0.00000 -0.211325 -0.211325 +DEAL::0.00000 0.211325 -0.211325 +DEAL::-0.211325 0.00000 0.211325 +DEAL::0.211325 0.00000 0.211325 +DEAL::0.00000 -0.211325 0.211325 +DEAL::0.00000 0.211325 0.211325 +DEAL::-0.211325 -0.211325 0.00000 +DEAL::0.211325 -0.211325 0.00000 +DEAL::-0.211325 0.211325 0.00000 +DEAL::0.211325 0.211325 0.00000 +DEAL::Faces on cell with center: 0.00000 0.00000 -6.93889e-18 +DEAL::-0.211325 0.00000 0.00000 +DEAL::0.211325 0.00000 0.00000 +DEAL::0.00000 -0.211325 0.00000 +DEAL::0.00000 0.211325 0.00000 +DEAL::0.00000 0.00000 -0.211325 +DEAL::0.00000 0.00000 0.211325 +DEAL::Center with manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.00000 0.00000 -0.394338 +DEAL::-0.707107 0.00000 -0.707107 +DEAL::0.707107 0.00000 -0.707107 +DEAL::0.00000 -0.707107 -0.707107 +DEAL::0.00000 0.707107 -0.707107 +DEAL::-0.211325 0.00000 -0.211325 +DEAL::0.211325 0.00000 -0.211325 +DEAL::0.00000 -0.211325 -0.211325 +DEAL::0.00000 0.211325 -0.211325 +DEAL::-0.394338 -0.394338 -0.394338 +DEAL::0.394338 -0.394338 -0.394338 +DEAL::-0.394338 0.394338 -0.394338 +DEAL::0.394338 0.394338 -0.394338 +DEAL::Faces on cell with center: 0.00000 0.00000 -0.394338 +DEAL::-0.394338 0.00000 -0.394338 +DEAL::0.394338 0.00000 -0.394338 +DEAL::6.93889e-18 -0.394338 -0.394338 +DEAL::6.93889e-18 0.394338 -0.394338 +DEAL::0.00000 0.00000 -1.00000 +DEAL::0.00000 0.00000 -0.211325 +DEAL::Center with manifold: -1.11022e-16 -1.11022e-16 -0.571260 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -1.11022e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: -1.38778e-17 -1.11022e-16 -1.11022e-16 +DEAL::Lines on cell with center: 0.394338 0.00000 2.08167e-17 +DEAL::0.394338 -0.394338 -0.394338 +DEAL::0.394338 0.394338 -0.394338 +DEAL::0.707107 0.00000 -0.707107 +DEAL::0.211325 0.00000 -0.211325 +DEAL::0.394338 -0.394338 0.394338 +DEAL::0.394338 0.394338 0.394338 +DEAL::0.707107 0.00000 0.707107 +DEAL::0.211325 0.00000 0.211325 +DEAL::0.707107 -0.707107 0.00000 +DEAL::0.707107 0.707107 0.00000 +DEAL::0.211325 -0.211325 0.00000 +DEAL::0.211325 0.211325 0.00000 +DEAL::Faces on cell with center: 0.394338 0.00000 2.08167e-17 +DEAL::0.394338 -0.394338 6.93889e-18 +DEAL::0.394338 0.394338 6.93889e-18 +DEAL::1.00000 0.00000 0.00000 +DEAL::0.211325 0.00000 0.00000 +DEAL::0.394338 0.00000 -0.394338 +DEAL::0.394338 0.00000 0.394338 +DEAL::Center with manifold: 0.571260 2.08167e-17 -5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -1.11022e-16 5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -1.11022e-16 -1.38778e-17 +DEAL::Lines on cell with center: 0.00000 2.08167e-17 0.394338 +DEAL::-0.394338 -0.394338 0.394338 +DEAL::0.394338 -0.394338 0.394338 +DEAL::0.00000 -0.707107 0.707107 +DEAL::0.00000 -0.211325 0.211325 +DEAL::-0.394338 0.394338 0.394338 +DEAL::0.394338 0.394338 0.394338 +DEAL::0.00000 0.707107 0.707107 +DEAL::0.00000 0.211325 0.211325 +DEAL::-0.707107 0.00000 0.707107 +DEAL::0.707107 0.00000 0.707107 +DEAL::-0.211325 0.00000 0.211325 +DEAL::0.211325 0.00000 0.211325 +DEAL::Faces on cell with center: 0.00000 2.08167e-17 0.394338 +DEAL::-0.394338 6.93889e-18 0.394338 +DEAL::0.394338 0.00000 0.394338 +DEAL::0.00000 0.00000 1.00000 +DEAL::0.00000 0.00000 0.211325 +DEAL::0.00000 -0.394338 0.394338 +DEAL::0.00000 0.394338 0.394338 +DEAL::Center with manifold: 2.08167e-17 -5.55112e-17 0.571260 +DEAL::Distance between cell manifold and face manifold: -1.11022e-16 5.55112e-17 1.11022e-16 +DEAL::Distance between cell manifold and face manifold: -1.11022e-16 -1.94289e-16 1.11022e-16 +DEAL::Lines on cell with center: -0.394338 3.46945e-18 1.73472e-17 +DEAL::-0.707107 0.00000 -0.707107 +DEAL::-0.211325 0.00000 -0.211325 +DEAL::-0.394338 -0.394338 -0.394338 +DEAL::-0.394338 0.394338 -0.394338 +DEAL::-0.707107 0.00000 0.707107 +DEAL::-0.211325 0.00000 0.211325 +DEAL::-0.394338 -0.394338 0.394338 +DEAL::-0.394338 0.394338 0.394338 +DEAL::-0.707107 -0.707107 0.00000 +DEAL::-0.211325 -0.211325 0.00000 +DEAL::-0.707107 0.707107 0.00000 +DEAL::-0.211325 0.211325 0.00000 +DEAL::Faces on cell with center: -0.394338 3.46945e-18 1.73472e-17 +DEAL::-1.00000 0.00000 0.00000 +DEAL::-0.211325 0.00000 0.00000 +DEAL::-0.394338 -0.394338 0.00000 +DEAL::-0.394338 0.394338 0.00000 +DEAL::-0.394338 0.00000 -0.394338 +DEAL::-0.394338 6.93889e-18 0.394338 +DEAL::Center with manifold: -0.571260 -3.81639e-17 -1.73472e-17 +DEAL::Distance between cell manifold and face manifold: -1.11022e-16 1.11022e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: -1.11022e-16 -1.38778e-17 -1.11022e-16 +DEAL::Lines on cell with center: 0.00000 -0.394338 2.08167e-17 +DEAL::-0.394338 -0.394338 -0.394338 +DEAL::0.394338 -0.394338 -0.394338 +DEAL::0.00000 -0.707107 -0.707107 +DEAL::0.00000 -0.211325 -0.211325 +DEAL::-0.394338 -0.394338 0.394338 +DEAL::0.394338 -0.394338 0.394338 +DEAL::0.00000 -0.707107 0.707107 +DEAL::0.00000 -0.211325 0.211325 +DEAL::-0.707107 -0.707107 0.00000 +DEAL::0.707107 -0.707107 0.00000 +DEAL::-0.211325 -0.211325 0.00000 +DEAL::0.211325 -0.211325 0.00000 +DEAL::Faces on cell with center: 0.00000 -0.394338 2.08167e-17 +DEAL::-0.394338 -0.394338 0.00000 +DEAL::0.394338 -0.394338 6.93889e-18 +DEAL::0.00000 -1.00000 0.00000 +DEAL::0.00000 -0.211325 0.00000 +DEAL::6.93889e-18 -0.394338 -0.394338 +DEAL::0.00000 -0.394338 0.394338 +DEAL::Center with manifold: 2.08167e-17 -0.571260 -5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 -2.22045e-16 -5.55112e-17 +DEAL::Distance between cell manifold and face manifold: -2.22045e-16 -2.22045e-16 -9.71445e-17 +DEAL::Lines on cell with center: 3.46945e-18 0.394338 1.73472e-17 +DEAL::0.00000 0.707107 -0.707107 +DEAL::0.00000 0.211325 -0.211325 +DEAL::-0.394338 0.394338 -0.394338 +DEAL::0.394338 0.394338 -0.394338 +DEAL::0.00000 0.707107 0.707107 +DEAL::0.00000 0.211325 0.211325 +DEAL::-0.394338 0.394338 0.394338 +DEAL::0.394338 0.394338 0.394338 +DEAL::-0.707107 0.707107 0.00000 +DEAL::-0.211325 0.211325 0.00000 +DEAL::0.707107 0.707107 0.00000 +DEAL::0.211325 0.211325 0.00000 +DEAL::Faces on cell with center: 3.46945e-18 0.394338 1.73472e-17 +DEAL::0.00000 1.00000 0.00000 +DEAL::0.00000 0.211325 0.00000 +DEAL::-0.394338 0.394338 0.00000 +DEAL::0.394338 0.394338 6.93889e-18 +DEAL::6.93889e-18 0.394338 -0.394338 +DEAL::0.00000 0.394338 0.394338 +DEAL::Center with manifold: -3.81639e-17 0.571260 -1.73472e-17 +DEAL::Distance between cell manifold and face manifold: 1.11022e-16 1.11022e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: -1.38778e-17 1.11022e-16 -1.11022e-16 +DEAL:: +DEAL::Testing with CylindricalManifold in 3d +DEAL::Lines on cell with center: -0.500000 0.00000 -0.500000 +DEAL::-0.500000 0.707107 -0.707107 +DEAL::-0.500000 -0.707107 -0.707107 +DEAL::-1.00000 0.00000 -1.00000 +DEAL::0.00000 0.00000 -1.00000 +DEAL::-0.500000 0.292893 -0.292893 +DEAL::-0.500000 -0.292893 -0.292893 +DEAL::-1.00000 0.00000 -0.292893 +DEAL::0.00000 0.00000 -0.292893 +DEAL::-1.00000 0.500000 -0.500000 +DEAL::-1.00000 -0.500000 -0.500000 +DEAL::0.00000 0.500000 -0.500000 +DEAL::0.00000 -0.500000 -0.500000 +DEAL::Faces on cell with center: -0.500000 0.00000 -0.500000 +DEAL::-0.500000 0.500000 -0.500000 +DEAL::-0.500000 -0.500000 -0.500000 +DEAL::-1.00000 0.00000 -0.646447 +DEAL::0.00000 0.00000 -0.500000 +DEAL::-0.500000 0.00000 -1.00000 +DEAL::-0.500000 0.00000 -0.292893 +DEAL::Center with manifold: -0.500000 0.00000 -0.634243 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 0.500000 -6.93889e-18 +DEAL::-0.500000 0.707107 -0.707107 +DEAL::-0.500000 0.292893 -0.292893 +DEAL::-1.00000 0.500000 -0.500000 +DEAL::0.00000 0.500000 -0.500000 +DEAL::-0.500000 0.707107 0.707107 +DEAL::-0.500000 0.292893 0.292893 +DEAL::-1.00000 0.500000 0.500000 +DEAL::0.00000 0.500000 0.500000 +DEAL::-1.00000 1.00000 0.00000 +DEAL::-1.00000 0.292893 0.00000 +DEAL::0.00000 1.00000 0.00000 +DEAL::0.00000 0.292893 0.00000 +DEAL::Faces on cell with center: -0.500000 0.500000 -6.93889e-18 +DEAL::-0.500000 1.00000 0.00000 +DEAL::-0.500000 0.292893 0.00000 +DEAL::-1.00000 0.646447 0.00000 +DEAL::0.00000 0.500000 0.00000 +DEAL::-0.500000 0.500000 -0.500000 +DEAL::-0.500000 0.500000 0.500000 +DEAL::Center with manifold: -0.500000 0.634243 1.66533e-16 +DEAL::Distance between cell manifold and face manifold: -2.77556e-17 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 0.00000 1.38778e-17 +DEAL::-0.500000 0.292893 -0.292893 +DEAL::-0.500000 -0.292893 -0.292893 +DEAL::-1.00000 0.00000 -0.292893 +DEAL::0.00000 0.00000 -0.292893 +DEAL::-0.500000 0.292893 0.292893 +DEAL::-0.500000 -0.292893 0.292893 +DEAL::-1.00000 0.00000 0.292893 +DEAL::0.00000 0.00000 0.292893 +DEAL::-1.00000 0.292893 0.00000 +DEAL::-1.00000 -0.292893 0.00000 +DEAL::0.00000 0.292893 0.00000 +DEAL::0.00000 -0.292893 0.00000 +DEAL::Faces on cell with center: -0.500000 0.00000 1.38778e-17 +DEAL::-0.500000 0.292893 0.00000 +DEAL::-0.500000 -0.292893 0.00000 +DEAL::-1.00000 0.00000 0.00000 +DEAL::0.00000 0.00000 0.00000 +DEAL::-0.500000 0.00000 -0.292893 +DEAL::-0.500000 0.00000 0.292893 +DEAL::Center with manifold: -0.500000 0.00000 6.93889e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 -0.500000 0.00000 +DEAL::-0.500000 -0.707107 -0.707107 +DEAL::-0.500000 -0.707107 0.707107 +DEAL::-1.00000 -1.00000 0.00000 +DEAL::0.00000 -1.00000 0.00000 +DEAL::-0.500000 -0.292893 -0.292893 +DEAL::-0.500000 -0.292893 0.292893 +DEAL::-1.00000 -0.292893 0.00000 +DEAL::0.00000 -0.292893 0.00000 +DEAL::-1.00000 -0.500000 -0.500000 +DEAL::-1.00000 -0.500000 0.500000 +DEAL::0.00000 -0.500000 -0.500000 +DEAL::0.00000 -0.500000 0.500000 +DEAL::Faces on cell with center: -0.500000 -0.500000 0.00000 +DEAL::-0.500000 -0.500000 -0.500000 +DEAL::-0.500000 -0.500000 0.500000 +DEAL::-1.00000 -0.646447 0.00000 +DEAL::0.00000 -0.500000 0.00000 +DEAL::-0.500000 -1.00000 0.00000 +DEAL::-0.500000 -0.292893 0.00000 +DEAL::Center with manifold: -0.500000 -0.634243 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 6.93889e-18 0.500000 +DEAL::-0.500000 0.707107 0.707107 +DEAL::-0.500000 0.292893 0.292893 +DEAL::-1.00000 0.500000 0.500000 +DEAL::0.00000 0.500000 0.500000 +DEAL::-0.500000 -0.707107 0.707107 +DEAL::-0.500000 -0.292893 0.292893 +DEAL::-1.00000 -0.500000 0.500000 +DEAL::0.00000 -0.500000 0.500000 +DEAL::-1.00000 0.00000 1.00000 +DEAL::-1.00000 0.00000 0.292893 +DEAL::0.00000 0.00000 1.00000 +DEAL::0.00000 0.00000 0.292893 +DEAL::Faces on cell with center: -0.500000 6.93889e-18 0.500000 +DEAL::-0.500000 0.00000 1.00000 +DEAL::-0.500000 0.00000 0.292893 +DEAL::-1.00000 0.00000 0.646447 +DEAL::0.00000 0.00000 0.500000 +DEAL::-0.500000 0.500000 0.500000 +DEAL::-0.500000 -0.500000 0.500000 +DEAL::Center with manifold: -0.500000 -1.66533e-16 0.634243 +DEAL::Distance between cell manifold and face manifold: -2.77556e-17 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 -0.500000 +DEAL::0.500000 0.707107 -0.707107 +DEAL::0.500000 -0.707107 -0.707107 +DEAL::0.00000 0.00000 -1.00000 +DEAL::1.00000 0.00000 -1.00000 +DEAL::0.500000 0.292893 -0.292893 +DEAL::0.500000 -0.292893 -0.292893 +DEAL::0.00000 0.00000 -0.292893 +DEAL::1.00000 0.00000 -0.292893 +DEAL::0.00000 0.500000 -0.500000 +DEAL::0.00000 -0.500000 -0.500000 +DEAL::1.00000 0.500000 -0.500000 +DEAL::1.00000 -0.500000 -0.500000 +DEAL::Faces on cell with center: 0.500000 0.00000 -0.500000 +DEAL::0.500000 0.500000 -0.500000 +DEAL::0.500000 -0.500000 -0.500000 +DEAL::0.00000 0.00000 -0.500000 +DEAL::1.00000 0.00000 -0.500000 +DEAL::0.500000 0.00000 -1.00000 +DEAL::0.500000 0.00000 -0.292893 +DEAL::Center with manifold: 0.500000 0.00000 -0.622039 +DEAL::Distance between cell manifold and face manifold: 0.00000 5.55112e-17 -5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.500000 -6.93889e-18 +DEAL::0.500000 0.707107 -0.707107 +DEAL::0.500000 0.292893 -0.292893 +DEAL::0.00000 0.500000 -0.500000 +DEAL::1.00000 0.500000 -0.500000 +DEAL::0.500000 0.707107 0.707107 +DEAL::0.500000 0.292893 0.292893 +DEAL::0.00000 0.500000 0.500000 +DEAL::1.00000 0.500000 0.500000 +DEAL::0.00000 1.00000 0.00000 +DEAL::0.00000 0.292893 0.00000 +DEAL::1.00000 1.00000 0.00000 +DEAL::1.00000 0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.500000 -6.93889e-18 +DEAL::0.500000 1.00000 0.00000 +DEAL::0.500000 0.292893 0.00000 +DEAL::0.00000 0.500000 0.00000 +DEAL::1.00000 0.500000 0.00000 +DEAL::0.500000 0.500000 -0.500000 +DEAL::0.500000 0.500000 0.500000 +DEAL::Center with manifold: 0.500000 0.622039 1.52656e-16 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 -0.0737620 -0.0590096 +DEAL::Distance between cell manifold and face manifold: 0.00000 -0.287930 0.0287930 +DEAL::Lines on cell with center: 0.500000 0.00000 1.38778e-17 +DEAL::0.500000 0.292893 -0.292893 +DEAL::0.500000 -0.292893 -0.292893 +DEAL::0.00000 0.00000 -0.292893 +DEAL::1.00000 0.00000 -0.292893 +DEAL::0.500000 0.292893 0.292893 +DEAL::0.500000 -0.292893 0.292893 +DEAL::0.00000 0.00000 0.292893 +DEAL::1.00000 0.00000 0.292893 +DEAL::0.00000 0.292893 0.00000 +DEAL::0.00000 -0.292893 0.00000 +DEAL::1.00000 0.292893 0.00000 +DEAL::1.00000 -0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.00000 1.38778e-17 +DEAL::0.500000 0.292893 0.00000 +DEAL::0.500000 -0.292893 0.00000 +DEAL::0.00000 0.00000 0.00000 +DEAL::1.00000 0.00000 0.00000 +DEAL::0.500000 0.00000 -0.292893 +DEAL::0.500000 0.00000 0.292893 +DEAL::Center with manifold: 0.500000 0.00000 6.93889e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 -0.500000 0.00000 +DEAL::0.500000 -0.707107 -0.707107 +DEAL::0.500000 -0.707107 0.707107 +DEAL::0.00000 -1.00000 0.00000 +DEAL::1.00000 -1.00000 0.00000 +DEAL::0.500000 -0.292893 -0.292893 +DEAL::0.500000 -0.292893 0.292893 +DEAL::0.00000 -0.292893 0.00000 +DEAL::1.00000 -0.292893 0.00000 +DEAL::0.00000 -0.500000 -0.500000 +DEAL::0.00000 -0.500000 0.500000 +DEAL::1.00000 -0.500000 -0.500000 +DEAL::1.00000 -0.500000 0.500000 +DEAL::Faces on cell with center: 0.500000 -0.500000 0.00000 +DEAL::0.500000 -0.500000 -0.500000 +DEAL::0.500000 -0.500000 0.500000 +DEAL::0.00000 -0.500000 0.00000 +DEAL::1.00000 -0.500000 0.00000 +DEAL::0.500000 -1.00000 0.00000 +DEAL::0.500000 -0.292893 0.00000 +DEAL::Center with manifold: 0.500000 -0.622039 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 -5.55112e-17 -5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 6.93889e-18 0.500000 +DEAL::0.500000 0.707107 0.707107 +DEAL::0.500000 0.292893 0.292893 +DEAL::0.00000 0.500000 0.500000 +DEAL::1.00000 0.500000 0.500000 +DEAL::0.500000 -0.707107 0.707107 +DEAL::0.500000 -0.292893 0.292893 +DEAL::0.00000 -0.500000 0.500000 +DEAL::1.00000 -0.500000 0.500000 +DEAL::0.00000 0.00000 1.00000 +DEAL::0.00000 0.00000 0.292893 +DEAL::1.00000 0.00000 1.00000 +DEAL::1.00000 0.00000 0.292893 +DEAL::Faces on cell with center: 0.500000 6.93889e-18 0.500000 +DEAL::0.500000 0.00000 1.00000 +DEAL::0.500000 0.00000 0.292893 +DEAL::0.00000 0.00000 0.500000 +DEAL::1.00000 0.00000 0.500000 +DEAL::0.500000 0.500000 0.500000 +DEAL::0.500000 -0.500000 0.500000 +DEAL::Center with manifold: 0.500000 -1.52656e-16 0.622039 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.0590096 -0.0737620 +DEAL::Distance between cell manifold and face manifold: 0.00000 -0.0287930 -0.287930 +DEAL:: diff --git a/tests/manifold/transfinite_manifold_03.cc b/tests/manifold/transfinite_manifold_03.cc new file mode 100644 index 0000000000..a101c1675b --- /dev/null +++ b/tests/manifold/transfinite_manifold_03.cc @@ -0,0 +1,143 @@ +//------------------------------------------------------------------- +// Copyright (C) 2017 by the deal.II authors. +// +// This file is subject to LGPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//------------------------------------------------------------------- + + +// Similar to transfinite_manifold_01 but now applying a MappingQGeneric and +// computing some areas + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +template +void do_test(const Triangulation &tria) +{ + for (unsigned int degree = 1; degree < 5; ++degree) + { + MappingQGeneric mapping(degree); + FE_Nothing fe; + QGauss gauss(degree+1); + FEValues fe_values(mapping, fe, gauss, update_JxW_values); + double volume = 0; + for (typename Triangulation::cell_iterator cell = tria.begin_active(); + cell != tria.end(); ++cell) + { + fe_values.reinit(cell); + for (unsigned int q=0; q +void test_polar() +{ + deallog << "Testing with PolarManifold dim=" << dim + << ", spacedim="<< spacedim << std::endl; + + PolarManifold polar_manifold; + TransfiniteInterpolationManifold manifold; + + Triangulation tria; + GridGenerator::hyper_ball (tria); + + tria.set_all_manifold_ids(1); + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold (0, polar_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + tria.refine_global(2); + + do_test(tria); +} + +template +void test_spherical() +{ + deallog << "Testing with SphericalManifold dim=" << dim + << ", spacedim="<< spacedim << std::endl; + + SphericalManifold spherical_manifold; + TransfiniteInterpolationManifold manifold; + + Triangulation tria; + GridGenerator::hyper_ball (tria); + + tria.set_all_manifold_ids(1); + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold (0, spherical_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + tria.refine_global(4-dim); + + do_test(tria); +} + +void test_cylinder(unsigned int ref=1) +{ + const unsigned int dim=3, spacedim = 3; + deallog << "Testing with CylindricalManifold in 3d" << std::endl; + + CylindricalManifold cylinder_manifold; + TransfiniteInterpolationManifold manifold; + Triangulation tria; + GridGenerator::cylinder (tria); + + tria.set_all_manifold_ids(1); + for (typename Triangulation::active_cell_iterator + cell=tria.begin_active(); cell!=tria.end(); ++cell) + { + for (unsigned int face=0; face::faces_per_cell; ++face) + if (cell->at_boundary(face)) + { + bool cell_at_surfaces = true; + for (unsigned int i=1; i::vertices_per_face; ++i) + if (std::abs(cell->face(face)->vertex(i)[0] - cell->face(face)->vertex(0)[0]) > 1e-10) + cell_at_surfaces = false; + if (cell_at_surfaces == false) + cell->face(face)->set_all_manifold_ids(0); + } + } + tria.set_manifold (0, cylinder_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + tria.refine_global(1); + + do_test(tria); +} + +int main () +{ + initlog(); + + test_polar<2,2>(); + test_spherical<2,2>(); + test_spherical<3,3>(); + test_cylinder(); + + return 0; +} + diff --git a/tests/manifold/transfinite_manifold_03.output b/tests/manifold/transfinite_manifold_03.output new file mode 100644 index 0000000000..afd60ee953 --- /dev/null +++ b/tests/manifold/transfinite_manifold_03.output @@ -0,0 +1,25 @@ + +DEAL::Testing with PolarManifold dim=2, spacedim=2 +DEAL::80 cells, degree=1: 3.06146745892 +DEAL::80 cells, degree=2: 3.14143771670 +DEAL::80 cells, degree=3: 3.14159250174 +DEAL::80 cells, degree=4: 3.14159265350 +DEAL:: +DEAL::Testing with SphericalManifold dim=2, spacedim=2 +DEAL::80 cells, degree=1: 3.06146745892 +DEAL::80 cells, degree=2: 3.14143771670 +DEAL::80 cells, degree=3: 3.14158706712 +DEAL::80 cells, degree=4: 3.14159263998 +DEAL:: +DEAL::Testing with SphericalManifold dim=3, spacedim=3 +DEAL::56 cells, degree=1: 3.21034343105 +DEAL::56 cells, degree=2: 4.18080434784 +DEAL::56 cells, degree=3: 4.18759484733 +DEAL::56 cells, degree=4: 4.18877458327 +DEAL:: +DEAL::Testing with CylindricalManifold in 3d +DEAL::80 cells, degree=1: 5.65685424949 +DEAL::80 cells, degree=2: 6.27829514062 +DEAL::80 cells, degree=3: 6.28283288022 +DEAL::80 cells, degree=4: 6.28318111226 +DEAL:: diff --git a/tests/manifold/transfinite_manifold_04.cc b/tests/manifold/transfinite_manifold_04.cc new file mode 100644 index 0000000000..c58ce664a9 --- /dev/null +++ b/tests/manifold/transfinite_manifold_04.cc @@ -0,0 +1,124 @@ +//------------------------------------------------------------------- +// Copyright (C) 2017 by the deal.II authors. +// +// This file is subject to LGPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//------------------------------------------------------------------- + + +// Test that clearing a triangulation is behaving correctly for the transfinite +// interpolation on a test that is similar to transfinite_manifold_01.cc + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include + + +template +void do_test(const Triangulation &tria) +{ + for (typename Triangulation::cell_iterator cell = tria.begin(); + cell != tria.end(); ++cell) + { + deallog << "Lines on cell with center: " << cell->center() << std::endl; + for (unsigned int line=0; line::lines_per_cell; ++line) + deallog << cell->line(line)->center(/*respect_manifold=*/true) << std::endl; + deallog << "Faces on cell with center: " << cell->center() << std::endl; + for (unsigned int face=0; face::faces_per_cell; ++face) + deallog << cell->face(face)->center(/*respect_manifold=*/true) << std::endl; + deallog << "Center with manifold: " << cell->center(true) << std::endl; + for (unsigned int face=0; face::faces_per_cell; ++face) + if (cell->at_boundary(face)) + { + std::vector > points; + points.push_back(cell->face(face)->vertex(0)); + points.push_back(cell->face(face)->vertex(1)); + std::vector weights(2); + weights[0] = 0.1; + weights[1] = 0.9; + Point p = cell->get_manifold().get_new_point(points, weights); + Point pref = cell->face(face)->get_manifold().get_new_point(points, weights); + deallog << "Distance between cell manifold and face manifold: " + << (pref-p) << std::endl; + weights[0] = 0.55; + weights[1] = 0.45; + p = cell->get_manifold().get_new_point(points, weights); + pref = cell->face(face)->get_manifold().get_new_point(points, weights); + deallog << "Distance between cell manifold and face manifold: " + << (pref-p) << std::endl; + } + } + deallog << std::endl; +} + +template +void test_polar() +{ + deallog << "Testing with PolarManifold dim=" << dim + << ", spacedim="<< spacedim << std::endl; + + PolarManifold polar_manifold; + TransfiniteInterpolationManifold manifold; + + { + Triangulation tria; + GridGenerator::hyper_ball (tria); + + // set all entities to the transfinite manifold except for the boundary where + // we put the polar manifold + tria.set_all_manifold_ids(1); + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold (0, polar_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + do_test(tria); + + // clear the triangulation, set up a similar problem again and check that it + // is sane. + tria.clear(); + GridGenerator::hyper_ball (tria); + tria.set_all_manifold_ids(1); + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold (0, polar_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + do_test(tria); + } + { + Triangulation tria; + GridGenerator::hyper_ball (tria); + + // set all entities to the transfinite manifold except for the boundary where + // we put the polar manifold + tria.set_all_manifold_ids(1); + tria.set_all_manifold_ids_on_boundary(0); + tria.set_manifold (0, polar_manifold); + manifold.initialize(tria); + tria.set_manifold (1, manifold); + + do_test(tria); + } +} + + +int main () +{ + initlog(); + + test_polar<2,2>(); + + return 0; +} + + diff --git a/tests/manifold/transfinite_manifold_04.output b/tests/manifold/transfinite_manifold_04.output new file mode 100644 index 0000000000..9679a2bad1 --- /dev/null +++ b/tests/manifold/transfinite_manifold_04.output @@ -0,0 +1,194 @@ + +DEAL::Testing with PolarManifold dim=2, spacedim=2 +DEAL::Lines on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Faces on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Center with manifold: -9.71445e-17 -0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Faces on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Center with manifold: -0.646447 5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Faces on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Center with manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Center with manifold: 0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Faces on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Center with manifold: 2.77556e-17 0.646447 +DEAL::Distance between cell manifold and face manifold: 2.22045e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: 0.00000 1.11022e-16 +DEAL:: +DEAL::Lines on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Faces on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Center with manifold: -9.71445e-17 -0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Faces on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Center with manifold: -0.646447 5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Faces on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Center with manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Center with manifold: 0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Faces on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Center with manifold: 2.77556e-17 0.646447 +DEAL::Distance between cell manifold and face manifold: 2.22045e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: 0.00000 1.11022e-16 +DEAL:: +DEAL::Lines on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Faces on cell with center: 0.00000 -0.500000 +DEAL::-0.500000 -0.500000 +DEAL::0.500000 -0.500000 +DEAL::-1.83697e-16 -1.00000 +DEAL::0.00000 -0.292893 +DEAL::Center with manifold: -9.71445e-17 -0.646447 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Faces on cell with center: -0.500000 -1.38778e-17 +DEAL::-1.00000 1.22465e-16 +DEAL::-0.292893 0.00000 +DEAL::-0.500000 -0.500000 +DEAL::-0.500000 0.500000 +DEAL::Center with manifold: -0.646447 5.55112e-17 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Faces on cell with center: 0.00000 0.00000 +DEAL::-0.292893 0.00000 +DEAL::0.292893 0.00000 +DEAL::0.00000 -0.292893 +DEAL::0.00000 0.292893 +DEAL::Center with manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Faces on cell with center: 0.500000 0.00000 +DEAL::0.500000 -0.500000 +DEAL::0.500000 0.500000 +DEAL::1.00000 0.00000 +DEAL::0.292893 0.00000 +DEAL::Center with manifold: 0.646447 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Distance between cell manifold and face manifold: 0.00000 0.00000 +DEAL::Lines on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Faces on cell with center: -1.38778e-17 0.500000 +DEAL::6.12323e-17 1.00000 +DEAL::0.00000 0.292893 +DEAL::-0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::Center with manifold: 2.77556e-17 0.646447 +DEAL::Distance between cell manifold and face manifold: 2.22045e-16 -1.11022e-16 +DEAL::Distance between cell manifold and face manifold: 0.00000 1.11022e-16 +DEAL:: -- 2.39.5