33#include <boost/archive/binary_oarchive.hpp>
35#ifdef DEAL_II_GMSH_WITH_API
54 const bool write_faces,
55 const bool write_diameter,
56 const bool write_measure,
57 const bool write_all_faces)
58 : write_cells(write_cells)
59 , write_faces(write_faces)
60 , write_diameter(write_diameter)
61 , write_measure(write_measure)
62 , write_all_faces(write_all_faces)
71 "Write the mesh connectivity as DX grid cells");
75 "Write faces of cells. These may be boundary faces "
76 "or all faces between mesh cells, according to "
77 "\"Write all faces\"");
81 "If cells are written, additionally write their"
82 " diameter as data for visualization");
86 "Write the volume of each cell as data");
90 "Write all faces, not only boundary");
104 Msh::Msh(
const bool write_faces,
const bool write_lines)
105 : write_faces(write_faces)
106 , write_lines(write_lines)
126 const bool write_faces,
127 const bool write_lines)
128 : write_preamble(write_preamble)
129 , write_faces(write_faces)
130 , write_lines(write_lines)
155 const unsigned int n_extra_curved_line_points,
156 const bool curved_inner_cells,
157 const bool write_additional_boundary_lines)
158 : write_cell_numbers(write_cell_numbers)
159 , n_extra_curved_line_points(n_extra_curved_line_points)
160 , curved_inner_cells(curved_inner_cells)
161 , write_additional_boundary_lines(write_additional_boundary_lines)
183 const unsigned int size,
184 const double line_width,
185 const bool color_lines_on_user_flag,
186 const unsigned int n_boundary_face_points,
187 const bool color_lines_level)
188 : size_type(size_type)
190 , line_width(line_width)
191 , color_lines_on_user_flag(color_lines_on_user_flag)
192 , n_boundary_face_points(n_boundary_face_points)
193 , color_lines_level(color_lines_level)
203 "Depending on this parameter, either the "
205 "of the eps is scaled to \"Size\"");
209 "Size of the output in points");
213 "Width of the lines drawn in points");
217 "Draw lines with user flag set in different color");
221 "Number of points on boundary edges. "
222 "Increase this beyond 2 to see curved boundaries.");
226 "Draw different colors according to grid level.");
233 if (param.
get(
"Size by") ==
"width")
235 else if (param.
get(
"Size by") ==
"height")
247 const unsigned int size,
248 const double line_width,
249 const bool color_lines_on_user_flag,
250 const unsigned int n_boundary_face_points)
254 color_lines_on_user_flag,
255 n_boundary_face_points)
273 const unsigned int size,
274 const double line_width,
275 const bool color_lines_on_user_flag,
276 const unsigned int n_boundary_face_points,
277 const bool write_cell_numbers,
278 const bool write_cell_number_level,
279 const bool write_vertex_numbers,
280 const bool color_lines_level)
284 color_lines_on_user_flag,
285 n_boundary_face_points,
287 , write_cell_numbers(write_cell_numbers)
288 , write_cell_number_level(write_cell_number_level)
289 , write_vertex_numbers(write_vertex_numbers)
299 "(2d only) Write cell numbers"
300 " into the centers of cells");
304 "(2d only) if \"Cell number\" is true, write "
305 "numbers in the form level.number");
309 "Write numbers for each vertex");
317 write_cell_numbers = param.
get_bool(
"Cell number");
318 write_cell_number_level = param.
get_bool(
"Level number");
319 write_vertex_numbers = param.
get_bool(
"Vertex number");
325 const unsigned int size,
326 const double line_width,
327 const bool color_lines_on_user_flag,
328 const unsigned int n_boundary_face_points,
329 const double azimut_angle,
330 const double turn_angle)
334 color_lines_on_user_flag,
335 n_boundary_face_points)
336 , azimut_angle(azimut_angle)
337 , turn_angle(turn_angle)
347 "Azimuth of the view point, that is, the angle "
348 "in the plane from the x-axis.");
352 "Elevation of the view point above the xy-plane.");
360 azimut_angle = 90 - param.
get_double(
"Elevation");
367 : draw_boundary(true)
368 , color_by(material_id)
370 , n_boundary_face_points(0)
376 , boundary_thickness(3)
410 const unsigned int boundary_line_thickness,
413 const int azimuth_angle,
414 const int polar_angle,
416 const bool convert_level_number_to_height,
417 const bool label_level_number,
418 const bool label_cell_index,
419 const bool label_material_id,
420 const bool label_subdomain_id,
421 const bool draw_colorbar,
422 const bool draw_legend,
423 const bool label_boundary_id)
426 , line_thickness(line_thickness)
427 , boundary_line_thickness(boundary_line_thickness)
429 , background(background)
430 , azimuth_angle(azimuth_angle)
431 , polar_angle(polar_angle)
433 , convert_level_number_to_height(convert_level_number_to_height)
434 , level_height_factor(0.3f)
435 , cell_font_scaling(1.f)
436 , label_level_number(label_level_number)
437 , label_cell_index(label_cell_index)
438 , label_material_id(label_material_id)
439 , label_subdomain_id(label_subdomain_id)
440 , label_level_subdomain_id(false)
441 , label_boundary_id(label_boundary_id)
442 , draw_colorbar(draw_colorbar)
443 , draw_legend(draw_legend)
447 : draw_bounding_box(false)
466 : default_format(none)
560 switch (output_format)
603 if (format_name ==
"none" || format_name ==
"false")
606 if (format_name ==
"dx")
609 if (format_name ==
"ucd")
612 if (format_name ==
"gnuplot")
615 if (format_name ==
"eps")
618 if (format_name ==
"xfig")
621 if (format_name ==
"msh")
624 if (format_name ==
"svg")
627 if (format_name ==
"mathgl")
630 if (format_name ==
"vtk")
633 if (format_name ==
"vtu")
646 return "none|dx|gnuplot|eps|ucd|xfig|msh|svg|mathgl|vtk|vtu";
779template <
int dim,
int spacedim>
782 std::ostream &out)
const
788 const std::vector<Point<spacedim>> &vertices = tria.
get_vertices();
798 std::vector<unsigned int> renumber(vertices.size());
801 unsigned int new_number = 0;
802 for (
unsigned int i = 0; i < vertices.size(); ++i)
804 renumber[i] = new_number++;
808 out <<
"object \"vertices\" class array type float rank 1 shape " << dim
809 <<
" items " << n_vertices <<
" data follows" <<
'\n';
811 for (
unsigned int i = 0; i < vertices.size(); ++i)
813 out <<
'\t' << vertices[i] <<
'\n';
820 const unsigned int n_faces =
828 out <<
"object \"cells\" class array type int rank 1 shape "
829 << n_vertices_per_cell <<
" items " << n_cells <<
" data follows"
840 out <<
"attribute \"element type\" string \"";
848 <<
"attribute \"ref\" string \"positions\"" <<
'\n'
853 out <<
"object \"material\" class array type int rank 0 items " << n_cells
854 <<
" data follows" <<
'\n';
856 out <<
' ' << cell->material_id();
857 out <<
'\n' <<
"attribute \"dep\" string \"connections\"" <<
'\n' <<
'\n';
859 out <<
"object \"level\" class array type int rank 0 items " << n_cells
860 <<
" data follows" <<
'\n';
862 out <<
' ' << cell->level();
863 out <<
'\n' <<
"attribute \"dep\" string \"connections\"" <<
'\n' <<
'\n';
867 out <<
"object \"measure\" class array type float rank 0 items "
868 << n_cells <<
" data follows" <<
'\n';
870 out <<
'\t' << cell->measure();
872 <<
"attribute \"dep\" string \"connections\"" <<
'\n'
878 out <<
"object \"diameter\" class array type float rank 0 items "
879 << n_cells <<
" data follows" <<
'\n';
881 out <<
'\t' << cell->diameter();
883 <<
"attribute \"dep\" string \"connections\"" <<
'\n'
890 out <<
"object \"faces\" class array type int rank 1 shape "
891 << n_vertices_per_face <<
" items " << n_faces <<
" data follows"
896 for (
const unsigned int f : cell->face_indices())
901 for (
unsigned int v = 0; v < GeometryInfo<dim>::vertices_per_face;
904 << renumber[face->vertex_index(
909 out <<
"attribute \"element type\" string \"";
915 <<
"attribute \"ref\" string \"positions\"" <<
'\n'
921 out <<
"object \"boundary\" class array type int rank 0 items " << n_faces
922 <<
" data follows" <<
'\n';
929 <<
static_cast<std::make_signed_t<types::boundary_id>
>(
930 cell->face(f)->boundary_id());
934 out <<
"attribute \"dep\" string \"connections\"" <<
'\n' <<
'\n';
938 out <<
"object \"face measure\" class array type float rank 0 items "
939 << n_faces <<
" data follows" <<
'\n';
943 out <<
' ' << cell->face(f)->measure();
946 out <<
"attribute \"dep\" string \"connections\"" <<
'\n' <<
'\n';
951 out <<
"object \"face diameter\" class array type float rank 0 items "
952 << n_faces <<
" data follows" <<
'\n';
956 out <<
' ' << cell->face(f)->diameter();
959 out <<
"attribute \"dep\" string \"connections\"" <<
'\n' <<
'\n';
974 out <<
"object \"deal data\" class field" <<
'\n'
975 <<
"component \"positions\" value \"vertices\"" <<
'\n'
976 <<
"component \"connections\" value \"cells\"" <<
'\n';
980 out <<
"object \"cell data\" class field" <<
'\n'
981 <<
"component \"positions\" value \"vertices\"" <<
'\n'
982 <<
"component \"connections\" value \"cells\"" <<
'\n';
983 out <<
"component \"material\" value \"material\"" <<
'\n';
984 out <<
"component \"level\" value \"level\"" <<
'\n';
986 out <<
"component \"measure\" value \"measure\"" <<
'\n';
988 out <<
"component \"diameter\" value \"diameter\"" <<
'\n';
993 out <<
"object \"face data\" class field" <<
'\n'
994 <<
"component \"positions\" value \"vertices\"" <<
'\n'
995 <<
"component \"connections\" value \"faces\"" <<
'\n';
996 out <<
"component \"boundary\" value \"boundary\"" <<
'\n';
998 out <<
"component \"measure\" value \"face measure\"" <<
'\n';
1000 out <<
"component \"diameter\" value \"face diameter\"" <<
'\n';
1003 out <<
'\n' <<
"object \"grid data\" class group" <<
'\n';
1005 out <<
"member \"cells\" value \"cell data\"" <<
'\n';
1007 out <<
"member \"faces\" value \"face data\"" <<
'\n';
1008 out <<
"end" <<
'\n';
1019template <
int dim,
int spacedim>
1022 std::ostream &out)
const
1029 const std::vector<Point<spacedim>> &vertices = tria.
get_vertices();
1050 out <<
"@f$NOD" <<
'\n' << n_vertices <<
'\n';
1055 for (
unsigned int i = 0; i < vertices.size(); ++i)
1059 <<
" " << vertices[i];
1060 for (
unsigned int d = spacedim + 1; d <= 3; ++d)
1066 out <<
"@f$ENDNOD" <<
'\n'
1073 static constexpr std::array<unsigned int, 8> local_vertex_numbering = {
1074 {0, 1, 5, 4, 2, 3, 7, 6}};
1080 out << cell->active_cell_index() + 1 <<
' '
1081 << cell->reference_cell().gmsh_element_type() <<
' '
1082 << cell->material_id() <<
' ' << cell->subdomain_id() <<
' '
1083 << cell->n_vertices() <<
' ';
1087 for (
const unsigned int vertex : cell->vertex_indices())
1089 if (cell->reference_cell() == ReferenceCells::get_hypercube<dim>())
1090 out << cell->vertex_index(
1091 dim == 3 ? local_vertex_numbering[vertex] :
1095 else if (cell->reference_cell() == ReferenceCells::get_simplex<dim>())
1096 out << cell->vertex_index(vertex) + 1 <<
' ';
1114 out <<
"@f$ENDELM\n";
1124template <
int dim,
int spacedim>
1127 std::ostream &out)
const
1134 const std::vector<Point<spacedim>> &vertices = tria.
get_vertices();
1145 std::time_t time1 = std::time(
nullptr);
1146 std::tm *time = std::localtime(&time1);
1148 <<
"# This file was generated by the deal.II library." <<
'\n'
1149 <<
"# Date = " << time->tm_year + 1900 <<
"/" << time->tm_mon + 1
1150 <<
"/" << time->tm_mday <<
'\n'
1151 <<
"# Time = " << time->tm_hour <<
":" << std::setw(2) << time->tm_min
1152 <<
":" << std::setw(2) << time->tm_sec <<
'\n'
1154 <<
"# For a description of the UCD format see the AVS Developer's guide."
1160 out << n_vertices <<
' '
1170 for (
unsigned int i = 0; i < vertices.size(); ++i)
1174 <<
" " << vertices[i];
1175 for (
unsigned int d = spacedim + 1; d <= 3; ++d)
1184 out << cell->active_cell_index() + 1 <<
' ' << cell->material_id() <<
' ';
1241template <
int dim,
int spacedim>
1259 const int spacedim = 2;
1265 out <<
"#FIG 3.2\nLandscape\nCenter\nInches" << std::endl
1266 <<
"A4\n100.00\nSingle"
1269 <<
"-3" << std::endl
1270 <<
"# generated by deal.II GridOut class" << std::endl
1271 <<
"# reduce first number to scale up image" << std::endl
1272 <<
"1200 2" << std::endl;
1275 unsigned int colno = 32;
1276 out <<
"0 " << colno++ <<
" #ff0000" << std::endl;
1277 out <<
"0 " << colno++ <<
" #ff8000" << std::endl;
1278 out <<
"0 " << colno++ <<
" #ffd000" << std::endl;
1279 out <<
"0 " << colno++ <<
" #ffff00" << std::endl;
1280 out <<
"0 " << colno++ <<
" #c0ff00" << std::endl;
1281 out <<
"0 " << colno++ <<
" #80ff00" << std::endl;
1282 out <<
"0 " << colno++ <<
" #00f000" << std::endl;
1283 out <<
"0 " << colno++ <<
" #00f0c0" << std::endl;
1284 out <<
"0 " << colno++ <<
" #00f0ff" << std::endl;
1285 out <<
"0 " << colno++ <<
" #00c0ff" << std::endl;
1286 out <<
"0 " << colno++ <<
" #0080ff" << std::endl;
1287 out <<
"0 " << colno++ <<
" #0040ff" << std::endl;
1288 out <<
"0 " << colno++ <<
" #0000c0" << std::endl;
1289 out <<
"0 " << colno++ <<
" #5000ff" << std::endl;
1290 out <<
"0 " << colno++ <<
" #8000ff" << std::endl;
1291 out <<
"0 " << colno++ <<
" #b000ff" << std::endl;
1292 out <<
"0 " << colno++ <<
" #ff00ff" << std::endl;
1293 out <<
"0 " << colno++ <<
" #ff80ff" << std::endl;
1295 for (
unsigned int i = 0; i < 8; ++i)
1296 out <<
"0 " << colno++ <<
" #" << std::hex << 32 * i + 31 << 32 * i + 31
1297 << 32 * i + 31 << std::dec << std::endl;
1299 for (
unsigned int i = 1; i < 16; ++i)
1300 out <<
"0 " << colno++ <<
" #00" << std::hex << 16 * i + 15 << std::dec
1301 <<
"00" << std::endl;
1303 for (
unsigned int i = 1; i < 16; ++i)
1304 out <<
"0 " << colno++ <<
" #" << std::hex << 16 * i + 15 << 16 * i + 15
1305 << std::dec <<
"00" << std::endl;
1307 for (
unsigned int i = 1; i < 16; ++i)
1308 out <<
"0 " << colno++ <<
" #" << std::hex << 16 * i + 15 << std::dec
1309 <<
"0000" << std::endl;
1311 for (
unsigned int i = 1; i < 16; ++i)
1312 out <<
"0 " << colno++ <<
" #" << std::hex << 16 * i + 15 <<
"00"
1313 << 16 * i + 15 << std::dec << std::endl;
1315 for (
unsigned int i = 1; i < 16; ++i)
1316 out <<
"0 " << colno++ <<
" #0000" << std::hex << 16 * i + 15 << std::dec
1319 for (
unsigned int i = 1; i < 16; ++i)
1320 out <<
"0 " << colno++ <<
" #00" << std::hex << 16 * i + 15 << 16 * i + 15
1321 << std::dec << std::endl;
1343 out << cell->material_id() + 32;
1346 out << cell->level() + 8;
1349 out << cell->subdomain_id() + 32;
1352 out << cell->level_subdomain_id() + 32;
1361 (900 + cell->material_id()))
1367 << nv + 1 << std::endl;
1373 for (
unsigned int k = 0; k <= nv; ++k)
1377 for (
unsigned int d = 0; d < static_cast<unsigned int>(dim); ++d)
1381 out <<
'\t' << ((d == 0) ? val : -val);
1386 static const unsigned int face_reorder[4] = {2, 1, 3, 0};
1388 for (
const unsigned int f : face_reorder)
1416 for (
unsigned int k = 0;
1417 k < GeometryInfo<dim>::vertices_per_face;
1421 for (
unsigned int d = 0; d < static_cast<unsigned int>(dim);
1427 out <<
'\t' << ((d == 0) ? val : -val);
1444#ifdef DEAL_II_GMSH_WITH_API
1445template <
int dim,
int spacedim>
1448 const std::string &filename)
const
1451 const std::array<int, 8> dealii_to_gmsh_type = {{15, 1, 2, 3, 4, 7, 6, 5}};
1454 const std::array<std::vector<unsigned int>, 8> dealii_to_gmsh = {
1461 {{0, 1, 2, 3, 4, 5}},
1462 {{0, 1, 3, 2, 4, 5, 7, 6}}}};
1467 std::vector<double> coords(3 * vertices.size());
1468 std::vector<std::size_t> nodes(vertices.size());
1472 for (
const auto &p : vertices)
1474 for (
unsigned int d = 0; d < spacedim; ++d)
1475 coords[i * 3 + d] = p[d];
1487 using IdPair = std::pair<types::material_id, types::manifold_id>;
1488 std::map<IdPair, int> id_pair_to_entity_tag;
1489 std::vector<IdPair> all_pairs;
1491 std::set<IdPair> set_of_pairs;
1494 set_of_pairs.insert({cell->material_id(), cell->manifold_id()});
1495 for (
const auto &f : cell->face_iterators())
1497 (f->boundary_id() != 0 &&
1499 set_of_pairs.insert({f->boundary_id(), f->manifold_id()});
1501 for (
const auto l : cell->line_indices())
1503 const auto &f = cell->line(l);
1505 (f->boundary_id() != 0 &&
1507 set_of_pairs.insert({f->boundary_id(), f->manifold_id()});
1510 all_pairs = {set_of_pairs.begin(), set_of_pairs.end()};
1513 for (
const auto &p : set_of_pairs)
1514 id_pair_to_entity_tag[p] = entity++;
1517 const auto n_entity_tags = id_pair_to_entity_tag.size();
1520 std::vector<std::vector<std::vector<std::size_t>>> element_ids(
1521 n_entity_tags, std::vector<std::vector<std::size_t>>(8));
1522 std::vector<std::vector<std::vector<std::size_t>>> element_nodes(
1523 n_entity_tags, std::vector<std::vector<std::size_t>>(8));
1526 std::size_t element_id = 1;
1528 const auto add_element = [&](
const auto &element,
const int &entity_tag) {
1529 const auto type = element->reference_cell();
1534 for (
const auto v : element->vertex_indices())
1535 element_nodes[entity_tag - 1][type].emplace_back(
1536 element->vertex_index(dealii_to_gmsh[type][v]) + 1);
1539 element_ids[entity_tag - 1][type].emplace_back(element_id);
1547 std::set<std::pair<int, int>> dim_entity_tag;
1549 auto maybe_add_element =
1550 [&](
const auto &element,
1552 const auto struct_dim = element->structure_dimension;
1553 const auto manifold_id = element->manifold_id();
1556 const bool non_default_boundary_or_material_id =
1557 (boundary_or_material_id != 0 &&
1559 const bool non_default_manifold =
1561 if (struct_dim == dim || non_default_boundary_or_material_id ||
1562 non_default_manifold)
1564 const auto entity_tag =
1565 id_pair_to_entity_tag[{boundary_or_material_id, manifold_id}];
1566 add_element(element, entity_tag);
1567 dim_entity_tag.insert({struct_dim, entity_tag});
1574 maybe_add_element(cell, cell->material_id());
1575 for (
const auto &face : cell->face_iterators())
1576 maybe_add_element(face, face->boundary_id());
1578 for (
const auto l : cell->line_indices())
1579 maybe_add_element(cell->line(l), cell->line(l)->boundary_id());
1584 gmsh::option::setNumber(
"General.Verbosity", 0);
1585 gmsh::model::add(
"Grid generated in deal.II");
1586 for (
const auto &p : dim_entity_tag)
1588 gmsh::model::addDiscreteEntity(p.first, p.second);
1589 gmsh::model::mesh::addNodes(p.first, p.second, nodes, coords);
1592 for (
unsigned int entity_tag = 0; entity_tag < n_entity_tags; ++entity_tag)
1593 for (
unsigned int t = 1; t < 8; ++t)
1595 const auto all_element_ids = element_ids[entity_tag][t];
1596 const auto all_element_nodes = element_nodes[entity_tag][t];
1597 const auto gmsh_t = dealii_to_gmsh_type[t];
1598 if (all_element_ids.size() > 0)
1599 gmsh::model::mesh::addElementsByType(entity_tag + 1,
1607 for (
const auto &it : dim_entity_tag)
1609 const auto &d = it.first;
1610 const auto &entity_tag = it.second;
1611 const auto &boundary_id = all_pairs[entity_tag - 1].first;
1612 const auto &manifold_id = all_pairs[entity_tag - 1].second;
1614 std::string physical_name;
1615 if (d == dim && boundary_id != 0)
1617 static_cast<int>(boundary_id));
1618 else if (d < dim && boundary_id != 0)
1625 std::string sep = physical_name !=
"" ?
", " :
"";
1628 sep +
"ManifoldID:" +
1630 const auto physical_tag =
1631 gmsh::model::addPhysicalGroup(d, {entity_tag}, -1);
1632 if (physical_name !=
"")
1633 gmsh::model::setPhysicalName(d, physical_tag, physical_name);
1637 gmsh::write(filename);
1658 svg_project_point(
const Point<3> &point,
1662 const float camera_focus)
1665 cross_product_3d(camera_horizontal, camera_direction);
1668 camera_focus / ((point - camera_position) * camera_direction);
1671 camera_position + phi * (point - camera_position);
1673 return {(projection - camera_position - camera_focus * camera_direction) *
1675 (projection - camera_position - camera_focus * camera_direction) *
1682template <
int dim,
int spacedim>
1685 std::ostream & )
const
1688 ExcMessage(
"Mesh output in SVG format is not implemented for anything "
1689 "other than two-dimensional meshes in two-dimensional "
1690 "space. That's because three-dimensional meshes are best "
1691 "viewed in programs that allow changing the viewpoint, "
1692 "but SVG format does not allow this: It is an inherently "
1693 "2d format, and for three-dimensional meshes would "
1694 "require choosing one, fixed viewpoint."
1696 "You probably want to output your mesh in a format such "
1697 "as VTK, VTU, or gnuplot."));
1706 unsigned int min_level, max_level;
1714 Assert(height != 0 || width != 0,
1715 ExcMessage(
"You have to set at least one of width and height"));
1717 unsigned int margin_in_percent = 0;
1719 margin_in_percent = 8;
1722 unsigned int cell_label_font_size;
1735 float x_max_perspective, x_min_perspective;
1736 float y_max_perspective, y_min_perspective;
1738 float x_dimension_perspective, y_dimension_perspective;
1742 double x_min = tria.
begin()->vertex(0)[0];
1743 double x_max = x_min;
1744 double y_min = tria.
begin()->vertex(0)[1];
1745 double y_max = y_min;
1747 double x_dimension, y_dimension;
1749 min_level = max_level = tria.
begin()->level();
1752 std::set<unsigned int> materials;
1755 std::set<unsigned int> levels;
1758 std::set<unsigned int> subdomains;
1761 std::set<int> level_subdomains;
1769 for (
unsigned int vertex_index = 0; vertex_index < cell->n_vertices();
1772 if (cell->vertex(vertex_index)[0] < x_min)
1773 x_min = cell->vertex(vertex_index)[0];
1774 if (cell->vertex(vertex_index)[0] > x_max)
1775 x_max = cell->vertex(vertex_index)[0];
1777 if (cell->vertex(vertex_index)[1] < y_min)
1778 y_min = cell->vertex(vertex_index)[1];
1779 if (cell->vertex(vertex_index)[1] > y_max)
1780 y_max = cell->vertex(vertex_index)[1];
1783 if (
static_cast<unsigned int>(cell->level()) < min_level)
1784 min_level = cell->level();
1785 if (
static_cast<unsigned int>(cell->level()) > max_level)
1786 max_level = cell->level();
1788 materials.insert(cell->material_id());
1789 levels.insert(cell->level());
1790 if (cell->is_active())
1791 subdomains.insert(cell->subdomain_id() + 2);
1792 level_subdomains.insert(cell->level_subdomain_id() + 2);
1795 x_dimension = x_max - x_min;
1796 y_dimension = y_max - y_min;
1799 const unsigned int n_materials = materials.size();
1802 const unsigned int n_levels = levels.size();
1805 const unsigned int n_subdomains = subdomains.size();
1808 const unsigned int n_level_subdomains = level_subdomains.size();
1822 n = n_level_subdomains;
1831 camera_position[0] = 0;
1832 camera_position[1] = 0;
1833 camera_position[2] = 2. *
std::max(x_dimension, y_dimension);
1836 camera_direction[0] = 0;
1837 camera_direction[1] = 0;
1838 camera_direction[2] = -1;
1841 camera_horizontal[0] = 1;
1842 camera_horizontal[1] = 0;
1843 camera_horizontal[2] = 0;
1845 camera_focus = .5 *
std::max(x_dimension, y_dimension);
1851 const double angle_factor = 3.14159265 / 180.;
1854 camera_position_temp[1] =
1857 camera_position_temp[2] =
1861 camera_direction_temp[1] =
1864 camera_direction_temp[2] =
1868 camera_horizontal_temp[1] =
1871 camera_horizontal_temp[2] =
1875 camera_position[1] = camera_position_temp[1];
1876 camera_position[2] = camera_position_temp[2];
1878 camera_direction[1] = camera_direction_temp[1];
1879 camera_direction[2] = camera_direction_temp[2];
1881 camera_horizontal[1] = camera_horizontal_temp[1];
1882 camera_horizontal[2] = camera_horizontal_temp[2];
1885 camera_position_temp[0] =
1888 camera_position_temp[1] =
1892 camera_direction_temp[0] =
1895 camera_direction_temp[1] =
1899 camera_horizontal_temp[0] =
1902 camera_horizontal_temp[1] =
1906 camera_position[0] = camera_position_temp[0];
1907 camera_position[1] = camera_position_temp[1];
1909 camera_direction[0] = camera_direction_temp[0];
1910 camera_direction[1] = camera_direction_temp[1];
1912 camera_horizontal[0] = camera_horizontal_temp[0];
1913 camera_horizontal[1] = camera_horizontal_temp[1];
1916 camera_position[0] = x_min + .5 * x_dimension;
1917 camera_position[1] = y_min + .5 * y_dimension;
1919 camera_position[0] += 2. *
std::max(x_dimension, y_dimension) *
1922 camera_position[1] -= 2. *
std::max(x_dimension, y_dimension) *
1929 point[0] = tria.
begin()->vertex(0)[0];
1930 point[1] = tria.
begin()->vertex(0)[1];
1933 float min_level_min_vertex_distance = 0;
1938 (
static_cast<float>(tria.
begin()->level()) /
1939 static_cast<float>(n_levels)) *
1940 std::max(x_dimension, y_dimension);
1943 projection_decomposition = svg_project_point(
1944 point, camera_position, camera_direction, camera_horizontal, camera_focus);
1946 x_max_perspective = projection_decomposition[0];
1947 x_min_perspective = projection_decomposition[0];
1949 y_max_perspective = projection_decomposition[1];
1950 y_min_perspective = projection_decomposition[1];
1954 point[0] = cell->vertex(0)[0];
1955 point[1] = cell->vertex(0)[1];
1962 (
static_cast<float>(cell->level()) /
static_cast<float>(n_levels)) *
1963 std::max(x_dimension, y_dimension);
1966 projection_decomposition = svg_project_point(point,
1972 if (x_max_perspective < projection_decomposition[0])
1973 x_max_perspective = projection_decomposition[0];
1974 if (x_min_perspective > projection_decomposition[0])
1975 x_min_perspective = projection_decomposition[0];
1977 if (y_max_perspective < projection_decomposition[1])
1978 y_max_perspective = projection_decomposition[1];
1979 if (y_min_perspective > projection_decomposition[1])
1980 y_min_perspective = projection_decomposition[1];
1982 point[0] = cell->vertex(1)[0];
1983 point[1] = cell->vertex(1)[1];
1985 projection_decomposition = svg_project_point(point,
1991 if (x_max_perspective < projection_decomposition[0])
1992 x_max_perspective = projection_decomposition[0];
1993 if (x_min_perspective > projection_decomposition[0])
1994 x_min_perspective = projection_decomposition[0];
1996 if (y_max_perspective < projection_decomposition[1])
1997 y_max_perspective = projection_decomposition[1];
1998 if (y_min_perspective > projection_decomposition[1])
1999 y_min_perspective = projection_decomposition[1];
2001 point[0] = cell->vertex(2)[0];
2002 point[1] = cell->vertex(2)[1];
2004 projection_decomposition = svg_project_point(point,
2010 if (x_max_perspective < projection_decomposition[0])
2011 x_max_perspective = projection_decomposition[0];
2012 if (x_min_perspective > projection_decomposition[0])
2013 x_min_perspective = projection_decomposition[0];
2015 if (y_max_perspective < projection_decomposition[1])
2016 y_max_perspective = projection_decomposition[1];
2017 if (y_min_perspective > projection_decomposition[1])
2018 y_min_perspective = projection_decomposition[1];
2020 if (cell->n_vertices() == 4)
2022 point[0] = cell->vertex(3)[0];
2023 point[1] = cell->vertex(3)[1];
2025 projection_decomposition = svg_project_point(point,
2031 if (x_max_perspective < projection_decomposition[0])
2032 x_max_perspective = projection_decomposition[0];
2033 if (x_min_perspective > projection_decomposition[0])
2034 x_min_perspective = projection_decomposition[0];
2036 if (y_max_perspective < projection_decomposition[1])
2037 y_max_perspective = projection_decomposition[1];
2038 if (y_min_perspective > projection_decomposition[1])
2039 y_min_perspective = projection_decomposition[1];
2042 if (
static_cast<unsigned int>(cell->level()) == min_level)
2043 min_level_min_vertex_distance = cell->minimum_vertex_distance();
2046 x_dimension_perspective = x_max_perspective - x_min_perspective;
2047 y_dimension_perspective = y_max_perspective - y_min_perspective;
2051 width =
static_cast<unsigned int>(
2052 .5 + height * (x_dimension_perspective / y_dimension_perspective));
2053 else if (height == 0)
2054 height =
static_cast<unsigned int>(
2055 .5 + width * (y_dimension_perspective / x_dimension_perspective));
2056 unsigned int additional_width = 0;
2058 unsigned int font_size =
2059 static_cast<unsigned int>(.5 + (height / 100.) * 1.75);
2060 cell_label_font_size =
static_cast<unsigned int>(
2062 min_level_min_vertex_distance /
std::min(x_dimension, y_dimension)));
2069 additional_width =
static_cast<unsigned int>(
2074 additional_width =
static_cast<unsigned int>(
2075 .5 + height * .175);
2087 out <<
"<svg width=\"" << width + additional_width <<
"\" height=\"" << height
2088 <<
"\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">" <<
'\n'
2095 <<
" <linearGradient id=\"background_gradient\" gradientUnits=\"userSpaceOnUse\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\""
2096 << height <<
"\">" <<
'\n'
2097 <<
" <stop offset=\"0\" style=\"stop-color:white\"/>" <<
'\n'
2098 <<
" <stop offset=\"1\" style=\"stop-color:lightsteelblue\"/>" <<
'\n'
2099 <<
" </linearGradient>" <<
'\n';
2105 out <<
"<!-- internal style sheet -->" <<
'\n'
2106 <<
"<style type=\"text/css\"><![CDATA[" <<
'\n';
2110 out <<
" rect.background{fill:url(#background_gradient)}" <<
'\n';
2112 out <<
" rect.background{fill:white}" <<
'\n';
2114 out <<
" rect.background{fill:none}" <<
'\n';
2117 out <<
" rect{fill:none; stroke:rgb(25,25,25); stroke-width:"
2119 <<
" text{font-family:Helvetica; text-anchor:middle; fill:rgb(25,25,25)}"
2121 <<
" line{stroke:rgb(25,25,25); stroke-width:"
2123 <<
" path{fill:none; stroke:rgb(25,25,25); stroke-width:"
2125 <<
" circle{fill:white; stroke:black; stroke-width:2}" <<
'\n'
2131 unsigned int labeling_index = 0;
2132 auto materials_it = materials.begin();
2133 auto levels_it = levels.begin();
2134 auto subdomains_it = subdomains.begin();
2135 auto level_subdomains_it = level_subdomains.begin();
2137 for (
unsigned int index = 0; index < n; ++index)
2147 h = .6 - (index / (n - 1.)) * .6;
2156 unsigned int i =
static_cast<unsigned int>(h * 6);
2158 double f = h * 6 - i;
2165 r = 255, g =
static_cast<unsigned int>(.5 + 255 * t);
2168 r =
static_cast<unsigned int>(.5 + 255 * q), g = 255;
2171 g = 255, b =
static_cast<unsigned int>(.5 + 255 * t);
2174 g =
static_cast<unsigned int>(.5 + 255 * q), b = 255;
2177 r =
static_cast<unsigned int>(.5 + 255 * t), b = 255;
2180 r = 255, b =
static_cast<unsigned int>(.5 + 255 * q);
2189 labeling_index = *materials_it++;
2192 labeling_index = *levels_it++;
2195 labeling_index = *subdomains_it++;
2198 labeling_index = *level_subdomains_it++;
2204 out <<
" path.p" << labeling_index <<
"{fill:rgb(" << r <<
',' << g
2205 <<
',' << b <<
"); "
2206 <<
"stroke:rgb(25,25,25); stroke-width:"
2209 out <<
" path.ps" << labeling_index <<
"{fill:rgb("
2210 <<
static_cast<unsigned int>(.5 + .75 * r) <<
','
2211 <<
static_cast<unsigned int>(.5 + .75 * g) <<
','
2212 <<
static_cast<unsigned int>(.5 + .75 * b) <<
"); "
2213 <<
"stroke:rgb(20,20,20); stroke-width:"
2216 out <<
" rect.r" << labeling_index <<
"{fill:rgb(" << r <<
',' << g
2217 <<
',' << b <<
"); "
2218 <<
"stroke:rgb(25,25,25); stroke-width:"
2225 out <<
"]]></style>" <<
'\n' <<
'\n';
2228 out <<
" <rect class=\"background\" width=\"" << width <<
"\" height=\""
2229 << height <<
"\"/>" <<
'\n';
2233 unsigned int x_offset = 0;
2236 x_offset =
static_cast<unsigned int>(.5 + (height / 100.) *
2237 (margin_in_percent / 2.));
2239 x_offset =
static_cast<unsigned int>(.5 + height * .025);
2242 <<
" <text x=\"" << x_offset <<
"\" y=\""
2243 <<
static_cast<unsigned int>(.5 + height * .0525) <<
'\"'
2244 <<
" style=\"font-weight:100; fill:lightsteelblue; text-anchor:start; font-family:Courier; font-size:"
2245 <<
static_cast<unsigned int>(.5 + height * .045) <<
"px\">"
2247 <<
"</text>" <<
'\n';
2266 out <<
" <!-- cells -->" <<
'\n';
2268 for (
unsigned int level_index = min_level; level_index <= max_level;
2281 out <<
" class=\"p";
2283 if (!cell->is_active() &&
2290 out << cell->material_id();
2293 out << static_cast<unsigned int>(cell->level());
2296 if (cell->is_active())
2297 out << cell->subdomain_id() + 2;
2302 out << cell->level_subdomain_id() + 2;
2313 point[0] = cell->vertex(0)[0];
2314 point[1] = cell->vertex(0)[1];
2320 (
static_cast<float>(cell->level()) /
2321 static_cast<float>(n_levels)) *
2322 std::max(x_dimension, y_dimension);
2325 projection_decomposition = svg_project_point(point,
2331 out << static_cast<unsigned int>(
2333 ((projection_decomposition[0] - x_min_perspective) /
2334 x_dimension_perspective) *
2335 (width - (width / 100.) * 2. * margin_in_percent) +
2336 ((width / 100.) * margin_in_percent))
2338 <<
static_cast<unsigned int>(
2339 .5 + height - (height / 100.) * margin_in_percent -
2340 ((projection_decomposition[1] - y_min_perspective) /
2341 y_dimension_perspective) *
2342 (height - (height / 100.) * 2. * margin_in_percent));
2346 point[0] = cell->vertex(1)[0];
2347 point[1] = cell->vertex(1)[1];
2349 projection_decomposition = svg_project_point(point,
2355 out << static_cast<unsigned int>(
2357 ((projection_decomposition[0] - x_min_perspective) /
2358 x_dimension_perspective) *
2359 (width - (width / 100.) * 2. * margin_in_percent) +
2360 ((width / 100.) * margin_in_percent))
2362 <<
static_cast<unsigned int>(
2363 .5 + height - (height / 100.) * margin_in_percent -
2364 ((projection_decomposition[1] - y_min_perspective) /
2365 y_dimension_perspective) *
2366 (height - (height / 100.) * 2. * margin_in_percent));
2370 if (cell->n_vertices() == 4)
2372 point[0] = cell->vertex(3)[0];
2373 point[1] = cell->vertex(3)[1];
2375 projection_decomposition = svg_project_point(point,
2381 out << static_cast<unsigned int>(
2383 ((projection_decomposition[0] - x_min_perspective) /
2384 x_dimension_perspective) *
2385 (width - (width / 100.) * 2. * margin_in_percent) +
2386 ((width / 100.) * margin_in_percent))
2388 <<
static_cast<unsigned int>(
2389 .5 + height - (height / 100.) * margin_in_percent -
2390 ((projection_decomposition[1] - y_min_perspective) /
2391 y_dimension_perspective) *
2392 (height - (height / 100.) * 2. * margin_in_percent));
2397 point[0] = cell->vertex(2)[0];
2398 point[1] = cell->vertex(2)[1];
2400 projection_decomposition = svg_project_point(point,
2406 out << static_cast<unsigned int>(
2408 ((projection_decomposition[0] - x_min_perspective) /
2409 x_dimension_perspective) *
2410 (width - (width / 100.) * 2. * margin_in_percent) +
2411 ((width / 100.) * margin_in_percent))
2413 <<
static_cast<unsigned int>(
2414 .5 + height - (height / 100.) * margin_in_percent -
2415 ((projection_decomposition[1] - y_min_perspective) /
2416 y_dimension_perspective) *
2417 (height - (height / 100.) * 2. * margin_in_percent));
2421 point[0] = cell->vertex(0)[0];
2422 point[1] = cell->vertex(0)[1];
2424 projection_decomposition = svg_project_point(point,
2430 out << static_cast<unsigned int>(
2432 ((projection_decomposition[0] - x_min_perspective) /
2433 x_dimension_perspective) *
2434 (width - (width / 100.) * 2. * margin_in_percent) +
2435 ((width / 100.) * margin_in_percent))
2437 <<
static_cast<unsigned int>(
2438 .5 + height - (height / 100.) * margin_in_percent -
2439 ((projection_decomposition[1] - y_min_perspective) /
2440 y_dimension_perspective) *
2441 (height - (height / 100.) * 2. * margin_in_percent));
2443 out <<
"\"/>" <<
'\n';
2450 point[0] = cell->center()[0];
2451 point[1] = cell->center()[1];
2457 (
static_cast<float>(cell->level()) /
2458 static_cast<float>(n_levels)) *
2459 std::max(x_dimension, y_dimension);
2462 const double distance_to_camera =
2463 std::hypot(point[0] - camera_position[0],
2464 point[1] - camera_position[1],
2465 point[2] - camera_position[2]);
2466 const double distance_factor =
2467 distance_to_camera / (2. *
std::max(x_dimension, y_dimension));
2469 projection_decomposition = svg_project_point(point,
2475 const unsigned int font_size_this_cell =
2476 static_cast<unsigned int>(
2478 cell_label_font_size *
2479 std::pow(.5, cell->level() - 4. + 3.5 * distance_factor));
2483 <<
static_cast<unsigned int>(
2485 ((projection_decomposition[0] - x_min_perspective) /
2486 x_dimension_perspective) *
2487 (width - (width / 100.) * 2. * margin_in_percent) +
2488 ((width / 100.) * margin_in_percent))
2490 <<
static_cast<unsigned int>(
2491 .5 + height - (height / 100.) * margin_in_percent -
2492 ((projection_decomposition[1] - y_min_perspective) /
2493 y_dimension_perspective) *
2494 (height - (height / 100.) * 2. * margin_in_percent) +
2495 0.5 * font_size_this_cell)
2496 <<
"\" style=\"font-size:" << font_size_this_cell <<
"px\">";
2500 out << cell->level();
2507 out << cell->index();
2515 out << static_cast<std::make_signed_t<types::material_id>>(
2516 cell->material_id());
2524 if (cell->is_active())
2525 out <<
static_cast<std::make_signed_t<types::subdomain_id>
>(
2526 cell->subdomain_id());
2538 out << static_cast<std::make_signed_t<types::subdomain_id>>(
2539 cell->level_subdomain_id());
2542 out <<
"</text>" <<
'\n';
2549 for (
auto faceIndex : cell->face_indices())
2551 if (cell->at_boundary(faceIndex))
2553 point[0] = cell->face(faceIndex)->vertex(0)[0];
2554 point[1] = cell->face(faceIndex)->vertex(0)[1];
2560 (
static_cast<float>(cell->level()) /
2561 static_cast<float>(n_levels)) *
2562 std::max(x_dimension, y_dimension);
2565 projection_decomposition =
2566 svg_project_point(point,
2572 out <<
" <line x1=\""
2573 <<
static_cast<unsigned int>(
2575 ((projection_decomposition[0] -
2576 x_min_perspective) /
2577 x_dimension_perspective) *
2579 (width / 100.) * 2. * margin_in_percent) +
2580 ((width / 100.) * margin_in_percent))
2582 <<
static_cast<unsigned int>(
2584 (height / 100.) * margin_in_percent -
2585 ((projection_decomposition[1] -
2586 y_min_perspective) /
2587 y_dimension_perspective) *
2589 (height / 100.) * 2. * margin_in_percent));
2591 point[0] = cell->face(faceIndex)->vertex(1)[0];
2592 point[1] = cell->face(faceIndex)->vertex(1)[1];
2598 (
static_cast<float>(cell->level()) /
2599 static_cast<float>(n_levels)) *
2600 std::max(x_dimension, y_dimension);
2603 projection_decomposition =
2604 svg_project_point(point,
2611 <<
static_cast<unsigned int>(
2613 ((projection_decomposition[0] -
2614 x_min_perspective) /
2615 x_dimension_perspective) *
2617 (width / 100.) * 2. * margin_in_percent) +
2618 ((width / 100.) * margin_in_percent))
2620 <<
static_cast<unsigned int>(
2622 (height / 100.) * margin_in_percent -
2623 ((projection_decomposition[1] -
2624 y_min_perspective) /
2625 y_dimension_perspective) *
2627 (height / 100.) * 2. * margin_in_percent))
2633 const double distance_to_camera =
2634 std::hypot(point[0] - camera_position[0],
2635 point[1] - camera_position[1],
2636 point[2] - camera_position[2]);
2637 const double distance_factor =
2638 distance_to_camera /
2639 (2. *
std::max(x_dimension, y_dimension));
2641 const unsigned int font_size_this_edge =
2642 static_cast<unsigned int>(
2643 .5 + .5 * cell_label_font_size *
2645 cell->level() - 4. +
2646 3.5 * distance_factor));
2648 point[0] = cell->face(faceIndex)->center()[0];
2649 point[1] = cell->face(faceIndex)->center()[1];
2655 (
static_cast<float>(cell->level()) /
2656 static_cast<float>(n_levels)) *
2657 std::max(x_dimension, y_dimension);
2660 projection_decomposition =
2661 svg_project_point(point,
2667 const unsigned int xc =
static_cast<unsigned int>(
2669 ((projection_decomposition[0] - x_min_perspective) /
2670 x_dimension_perspective) *
2672 (width / 100.) * 2. * margin_in_percent) +
2673 ((width / 100.) * margin_in_percent));
2674 const unsigned int yc =
static_cast<unsigned int>(
2675 .5 + height - (height / 100.) * margin_in_percent -
2676 ((projection_decomposition[1] - y_min_perspective) /
2677 y_dimension_perspective) *
2679 (height / 100.) * 2. * margin_in_percent));
2681 out <<
" <circle cx=\"" << xc <<
"\" cy=\"" << yc
2682 <<
"\" r=\"" << font_size_this_edge <<
"\" />"
2685 out <<
" <text x=\"" << xc <<
"\" y=\"" << yc
2686 <<
"\" style=\"font-size:" << font_size_this_edge
2687 <<
"px\" dominant-baseline=\"middle\">"
2688 <<
static_cast<int>(
2689 cell->face(faceIndex)->boundary_id())
2690 <<
"</text>" <<
'\n';
2702 out <<
'\n' <<
" <!-- legend -->" <<
'\n';
2704 additional_width = 0;
2706 additional_width =
static_cast<unsigned int>(.5 + (height / 100.) * 2.5);
2714 unsigned int line_offset = 0;
2715 out <<
" <rect x=\"" << width + additional_width <<
"\" y=\""
2716 <<
static_cast<unsigned int>(.5 + (height / 100.) * margin_in_percent)
2718 <<
static_cast<unsigned int>(.5 + (height / 100.) *
2719 (40. - margin_in_percent))
2720 <<
"\" height=\"" <<
static_cast<unsigned int>(.5 + height * .215)
2723 out <<
" <text x=\""
2724 << width + additional_width +
2725 static_cast<unsigned int>(.5 + (height / 100.) * 1.25)
2727 <<
static_cast<unsigned int>(.5 +
2728 (height / 100.) * margin_in_percent +
2729 (++line_offset) * 1.5 * font_size)
2730 <<
"\" style=\"text-anchor:start; font-weight:bold; font-size:"
2731 << font_size <<
"px\">"
2733 <<
"</text>" <<
'\n';
2737 out <<
" <text x=\""
2738 << width + additional_width +
2739 static_cast<unsigned int>(.5 + (height / 100.) * 2.)
2741 <<
static_cast<unsigned int>(.5 +
2742 (height / 100.) * margin_in_percent +
2743 (++line_offset) * 1.5 * font_size)
2744 <<
"\" style=\"text-anchor:start; font-style:oblique; font-size:"
2745 << font_size <<
"px\">"
2753 out <<
"</text>" <<
'\n';
2758 out <<
" <text x=\""
2759 << width + additional_width +
2760 static_cast<unsigned int>(.5 + (height / 100.) * 2.)
2762 <<
static_cast<unsigned int>(.5 +
2763 (height / 100.) * margin_in_percent +
2764 (++line_offset) * 1.5 * font_size)
2765 <<
"\" style=\"text-anchor:start; font-style:oblique; font-size:"
2766 << font_size <<
"px\">"
2773 out <<
"</text>" <<
'\n';
2778 out <<
" <text x=\""
2779 << width + additional_width +
2780 static_cast<unsigned int>(.5 + (height / 100.) * 2.)
2782 <<
static_cast<unsigned int>(.5 +
2783 (height / 100.) * margin_in_percent +
2784 (++line_offset) * 1.5 * font_size)
2785 <<
"\" style=\"text-anchor:start; font-style:oblique; font-size:"
2786 << font_size <<
"px\">"
2793 out <<
"</text>" <<
'\n';
2798 out <<
" <text x= \""
2799 << width + additional_width +
2800 static_cast<unsigned int>(.5 + (height / 100.) * 2.)
2802 <<
static_cast<unsigned int>(.5 +
2803 (height / 100.) * margin_in_percent +
2804 (++line_offset) * 1.5 * font_size)
2805 <<
"\" style=\"text-anchor:start; font-style:oblique; font-size:"
2806 << font_size <<
"px\">"
2812 out <<
"</text>" <<
'\n';
2817 out <<
" <text x= \""
2818 << width + additional_width +
2819 static_cast<unsigned int>(.5 + (height / 100.) * 2.)
2821 <<
static_cast<unsigned int>(.5 +
2822 (height / 100.) * margin_in_percent +
2823 (++line_offset) * 1.5 * font_size)
2824 <<
"\" style=\"text-anchor:start; font-style:oblique; font-size:"
2825 << font_size <<
"px\">"
2826 <<
"level_subdomain_id"
2827 <<
"</text>" <<
'\n';
2832 out <<
" <text x=\""
2833 << width + additional_width +
2834 static_cast<unsigned int>(.5 + (height / 100.) * 1.25)
2836 <<
static_cast<unsigned int>(.5 +
2837 (height / 100.) * margin_in_percent +
2838 (++line_offset) * 1.5 * font_size)
2839 <<
"\" style=\"text-anchor:start; font-weight:bold; font-size:"
2840 << font_size <<
"px\">"
2842 <<
"</text>" <<
'\n';
2844 out <<
" <text x= \""
2845 << width + additional_width +
2846 static_cast<unsigned int>(.5 + (height / 100.) * 2.)
2848 <<
static_cast<unsigned int>(.5 +
2849 (height / 100.) * margin_in_percent +
2850 (++line_offset) * 1.5 * font_size)
2851 <<
"\" style=\"text-anchor:start; font-style:oblique; font-size:"
2852 << font_size <<
"px\">"
2854 <<
"</text>" <<
'\n';
2862 out <<
" <text x=\"" << width + additional_width <<
"\" y=\""
2863 <<
static_cast<unsigned int>(
2864 .5 + (height / 100.) * margin_in_percent + 13.75 * font_size)
2865 <<
"\" style=\"text-anchor:start; font-size:" << font_size <<
"px\">"
2874 out <<
'\n' <<
" <!-- colorbar -->" <<
'\n';
2876 out <<
" <text x=\"" << width + additional_width <<
"\" y=\""
2877 <<
static_cast<unsigned int>(
2878 .5 + (height / 100.) * (margin_in_percent + 29.) -
2880 <<
"\" style=\"text-anchor:start; font-weight:bold; font-size:"
2881 << font_size <<
"px\">";
2886 out <<
"material_id";
2889 out <<
"level_number";
2892 out <<
"subdomain_id";
2895 out <<
"level_subdomain_id";
2901 out <<
"</text>" <<
'\n';
2903 unsigned int element_height =
static_cast<unsigned int>(
2904 ((height / 100.) * (71. - 2. * margin_in_percent)) / n);
2905 unsigned int element_width =
2906 static_cast<unsigned int>(.5 + (height / 100.) * 2.5);
2908 int labeling_index = 0;
2909 auto materials_it = materials.begin();
2910 auto levels_it = levels.begin();
2911 auto subdomains_it = subdomains.begin();
2912 auto level_subdomains_it = level_subdomains.begin();
2914 for (
unsigned int index = 0; index < n; ++index)
2919 labeling_index = *materials_it++;
2922 labeling_index = *levels_it++;
2925 labeling_index = *subdomains_it++;
2928 labeling_index = *level_subdomains_it++;
2934 out <<
" <rect class=\"r" << labeling_index <<
"\" x=\""
2935 << width + additional_width <<
"\" y=\""
2936 <<
static_cast<unsigned int>(.5 + (height / 100.) *
2937 (margin_in_percent + 29)) +
2938 (n - index - 1) * element_height
2939 <<
"\" width=\"" << element_width <<
"\" height=\""
2940 << element_height <<
"\"/>" <<
'\n';
2942 out <<
" <text x=\""
2943 << width + additional_width + 1.5 * element_width <<
"\" y=\""
2944 <<
static_cast<unsigned int>(.5 + (height / 100.) *
2945 (margin_in_percent + 29)) +
2946 (n - index - 1 + .5) * element_height +
2947 static_cast<unsigned int>(.5 + font_size * .35)
2949 <<
" style=\"text-anchor:start; font-size:"
2950 <<
static_cast<unsigned int>(.5 + font_size) <<
"px";
2952 if (index == 0 || index == n - 1)
2953 out <<
"; font-weight:bold";
2955 out <<
"\">" << labeling_index;
2962 out <<
"</text>" <<
'\n';
2970 out <<
'\n' <<
"</svg>";
2986template <
int dim,
int spacedim>
2989 std::ostream &out)
const
2996 const std::time_t time1 = std::time(
nullptr);
2997 const std::tm *time = std::localtime(&time1);
3001 <<
"\n# This file was generated by the deal.II library."
3002 <<
"\n# Date = " << time->tm_year + 1900 <<
"/" << std::setfill(
'0')
3003 << std::setw(2) << time->tm_mon + 1 <<
"/" << std::setfill(
'0')
3004 << std::setw(2) << time->tm_mday <<
"\n# Time = " << std::setfill(
'0')
3005 << std::setw(2) << time->tm_hour <<
":" << std::setfill(
'0')
3006 << std::setw(2) << time->tm_min <<
":" << std::setfill(
'0')
3007 << std::setw(2) << time->tm_sec <<
"\n#"
3008 <<
"\n# For a description of the MathGL script format see the MathGL manual. "
3010 <<
"\n# Note: This file is understood by MathGL v2.1 and higher only, and can "
3011 <<
"\n# be quickly viewed in a graphical environment using \'mglview\'. "
3017 const std::string axes =
"xyz";
3032 out <<
"\nsetsize 800 800";
3033 out <<
"\nrotate 0 0";
3036 out <<
"\nsetsize 800 800";
3037 out <<
"\nrotate 60 40";
3046 <<
"\n# Vertex ordering."
3047 <<
"\n# list <vertex order> <vertex indices>"
3056 out <<
"\nlist f 0 1 2 3" <<
'\n';
3060 <<
"\nlist f 0 2 4 6 | 1 3 5 7 | 0 4 1 5 | 2 6 3 7 | 0 1 2 3 | 4 5 6 7"
3069 <<
"\n# List of vertices."
3070 <<
"\n# list <id> <vertices>"
3078 for (
unsigned int i = 0; i < dim; ++i)
3085 out <<
"\nlist " << axes[i] << cell->active_cell_index() <<
" ";
3087 out << cell->vertex(j)[i] <<
" ";
3094 <<
"\n# List of cells to quadplot."
3095 <<
"\n# quadplot <vertex order> <id> <style>"
3099 out <<
"\nquadplot f ";
3100 for (
unsigned int j = 0; j < dim; ++j)
3101 out << axes[j] << i <<
" ";
3126 template <
int dim,
int spacedim,
typename IteratorType>
3128 generate_triangulation_patches(
3130 const IteratorType &begin,
3134 for (
auto cell = begin; cell != end; ++cell)
3139 patch.
data.reinit(5, cell->n_vertices());
3143 patch.
vertices[v] = cell->vertex(v);
3144 patch.
data(0, v) = cell->level();
3146 static_cast<std::make_signed_t<types::manifold_id>
>(
3147 cell->manifold_id());
3149 static_cast<std::make_signed_t<types::material_id>
>(
3150 cell->material_id());
3151 if (cell->is_active())
3153 static_cast<std::make_signed_t<types::subdomain_id>
>(
3154 cell->subdomain_id());
3156 patch.
data(3, v) = -1;
3158 static_cast<std::make_signed_t<types::subdomain_id>
>(
3159 cell->level_subdomain_id());
3161 patches.push_back(patch);
3167 std::vector<std::string>
3168 triangulation_patch_data_names()
3170 std::vector<std::string> v(5);
3175 v[4] =
"level_subdomain";
3182 std::vector<typename Triangulation<3, 3>::active_line_iterator>
3185 std::vector<typename Triangulation<3, 3>::active_line_iterator> res;
3187 std::vector<bool> flags;
3191 for (
auto face : tria.active_face_iterators())
3192 for (const auto
l : face->line_indices())
3194 const auto line = face->line(l);
3195 if (line->user_flag_set() || line->has_children())
3198 line->set_user_flag();
3199 if (line->at_boundary())
3200 res.emplace_back(line);
3211 template <
int dim,
int spacedim>
3212 std::vector<typename Triangulation<dim, spacedim>::active_line_iterator>
3224 std::vector<typename Triangulation<3, 3>::active_line_iterator>
3227 std::vector<typename Triangulation<3, 3>::active_line_iterator> res;
3229 std::vector<bool> flags;
3233 for (
auto face : tria.active_face_iterators())
3234 for (const auto
l : face->line_indices())
3236 const auto line = face->line(l);
3237 if (line->user_flag_set() || line->has_children())
3240 line->set_user_flag();
3242 (line->boundary_id() != 0 &&
3244 res.emplace_back(line);
3254 template <
int dim,
int spacedim>
3255 std::vector<typename Triangulation<dim, spacedim>::active_line_iterator>
3266 template <
int dim,
int spacedim>
3267 std::vector<typename Triangulation<dim, spacedim>::active_face_iterator>
3270 std::vector<typename Triangulation<dim, spacedim>::active_face_iterator>
3274 for (
auto face : tria.active_face_iterators())
3277 res.push_back(face);
3288 template <
int dim,
int spacedim>
3289 std::vector<typename Triangulation<dim, spacedim>::active_face_iterator>
3292 std::vector<typename Triangulation<dim, spacedim>::active_face_iterator>
3296 for (
auto face : tria.active_face_iterators())
3299 (face->boundary_id() != 0 &&
3301 res.push_back(face);
3309template <
int dim,
int spacedim>
3312 std::ostream &out)
const
3317 const std::vector<Point<spacedim>> &vertices = tria.
get_vertices();
3319 const auto n_vertices = vertices.size();
3321 out <<
"# vtk DataFile Version 3.0\n"
3322 <<
"Triangulation generated with deal.II\n"
3324 <<
"DATASET UNSTRUCTURED_GRID\n"
3325 <<
"POINTS " << n_vertices <<
" double\n";
3328 for (
const auto &v : vertices)
3331 for (
unsigned int d = spacedim + 1; d <= 3; ++d)
3337 get_relevant_face_iterators(tria) :
3338 get_boundary_face_iterators(tria);
3340 get_relevant_edge_iterators(tria) :
3341 get_boundary_edge_iterators(tria);
3347 "At least one of the flags (output_cells, output_faces, output_edges) has to be enabled!"));
3364 cells_size += cell->n_vertices() + 1;
3367 for (
const auto &face : faces)
3368 cells_size += face->n_vertices() + 1;
3371 for (
const auto &edge : edges)
3372 cells_size += edge->n_vertices() + 1;
3376 out <<
"\nCELLS " << n_cells <<
' ' << cells_size <<
'\n';
3391 static const std::array<int, 8> deal_to_vtk_cell_type = {
3392 {1, 3, 5, 9, 10, 14, 13, 12}};
3393 static const std::array<unsigned int, 8> vtk_to_deal_hypercube = {
3394 {0, 1, 3, 2, 4, 5, 7, 6}};
3400 out << cell->n_vertices();
3401 for (
const unsigned int i : cell->vertex_indices())
3404 const auto reference_cell = cell->reference_cell();
3410 out << cell->vertex_index(vtk_to_deal_hypercube[i]);
3414 out << cell->vertex_index(i);
3417 static const std::array<unsigned int, 5> permutation_table{
3419 out << cell->vertex_index(permutation_table[i]);
3427 for (
const auto &face : faces)
3429 out << face->n_vertices();
3430 for (
const unsigned int i : face->vertex_indices())
3434 face->n_vertices() ?
3435 vtk_to_deal_hypercube[i] :
3441 for (
const auto &edge : edges)
3444 for (
const unsigned int i : edge->vertex_indices())
3445 out <<
' ' << edge->vertex_index(i);
3450 out <<
"\nCELL_TYPES " << n_cells <<
'\n';
3454 out << deal_to_vtk_cell_type[
static_cast<int>(cell->reference_cell())]
3460 for (
const auto &face : faces)
3461 out << deal_to_vtk_cell_type[
static_cast<int>(face->reference_cell())]
3467 for (
const auto &edge : edges)
3468 out << deal_to_vtk_cell_type[
static_cast<int>(edge->reference_cell())]
3471 out <<
"\n\nCELL_DATA " << n_cells <<
'\n'
3472 <<
"SCALARS MaterialID int 1\n"
3473 <<
"LOOKUP_TABLE default\n";
3480 out << static_cast<std::make_signed_t<types::material_id>>(
3481 cell->material_id())
3488 for (
const auto &face : faces)
3490 out << static_cast<std::make_signed_t<types::boundary_id>>(
3491 face->boundary_id())
3498 for (
const auto &edge : edges)
3500 out << static_cast<std::make_signed_t<types::boundary_id>>(
3501 edge->boundary_id())
3506 out <<
"\n\nSCALARS ManifoldID int 1\n"
3507 <<
"LOOKUP_TABLE default\n";
3514 out << static_cast<std::make_signed_t<types::manifold_id>>(
3515 cell->manifold_id())
3522 for (
const auto &face : faces)
3524 out << static_cast<std::make_signed_t<types::manifold_id>>(
3525 face->manifold_id())
3532 for (
const auto &edge : edges)
3534 out << static_cast<std::make_signed_t<types::manifold_id>>(
3535 edge->manifold_id())
3548template <
int dim,
int spacedim>
3551 std::ostream &out)
const
3559 std::vector<DataOutBase::Patch<dim, spacedim>> patches;
3561 generate_triangulation_patches(patches, tria.
begin_active(), tria.
end());
3566 triangulation_patch_data_names(),
3568 std::tuple<
unsigned int,
3576 out <<
" </UnstructuredGrid>\n";
3577 out <<
"<dealiiData encoding=\"base64\">";
3578 std::stringstream outstring;
3579 boost::archive::binary_oarchive ia(outstring);
3583 out <<
"\n</dealiiData>\n";
3584 out <<
"</VTKFile>\n";
3595template <
int dim,
int spacedim>
3599 const std::string &filename_without_extension,
3600 const bool view_levels,
3601 const bool include_artificial)
const
3603 std::vector<DataOutBase::Patch<dim, spacedim>> patches;
3604 const unsigned int n_datasets = 4;
3605 std::vector<std::string> data_names;
3606 data_names.emplace_back(
"level");
3607 data_names.emplace_back(
"subdomain");
3608 data_names.emplace_back(
"level_subdomain");
3609 data_names.emplace_back(
"proc_writing");
3615 const auto &reference_cell = reference_cells[0];
3617 const unsigned int n_q_points = reference_cell.n_vertices();
3623 if (cell->has_children())
3625 if (!include_artificial &&
3629 else if (!include_artificial)
3631 if (cell->has_children() &&
3634 else if (cell->is_active() &&
3635 cell->level_subdomain_id() ==
3642 patch.
data.reinit(n_datasets, n_q_points);
3646 for (
unsigned int vertex = 0; vertex < n_q_points; ++vertex)
3648 patch.
vertices[vertex] = cell->vertex(vertex);
3649 patch.
data(0, vertex) = cell->level();
3650 if (cell->is_active())
3651 patch.
data(1, vertex) =
static_cast<double>(
3652 static_cast<std::make_signed_t<types::subdomain_id>
>(
3653 cell->subdomain_id()));
3655 patch.
data(1, vertex) = -1.0;
3656 patch.
data(2, vertex) =
static_cast<double>(
3657 static_cast<std::make_signed_t<types::subdomain_id>
>(
3658 cell->level_subdomain_id()));
3662 for (
auto f : reference_cell.face_indices())
3664 patches.push_back(patch);
3670 std::string new_file = filename_without_extension +
".vtu";
3674 new_file = filename_without_extension +
".proc" +
3679 if (tr->locally_owned_subdomain() == 0)
3681 std::vector<std::string> filenames;
3686 std::size_t pos = filename_without_extension.find_last_of(
'/');
3687 if (pos == std::string::npos)
3694 for (
unsigned int i = 0; i <
n_procs; ++i)
3695 filenames.push_back(filename_without_extension.substr(pos) +
3699 const std::string pvtu_filename =
3700 (filename_without_extension +
".pvtu");
3701 std::ofstream pvtu_output(pvtu_filename);
3720 std::ofstream out(new_file);
3722 std::tuple<
unsigned int,
3728 patches, data_names, vector_data_ranges,
vtu_flags, out);
3784template <
int dim,
int spacedim>
3789 unsigned int n_faces = 0;
3792 if ((face->at_boundary()) && (face->boundary_id() != 0))
3800template <
int dim,
int spacedim>
3807 std::vector<bool> line_flags;
3811 .clear_user_flags_line();
3813 unsigned int n_lines = 0;
3816 for (
unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell; ++l)
3817 if (cell->line(l)->at_boundary() && (cell->line(l)->boundary_id() != 0) &&
3818 (cell->line(l)->user_flag_set() ==
false))
3821 cell->line(l)->set_user_flag();
3836 const unsigned int next_element_index,
3837 std::ostream &)
const
3839 return next_element_index;
3845 const unsigned int next_element_index,
3846 std::ostream &)
const
3848 return next_element_index;
3853 const unsigned int next_element_index,
3854 std::ostream &)
const
3856 return next_element_index;
3862 const unsigned int next_element_index,
3863 std::ostream &)
const
3865 return next_element_index;
3870 const unsigned int next_element_index,
3871 std::ostream &)
const
3873 return next_element_index;
3879 const unsigned int next_element_index,
3880 std::ostream &)
const
3882 return next_element_index;
3888 const unsigned int next_element_index,
3889 std::ostream &)
const
3891 return next_element_index;
3896 const unsigned int next_element_index,
3897 std::ostream &)
const
3899 return next_element_index;
3904template <
int dim,
int spacedim>
3907 const unsigned int next_element_index,
3908 std::ostream &out)
const
3910 unsigned int current_element_index = next_element_index;
3913 if (face->at_boundary() && (face->boundary_id() != 0))
3915 out << current_element_index <<
' '
3916 << face->reference_cell().gmsh_element_type() <<
' ';
3917 out << static_cast<unsigned int>(face->boundary_id()) <<
' '
3918 <<
static_cast<unsigned int>(face->boundary_id()) <<
' '
3919 << face->n_vertices();
3921 for (
const unsigned int vertex : face->vertex_indices())
3925 << face->vertex_index(
3930 out <<
' ' << face->vertex_index(vertex) + 1;
3936 ++current_element_index;
3938 return current_element_index;
3943template <
int dim,
int spacedim>
3946 const unsigned int next_element_index,
3947 std::ostream &out)
const
3949 unsigned int current_element_index = next_element_index;
3954 std::vector<bool> line_flags;
3958 .clear_user_flags_line();
3961 for (
unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell; ++l)
3962 if (cell->line(l)->at_boundary() && (cell->line(l)->boundary_id() != 0) &&
3963 (cell->line(l)->user_flag_set() ==
false))
3965 out << next_element_index <<
' '
3967 out << static_cast<unsigned int>(cell->line(l)->boundary_id()) <<
' '
3968 <<
static_cast<unsigned int>(cell->line(l)->boundary_id())
3971 for (
unsigned int vertex = 0; vertex < 2; ++vertex)
3973 << cell->line(l)->vertex_index(
3981 ++current_element_index;
3982 cell->line(l)->set_user_flag();
3990 return current_element_index;
3997 const unsigned int next_element_index,
3998 std::ostream &)
const
4000 return next_element_index;
4005 const unsigned int next_element_index,
4006 std::ostream &)
const
4008 return next_element_index;
4013 const unsigned int next_element_index,
4014 std::ostream &)
const
4016 return next_element_index;
4021 const unsigned int next_element_index,
4022 std::ostream &)
const
4024 return next_element_index;
4029 const unsigned int next_element_index,
4030 std::ostream &)
const
4032 return next_element_index;
4038 const unsigned int next_element_index,
4039 std::ostream &)
const
4041 return next_element_index;
4047 const unsigned int next_element_index,
4048 std::ostream &)
const
4050 return next_element_index;
4055 const unsigned int next_element_index,
4056 std::ostream &)
const
4058 return next_element_index;
4063template <
int dim,
int spacedim>
4066 const unsigned int next_element_index,
4067 std::ostream &out)
const
4069 unsigned int current_element_index = next_element_index;
4073 if (face->at_boundary() && (face->boundary_id() != 0))
4075 out << current_element_index <<
" "
4076 <<
static_cast<unsigned int>(face->boundary_id()) <<
" ";
4089 for (
unsigned int vertex = 0;
4090 vertex < GeometryInfo<dim>::vertices_per_face;
4092 out << face->vertex_index(
4098 ++current_element_index;
4100 return current_element_index;
4105template <
int dim,
int spacedim>
4108 const unsigned int next_element_index,
4109 std::ostream &out)
const
4111 unsigned int current_element_index = next_element_index;
4116 std::vector<bool> line_flags;
4120 .clear_user_flags_line();
4123 for (
unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell; ++l)
4124 if (cell->line(l)->at_boundary() && (cell->line(l)->boundary_id() != 0) &&
4125 (cell->line(l)->user_flag_set() ==
false))
4127 out << current_element_index <<
" "
4128 <<
static_cast<unsigned int>(cell->line(l)->boundary_id())
4131 for (
unsigned int vertex = 0; vertex < 2; ++vertex)
4132 out << cell->line(l)->vertex_index(
4141 ++current_element_index;
4142 cell->line(l)->set_user_flag();
4149 return current_element_index;
4166 template <
int spacedim>
4170 while (points.size() > 2)
4173 first_difference /= first_difference.
norm();
4175 second_difference /= second_difference.
norm();
4177 if ((first_difference - second_difference).norm() < 1e-10)
4178 points.erase(points.begin() + 1);
4186 template <
int spacedim>
4195 for (
const auto &cell : tria.active_cell_iterators())
4198 out <<
"# cell " << cell <<
'\n';
4200 out << cell->vertex(0) <<
' ' << cell->level() <<
' '
4201 << cell->material_id() <<
'\n'
4202 << cell->vertex(1) <<
' ' << cell->level() <<
' '
4203 << cell->material_id() <<
'\n'
4216 template <
int spacedim>
4227 const unsigned int n_additional_points =
4229 const unsigned int n_points = 2 + n_additional_points;
4234 std::vector<
Point<dim - 1>> boundary_points;
4235 if (mapping !=
nullptr)
4237 boundary_points.resize(n_points);
4238 boundary_points[0][0] = 0;
4239 boundary_points[n_points - 1][0] = 1;
4240 for (
unsigned int i = 1; i < n_points - 1; ++i)
4241 boundary_points[i][0] = 1. * i / (n_points - 1);
4243 const std::vector<double> dummy_weights(n_points, 1. / n_points);
4244 const Quadrature<dim - 1> quadrature(boundary_points, dummy_weights);
4247 ReferenceCells::get_hypercube<dim>(), quadrature);
4250 static constexpr std::array<unsigned int, 8> local_vertex_numbering = {
4251 {0, 1, 5, 4, 2, 3, 7, 6}};
4252 for (
const auto &cell : tria.active_cell_iterators())
4255 out <<
"# cell " << cell <<
'\n';
4257 if (mapping ==
nullptr ||
4268 out << cell->vertex(dim == 3 ?
4269 local_vertex_numbering[i] :
4273 out << cell->vertex(0) <<
' ' << cell->level() <<
' '
4274 << cell->material_id() <<
'\n'
4282 for (
const unsigned int face_no :
4285 const typename ::Triangulation<dim,
4286 spacedim>::face_iterator
4287 face = cell->face(face_no);
4288 if (dim != spacedim || face->at_boundary() ||
4294 std::vector<Point<spacedim>> line_points;
4299 cell->reference_cell(),
4301 cell->combined_face_orientation(face_no),
4303 line_points.reserve(n_points);
4304 for (
unsigned int i = 0; i < n_points; ++i)
4305 line_points.push_back(
4307 cell, q_projector.
point(offset + i)));
4308 internal::remove_collinear_points(line_points);
4314 out <<
'\n' <<
'\n';
4320 out << face->vertex(0) <<
' ' << cell->level() <<
' '
4321 << cell->material_id() <<
'\n'
4322 << face->vertex(1) <<
' ' << cell->level() <<
' '
4323 << cell->material_id() <<
'\n'
4339 template <
int spacedim>
4350 const unsigned int n_additional_points =
4352 const unsigned int n_points = 2 + n_additional_points;
4356 std::unique_ptr<Quadrature<dim>> q_projector;
4357 std::vector<Point<1>> boundary_points;
4358 if (mapping !=
nullptr)
4360 boundary_points.resize(n_points);
4361 boundary_points[0][0] = 0;
4362 boundary_points[n_points - 1][0] = 1;
4363 for (
unsigned int i = 1; i < n_points - 1; ++i)
4364 boundary_points[i][0] = 1. * i / (n_points - 1);
4366 const std::vector<double> dummy_weights(n_points, 1. / n_points);
4367 const Quadrature<1> quadrature1d(boundary_points, dummy_weights);
4370 const QIterated<dim - 1> quadrature(quadrature1d, 1);
4371 q_projector = std::make_unique<Quadrature<dim>>(
4373 ReferenceCells::get_hypercube<dim>(), quadrature));
4376 for (
const auto &cell : tria.active_cell_iterators())
4379 out <<
"# cell " << cell <<
'\n';
4381 if (mapping ==
nullptr || n_points == 2 ||
4382 (!cell->has_boundary_lines() &&
4388 out << cell->vertex(0) <<
' ' << cell->level() <<
' '
4389 << cell->material_id() <<
'\n'
4390 << cell->vertex(1) <<
' ' << cell->level() <<
' '
4391 << cell->material_id() <<
'\n'
4392 << cell->vertex(5) <<
' ' << cell->level() <<
' '
4393 << cell->material_id() <<
'\n'
4394 << cell->vertex(4) <<
' ' << cell->level() <<
' '
4395 << cell->material_id() <<
'\n'
4396 << cell->vertex(0) <<
' ' << cell->level() <<
' '
4397 << cell->material_id() <<
'\n'
4400 out << cell->vertex(2) <<
' ' << cell->level() <<
' '
4401 << cell->material_id() <<
'\n'
4402 << cell->vertex(3) <<
' ' << cell->level() <<
' '
4403 << cell->material_id() <<
'\n'
4404 << cell->vertex(7) <<
' ' << cell->level() <<
' '
4405 << cell->material_id() <<
'\n'
4406 << cell->vertex(6) <<
' ' << cell->level() <<
' '
4407 << cell->material_id() <<
'\n'
4408 << cell->vertex(2) <<
' ' << cell->level() <<
' '
4409 << cell->material_id() <<
'\n'
4413 out << cell->vertex(0) <<
' ' << cell->level() <<
' '
4414 << cell->material_id() <<
'\n'
4415 << cell->vertex(2) <<
' ' << cell->level() <<
' '
4416 << cell->material_id() <<
'\n'
4418 out << cell->vertex(1) <<
' ' << cell->level() <<
' '
4419 << cell->material_id() <<
'\n'
4420 << cell->vertex(3) <<
' ' << cell->level() <<
' '
4421 << cell->material_id() <<
'\n'
4423 out << cell->vertex(5) <<
' ' << cell->level() <<
' '
4424 << cell->material_id() <<
'\n'
4425 << cell->vertex(7) <<
' ' << cell->level() <<
' '
4426 << cell->material_id() <<
'\n'
4428 out << cell->vertex(4) <<
' ' << cell->level() <<
' '
4429 << cell->material_id() <<
'\n'
4430 << cell->vertex(6) <<
' ' << cell->level() <<
' '
4431 << cell->material_id() <<
'\n'
4437 for (
const unsigned int v : {0, 1, 2, 0, 3, 2})
4439 out << cell->vertex(v) <<
' ' << cell->level() <<
' '
4440 << cell->material_id() <<
'\n';
4444 for (
const unsigned int v : {3, 1})
4446 out << cell->vertex(v) <<
' ' << cell->level() <<
' '
4447 << cell->material_id() <<
'\n';
4458 for (
const unsigned int v : {0, 1, 2, 0, 3, 4, 5, 3})
4460 out << cell->vertex(v) <<
' ' << cell->level() <<
' '
4461 << cell->material_id() <<
'\n';
4465 for (
const unsigned int v : {1, 4})
4467 out << cell->vertex(v) <<
' ' << cell->level() <<
' '
4468 << cell->material_id() <<
'\n';
4472 for (
const unsigned int v : {2, 5})
4474 out << cell->vertex(v) <<
' ' << cell->level() <<
' '
4475 << cell->material_id() <<
'\n';
4482 for (
const unsigned int v : {0, 1, 3, 2, 0, 4, 1})
4484 out << cell->vertex(v) <<
' ' << cell->level() <<
' '
4485 << cell->material_id() <<
'\n';
4489 for (
const unsigned int v : {2, 4, 3})
4491 out << cell->vertex(v) <<
' ' << cell->level() <<
' '
4492 << cell->material_id() <<
'\n';
4503 for (
const unsigned int face_no :
4506 const typename ::Triangulation<dim,
4507 spacedim>::face_iterator
4508 face = cell->face(face_no);
4510 if (face->at_boundary() &&
4515 cell->reference_cell(),
4517 cell->combined_face_orientation(face_no),
4518 n_points * n_points);
4519 for (
unsigned int i = 0; i < n_points - 1; ++i)
4520 for (
unsigned int j = 0; j < n_points - 1; ++j)
4525 q_projector->point(offset + i * n_points + j));
4526 out << p0 <<
' ' << cell->level() <<
' '
4527 << cell->material_id() <<
'\n';
4531 offset + (i + 1) * n_points + j)))
4532 <<
' ' << cell->level() <<
' '
4533 << cell->material_id() <<
'\n';
4537 offset + (i + 1) * n_points + j + 1)))
4538 <<
' ' << cell->level() <<
' '
4539 << cell->material_id() <<
'\n';
4542 q_projector->point(offset + i * n_points +
4544 <<
' ' << cell->level() <<
' '
4545 << cell->material_id() <<
'\n';
4547 out << p0 <<
' ' << cell->level() <<
' '
4548 << cell->material_id() <<
'\n';
4549 out <<
'\n' <<
'\n';
4554 for (
unsigned int l = 0;
4555 l < GeometryInfo<dim>::lines_per_face;
4558 const typename ::Triangulation<dim, spacedim>::
4559 line_iterator line = face->line(l);
4562 &
v1 = line->vertex(1);
4563 if (line->at_boundary() ||
4569 std::vector<Point<spacedim>> line_points;
4578 line_points.reserve(n_points);
4579 for (
unsigned int i = 0; i < n_points; ++i)
4580 line_points.push_back(
4583 (1 - boundary_points[i][0]) * u0 +
4584 boundary_points[i][0] * u1));
4585 internal::remove_collinear_points(line_points);
4588 << static_cast<unsigned
int>(
4593 out <<
v0 <<
' ' << cell->level() <<
' '
4594 << cell->material_id() <<
'\n'
4595 <<
v1 <<
' ' << cell->level() <<
' '
4596 << cell->material_id() <<
'\n';
4598 out <<
'\n' <<
'\n';
4615template <
int dim,
int spacedim>
4639 const unsigned int l)
4659 write_eps(const ::Triangulation<1, 2> &,
4669 write_eps(const ::Triangulation<1, 3> &,
4679 write_eps(const ::Triangulation<2, 3> &,
4690 template <
int dim,
int spacedim>
4692 write_eps(const ::Triangulation<dim, spacedim> &tria,
4698 using LineList = std::list<LineEntry>;
4710 static_cast<const
GridOutFlags::EpsFlagsBase &>(eps_flags_3);
4738 for (
const auto &cell : tria.active_cell_iterators())
4739 for (const unsigned
int line_no : cell->line_indices())
4741 typename ::Triangulation<dim, spacedim>::line_iterator
4742 line = cell->line(line_no);
4754 if (!line->has_children() &&
4755 (mapping ==
nullptr || !line->at_boundary()))
4775 line_list.emplace_back(
4776 Point<2>(line->vertex(0)[0], line->vertex(0)[1]),
4777 Point<2>(line->vertex(1)[0], line->vertex(1)[1]),
4778 line->user_flag_set(),
4788 if (mapping !=
nullptr)
4795 std::vector<
Point<dim - 1>> boundary_points(n_points);
4797 for (
unsigned int i = 0; i < n_points; ++i)
4798 boundary_points[i][0] = 1. * (i + 1) / (n_points + 1);
4800 const Quadrature<dim - 1> quadrature(boundary_points);
4803 ReferenceCells::get_hypercube<dim>(), quadrature));
4809 for (
const auto &cell : tria.active_cell_iterators())
4810 for (const unsigned
int face_no :
4813 const typename ::Triangulation<dim, spacedim>::
4814 face_iterator face = cell->face(face_no);
4816 if (face->at_boundary())
4828 cell->reference_cell(),
4830 cell->combined_face_orientation(face_no),
4832 for (
unsigned int i = 0; i < n_points; ++i)
4836 cell, q_projector.point(offset + i)));
4837 const Point<2> p1(p1_dim[0], p1_dim[1]);
4839 line_list.emplace_back(p0,
4841 face->user_flag_set(),
4848 const Point<2> p1(p1_dim[0], p1_dim[1]);
4849 line_list.emplace_back(p0,
4851 face->user_flag_set(),
4885 const double z_angle = eps_flags_3.azimut_angle;
4886 const double turn_angle = eps_flags_3.turn_angle;
4888 -
std::sin(z_angle * 2. * pi / 360.) *
4889 std::sin(turn_angle * 2. * pi / 360.),
4890 +
std::sin(z_angle * 2. * pi / 360.) *
4891 std::cos(turn_angle * 2. * pi / 360.),
4892 -
std::cos(z_angle * 2. * pi / 360.));
4900 ((
Point<dim>(0, 0, 1) * view_direction) * view_direction);
4909 ((
Point<dim>(1, 0, 0) * view_direction) * view_direction) -
4910 ((
Point<dim>(1, 0, 0) * unit_vector1) * unit_vector1));
4914 for (
const auto &cell : tria.active_cell_iterators())
4915 for (const unsigned
int line_no : cell->line_indices())
4917 typename ::Triangulation<dim, spacedim>::line_iterator
4918 line = cell->line(line_no);
4919 line_list.emplace_back(
4920 Point<2>(line->vertex(0) * unit_vector2,
4921 line->vertex(0) * unit_vector1),
4922 Point<2>(line->vertex(1) * unit_vector2,
4923 line->vertex(1) * unit_vector1),
4924 line->user_flag_set(),
4940 double x_min = tria.begin_active()->vertex(0)[0];
4941 double x_max = x_min;
4942 double y_min = tria.begin_active()->vertex(0)[1];
4943 double y_max = y_min;
4944 unsigned int max_level = line_list.begin()->level;
4946 for (LineList::const_iterator line = line_list.begin();
4947 line != line_list.end();
4950 x_min =
std::min(x_min, line->first[0]);
4951 x_min =
std::min(x_min, line->second[0]);
4953 x_max =
std::max(x_max, line->first[0]);
4954 x_max =
std::max(x_max, line->second[0]);
4956 y_min =
std::min(y_min, line->first[1]);
4957 y_min =
std::min(y_min, line->second[1]);
4959 y_max =
std::max(y_max, line->first[1]);
4960 y_max =
std::max(y_max, line->second[1]);
4962 max_level =
std::max(max_level, line->level);
4970 const double scale =
4971 (eps_flags_base.
size /
4982 std::time_t time1 = std::time(
nullptr);
4983 std::tm *time = std::localtime(&time1);
4984 out <<
"%!PS-Adobe-2.0 EPSF-1.2" <<
'\n'
4985 <<
"%%Title: deal.II Output" <<
'\n'
4986 <<
"%%Creator: the deal.II library" <<
'\n'
4987 <<
"%%Creation Date: " << time->tm_year + 1900 <<
"/"
4988 << time->tm_mon + 1 <<
"/" << time->tm_mday <<
" - "
4989 << time->tm_hour <<
":" << std::setw(2) << time->tm_min <<
":"
4990 << std::setw(2) << time->tm_sec <<
'\n'
4991 <<
"%%BoundingBox: "
4995 <<
static_cast<unsigned int>(
4996 std::floor(((x_max - x_min) * scale) + 1))
4998 <<
static_cast<unsigned int>(
4999 std::floor(((y_max - y_min) * scale) + 1))
5008 out <<
"/m {moveto} bind def" <<
'\n'
5009 <<
"/x {lineto stroke} bind def" <<
'\n'
5010 <<
"/b {0 0 0 setrgbcolor} def" <<
'\n'
5011 <<
"/r {1 0 0 setrgbcolor} def" <<
'\n';
5018 out <<
"/l { neg " << (max_level) <<
" add "
5019 << (0.66666 /
std::max(1U, (max_level - 1)))
5020 <<
" mul 1 0.8 sethsbcolor} def" <<
'\n';
5030 if ((dim == 2) && (eps_flags_2.write_cell_numbers ||
5031 eps_flags_2.write_vertex_numbers))
5034 << (
"/R {rmoveto} bind def\n"
5035 "/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont\n"
5036 "dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall\n"
5037 "currentdict end definefont\n"
5038 "/MFshow {{dup dup 0 get findfont exch 1 get scalefont setfont\n"
5039 "[ currentpoint ] exch dup 2 get 0 exch rmoveto dup dup 5 get exch 4 get\n"
5040 "{show} {stringwidth pop 0 rmoveto}ifelse dup 3 get\n"
5041 "{2 get neg 0 exch rmoveto pop} {pop aload pop moveto}ifelse} forall} bind def\n"
5042 "/MFwidth {0 exch {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont\n"
5043 "5 get stringwidth pop add}\n"
5044 "{pop} ifelse} forall} bind def\n"
5045 "/MCshow { currentpoint stroke m\n"
5046 "exch dup MFwidth -2 div 3 -1 roll R MFshow } def\n")
5050 out <<
"%%EndProlog" <<
'\n' <<
'\n';
5053 out << eps_flags_base.
line_width <<
" setlinewidth" <<
'\n';
5057 const Point<2> offset(x_min, y_min);
5059 for (LineList::const_iterator line = line_list.begin();
5060 line != line_list.end();
5063 out << line->level <<
" l " << (line->first - offset) *
scale <<
" m "
5064 << (line->second - offset) * scale <<
" x" <<
'\n';
5070 << (line->
second - offset) *
scale <<
" x" <<
'\n';
5074 if ((dim == 2) && (eps_flags_2.write_cell_numbers ==
true))
5076 out <<
"(Helvetica) findfont 140 scalefont setfont" <<
'\n';
5078 for (
const auto &cell : tria.active_cell_iterators())
5080 out << (cell->center()[0] - offset[0]) * scale <<
' '
5081 << (cell->center()[1] - offset[1]) * scale <<
" m" <<
'\n'
5082 <<
"[ [(Helvetica) 12.0 0.0 true true (";
5083 if (eps_flags_2.write_cell_number_level)
5086 out << cell->index();
5089 <<
"] -6 MCshow" <<
'\n';
5094 if ((dim == 2) && (eps_flags_2.write_vertex_numbers ==
true))
5096 out <<
"(Helvetica) findfont 140 scalefont setfont" <<
'\n';
5102 std::set<unsigned int> treated_vertices;
5103 for (
const auto &cell : tria.active_cell_iterators())
5105 if (treated_vertices.find(cell->vertex_index(vertex_no)) ==
5106 treated_vertices.
end())
5108 treated_vertices.insert(cell->vertex_index(vertex_no));
5110 out << (cell->vertex(vertex_no)[0] - offset[0]) * scale <<
' '
5111 << (cell->vertex(vertex_no)[1] - offset[1]) * scale
5113 <<
"[ [(Helvetica) 10.0 0.0 true true ("
5114 << cell->vertex_index(vertex_no) <<
")] "
5115 <<
"] -6 MCshow" <<
'\n';
5119 out <<
"showpage" <<
'\n';
5131template <
int dim,
int spacedim>
5141template <
int dim,
int spacedim>
5148 switch (output_format)
5198template <
int dim,
int spacedim>
5209#include "grid/grid_out.inst"
void write_pvtu_record(std::ostream &out, const std::vector< std::string > &piece_names) const
void attach_triangulation(const Triangulation< dim, spacedim > &)
void add_data_vector(const VectorType &data, const std::vector< std::string > &names, const DataVectorType type=type_automatic, const std::vector< DataComponentInterpretation::DataComponentInterpretation > &data_component_interpretation={})
virtual void build_patches(const unsigned int n_subdivisions=0)
unsigned int n_boundary_faces(const Triangulation< dim, spacedim > &tria) const
GridOutFlags::Vtu vtu_flags
GridOutFlags::Eps< 2 > eps_flags_2
unsigned int write_ucd_lines(const Triangulation< dim, spacedim > &tria, const unsigned int next_element_index, std::ostream &out) const
void parse_parameters(ParameterHandler ¶m)
void write_svg(const Triangulation< 2, 2 > &tria, std::ostream &out) const
void set_flags(const GridOutFlags::DX &flags)
GridOutFlags::Eps< 1 > eps_flags_1
GridOutFlags::XFig xfig_flags
unsigned int write_ucd_faces(const Triangulation< dim, spacedim > &tria, const unsigned int next_element_index, std::ostream &out) const
void write_mathgl(const Triangulation< dim, spacedim > &tria, std::ostream &out) const
std::string default_suffix() const
static void declare_parameters(ParameterHandler ¶m)
static OutputFormat parse_output_format(const std::string &format_name)
void write_vtk(const Triangulation< dim, spacedim > &tria, std::ostream &out) const
GridOutFlags::Gnuplot gnuplot_flags
void write_msh(const Triangulation< dim, spacedim > &tria, std::ostream &out) const
unsigned int write_msh_lines(const Triangulation< dim, spacedim > &tria, const unsigned int next_element_index, std::ostream &out) const
void write_eps(const Triangulation< dim, spacedim > &tria, std::ostream &out, const Mapping< dim, spacedim > *mapping=nullptr) const
static std::string get_output_format_names()
GridOutFlags::Eps< 3 > eps_flags_3
void write(const Triangulation< dim, spacedim > &tria, std::ostream &out, const OutputFormat output_format, const Mapping< dim, spacedim > *mapping=nullptr) const
void write_vtu(const Triangulation< dim, spacedim > &tria, std::ostream &out) const
GridOutFlags::Ucd ucd_flags
void write_dx(const Triangulation< dim, spacedim > &tria, std::ostream &out) const
std::size_t memory_consumption() const
unsigned int n_boundary_lines(const Triangulation< dim, spacedim > &tria) const
GridOutFlags::DX dx_flags
unsigned int write_msh_faces(const Triangulation< dim, spacedim > &tria, const unsigned int next_element_index, std::ostream &out) const
void write_ucd(const Triangulation< dim, spacedim > &tria, std::ostream &out) const
GridOutFlags::Svg svg_flags
OutputFormat default_format
void write_xfig(const Triangulation< dim, spacedim > &tria, std::ostream &out, const Mapping< dim, spacedim > *mapping=nullptr) const
void write_gnuplot(const Triangulation< dim, spacedim > &tria, std::ostream &out, const Mapping< dim, spacedim > *mapping=nullptr) const
GridOutFlags::Vtk vtk_flags
GridOutFlags::Msh msh_flags
void write_mesh_per_processor_as_vtu(const Triangulation< dim, spacedim > &tria, const std::string &filename_without_extension, const bool view_levels=false, const bool include_artificial=false) const
@ vtk
write() calls write_vtk()
@ eps
write() calls write_eps()
@ msh
write() calls write_msh()
@ xfig
write() calls write_xfig()
@ dx
write() calls write_dx()
@ ucd
write() calls write_ucd()
@ gnuplot
write() calls write_gnuplot()
@ mathgl
write() calls write_mathgl()
@ svg
write() calls write_svg()
@ none
Do nothing in write()
@ vtu
write() calls write_vtu()
GridOutFlags::MathGL mathgl_flags
Abstract base class for mapping classes.
virtual Point< spacedim > transform_unit_to_real_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &p) const =0
virtual Point< dim > transform_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p) const =0
void enter_subsection(const std::string &subsection, const bool create_path_if_needed=true)
long int get_integer(const std::string &entry_string) const
bool get_bool(const std::string &entry_name) const
void declare_entry(const std::string &entry, const std::string &default_value, const Patterns::PatternBase &pattern=Patterns::Anything(), const std::string &documentation="", const bool has_to_be_set=false)
std::string get(const std::string &entry_string) const
double get_double(const std::string &entry_name) const
static DataSetDescriptor face(const ReferenceCell &reference_cell, const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation, const unsigned int n_quadrature_points)
Class which transforms dim - 1-dimensional quadrature rules to dim-dimensional face quadratures.
static Quadrature< dim > project_to_all_faces(const ReferenceCell &reference_cell, const hp::QCollection< dim - 1 > &quadrature)
const Point< dim > & point(const unsigned int i) const
unsigned int gmsh_element_type() const
numbers::NumberTraits< Number >::real_type norm() const
void save_user_flags_line(std::ostream &out) const
void save(Archive &ar, const unsigned int version) const
cell_iterator begin(const unsigned int level=0) const
virtual types::subdomain_id locally_owned_subdomain() const
unsigned int n_active_cells() const
const std::vector< Point< spacedim > > & get_vertices() const
unsigned int n_used_vertices() const
const std::vector< ReferenceCell > & get_reference_cells() const
cell_iterator end() const
const std::vector< bool > & get_used_vertices() const
active_cell_iterator begin_active(const unsigned int level=0) const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
#define DEAL_II_NOT_IMPLEMENTED()
IteratorRange< active_face_iterator > active_face_iterators() const
IteratorRange< active_cell_iterator > active_cell_iterators() const
IteratorRange< cell_iterator > cell_iterators_on_level(const unsigned int level) const
IteratorRange< cell_iterator > cell_iterators() const
static ::ExceptionBase & ExcIO()
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcInvalidState()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
const unsigned int n_procs
DataComponentInterpretation
void write_eps(const std::vector< Patch< 2, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const EpsFlags &flags, std::ostream &out)
void write_vtu_header(std::ostream &out, const VtkFlags &flags)
void write_vtu(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const VtkFlags &flags, std::ostream &out)
void write_vtu_main(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const VtkFlags &flags, std::ostream &out)
void write_vtu_footer(std::ostream &out)
void write_gnuplot(const std::vector< Patch< dim, spacedim > > &patches, const std::vector< std::string > &data_names, const std::vector< std::tuple< unsigned int, unsigned int, std::string, DataComponentInterpretation::DataComponentInterpretation > > &nonscalar_data_ranges, const GnuplotFlags &flags, std::ostream &out)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
constexpr ReferenceCell Triangle
constexpr ReferenceCell Hexahedron
constexpr ReferenceCell Pyramid
constexpr ReferenceCell Wedge
constexpr ReferenceCell Vertex
constexpr ReferenceCell Quadrilateral
constexpr ReferenceCell Tetrahedron
constexpr ReferenceCell Line
VectorType::value_type * end(VectorType &V)
unsigned int n_mpi_processes(const MPI_Comm mpi_communicator)
std::string encode_base64(const std::vector< unsigned char > &binary_input)
std::string compress(const std::string &input)
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
constexpr unsigned int invalid_unsigned_int
constexpr types::boundary_id internal_face_boundary_id
constexpr types::boundary_id invalid_boundary_id
constexpr types::manifold_id flat_manifold_id
constexpr types::subdomain_id artificial_subdomain_id
typename type_identity< T >::type type_identity_t
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > cos(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sin(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > pow(const ::VectorizedArray< Number, width > &, const Number p)
static void declare_parameters(ParameterHandler &prm)
void parse_parameters(const ParameterHandler &prm)
ReferenceCell reference_cell
unsigned int n_subdivisions
std::array< Point< spacedim >, GeometryInfo< dim >::vertices_per_cell > vertices
bool points_are_available
std::array< unsigned int, GeometryInfo< dim >::faces_per_cell > neighbors
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > face_indices()
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > vertex_indices()
static void declare_parameters(ParameterHandler ¶m)
void parse_parameters(ParameterHandler ¶m)
DX(const bool write_cells=true, const bool write_faces=false, const bool write_diameter=false, const bool write_measure=false, const bool write_all_faces=true)
static void declare_parameters(ParameterHandler ¶m)
bool color_lines_on_user_flag
unsigned int n_boundary_face_points
void parse_parameters(ParameterHandler ¶m)
EpsFlagsBase(const SizeType size_type=width, const unsigned int size=300, const double line_width=0.5, const bool color_lines_on_user_flag=false, const unsigned int n_boundary_face_points=2, const bool color_lines_level=false)
void parse_parameters(ParameterHandler ¶m)
void parse_parameters(ParameterHandler ¶m)
void parse_parameters(ParameterHandler ¶m)
unsigned int n_extra_curved_line_points
void parse_parameters(ParameterHandler ¶m)
Gnuplot(const bool write_cell_number=false, const unsigned int n_extra_curved_line_points=2, const bool curved_inner_cells=false, const bool write_additional_boundary_lines=true)
static void declare_parameters(ParameterHandler ¶m)
bool write_additional_boundary_lines
void parse_parameters(ParameterHandler ¶m)
static void declare_parameters(ParameterHandler ¶m)
Msh(const bool write_faces=false, const bool write_lines=false)
void parse_parameters(ParameterHandler ¶m)
static void declare_parameters(ParameterHandler ¶m)
bool label_level_subdomain_id
unsigned int line_thickness
bool convert_level_number_to_height
Svg(const unsigned int line_thickness=2, const unsigned int boundary_line_thickness=4, const bool margin=true, const Background background=white, const int azimuth_angle=0, const int polar_angle=0, const Coloring coloring=level_number, const bool convert_level_number_to_height=false, const bool label_level_number=false, const bool label_cell_index=false, const bool label_material_id=false, const bool label_subdomain_id=false, const bool draw_colorbar=false, const bool draw_legend=false, const bool label_boundary_id=false)
@ level_subdomain_id
Convert the level subdomain id into the cell color.
@ subdomain_id
Convert the subdomain id into the cell color.
@ material_id
Convert the material id into the cell color (default)
@ level_number
Convert the level number into the cell color.
unsigned int boundary_line_thickness
float level_height_factor
Ucd(const bool write_preamble=false, const bool write_faces=false, const bool write_lines=false)
static void declare_parameters(ParameterHandler ¶m)
void parse_parameters(ParameterHandler ¶m)
bool output_only_relevant
bool serialize_triangulation
unsigned int n_boundary_face_points
@ level_number
Convert the level into the cell color.
@ material_id
Convert the material id into the cell color.
@ level_subdomain_id
Convert the level subdomain id into the cell color.
@ subdomain_id
Convert the global subdomain id into the cell color.
void parse_parameters(ParameterHandler ¶m)
static void declare_parameters(ParameterHandler ¶m)
enum GridOutFlags::XFig::Coloring color_by