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)
104 Msh::Msh(
const bool write_faces,
const bool 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 ITERATOR,
typename END>
3128 generate_triangulation_patches(
3134 for (; 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 const ReferenceCell Tetrahedron
constexpr const ReferenceCell Quadrilateral
constexpr const ReferenceCell Wedge
constexpr const ReferenceCell Pyramid
constexpr const ReferenceCell Triangle
constexpr const ReferenceCell Hexahedron
constexpr const ReferenceCell Vertex
constexpr const 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
::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