1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
// Copyright (C) 2019 Jorgen S. Dokken
//
// This file is part of DOLFINx (https://www.fenicsproject.org)
//
// SPDX-License-Identifier: LGPL-3.0-or-later
#pragma once
#include <array>
#include <cstdint>
#include <dolfinx/mesh/cell_types.h>
#include <span>
#include <vector>
/// @brief Functions for the re-ordering of input mesh topology to the
/// DOLFINx ordering, and transpose orderings for file output.
///
/// Basix ordering is used for the geometry nodes, and is shown below
/// for a range of cell types.
/*!
@verbatim
Triangle: Triangle6: Triangle10:
v
^
|
2 2 2
|`\ |`\ | \
| `\ | `\ 6 4
| `\ 4 `3 | \
| `\ | `\ 5 9 3
| `\ | `\ | \
0----------1 --> u 0-----5----1 0---7---8---1
Quadrilateral: Quadrilateral9: Quadrilateral16:
v
^
|
2-----------3 2-----7-----3 2--10--11---3
| | | | | |
| | | | 7 14 15 9
| | 5 8 6 | |
| | | | 6 12 13 8
| | | | | |
0-----------1 --> u 0-----4-----1 0---4---5---1
Tetrahedron: Tetrahedron10: Tetrahedron20
v
/
2 2 2
,/|`\ ,/\`\ ,/|`\
,/ \ `\ ,/ \ `\. 13 | `9
,/ '. `\ ,8 '. `6 ,/ 4 `\
,/ | `\ ,/ 4 `\ 12 19 | `8
,/ | `\ ,/ | `\ ,/ | `\
0-----------'.--------1 -> u 0--------9--'.--------1 0-----14----'.--15----1
`\. | ,/ `\. | ,/ `\. 17 | 16 ,/
`\. | ,/ `\. | ,5 10. 18 5 ,6
`\. '. ,/ `7. '. ,/ `\. . 7
`\. |/ `\. |/ 11. |/
`3 `3 `3
`\.
w
Hexahedron: Hexahedron27:
w
6----------7 6----19----7
/| ^ v /| /| /|
/ | | / / | 17 | 25 18|
/ | | / / | / 14 24 / 15
4----------5 | 4----16----5 |
| | +--|---|--> u |22 | 26 | 23|
| 2------+---3 | 2----13+---3
| / | / 10 / 21 12 /
| / | / | 9 20 | 11
|/ |/ |/ |/
0----------1 0-----8----1
Prism: Prism15:
w
^
|
3 3
,/|`\ ,/|`\
,/ | `\ 12 | 13
,/ | `\ ,/ | `\
4------+------5 4------14-----5
| | | | 8 |
| ,/|`\ | | | |
| ,/ | `\ | | | |
|,/ 0 `\| 10 0 11
./| ,/ `\ |\ | ,/ `\ |
/ | ,/ `\ | `\ | ,6 `7 |
u |,/ `\| v |,/ `\|
1-------------2 1------9------2
Pyramid: Pyramid13:
4 4
,/|\ ,/|\
,/ .'|\ ,/ .'|\
v ,/ | | \ ,/ | | \
\. ,/ .' | `. ,/ .' | `.
\. | '. \ 11 | 12 \
,/ \. .' w | \ ,/ .' | \
,/ \. | ^ | \ ,/ 7 | 9
2----------\'--|-3 `. 2-------10-.'----3 `.
`\ | \.| `\ \ `\ | `\ \
`\ .' +----`\ - \ -> u `6 .' 8 \
`\ | `\ \ `\ | `\ \
`\.' ` `\ `\.' ` `\
0-----------------1 0--------5--------1
@endverbatim
*/
namespace dolfinx::io::cells
{
/// @brief Get the Lagrange order of a given cell with a given number of
/// nodes.
///
/// @param[in] type Cell shape.
/// @param[in] num_nodes Number of cell 'nodes'
/// @return Lagrange order of the cell type.
int cell_degree(mesh::CellType type, int num_nodes);
/// @brief Permutation array to map from VTK to DOLFINx node ordering.
///
/// @param[in] type Cell shape.
/// @param[in] num_nodes Number of cell 'nodes'
/// @return Permutation array `p` for permuting from VTK ordering to
/// DOLFINx ordering, i.e. `a_dolfin[i] = a_vtk[p[i]]`.
///
/// @details If `p = [0, 2, 1, 3]` and `a = [10, 3, 4, 7]`, then `a_p =
/// [a[p[0]], a[p[1]], a[p[2]], a[p[3]]] = [10, 4, 3, 7]`.
std::vector<std::uint16_t> perm_vtk(mesh::CellType type, int num_nodes);
/// @brief Permutation array to map from Gmsh to DOLFINx node ordering.
///
/// @param[in] type Cell shape.
/// @param[in] num_nodes Number of cell 'nodes'
/// @return Permutation array `p` for permuting from Gmsh ordering to
/// DOLFINx ordering, i.e. `a_dolfin[i] = a_gmsh[p[i]]`.
///
/// @details If `p = [0, 2, 1, 3]` and `a = [10, 3, 4, 7]`, then `a_p
/// =[a[p[0]], a[p[1]], a[p[2]], a[p[3]]] = [10, 4, 3, 7]`.
std::vector<std::uint16_t> perm_gmsh(mesh::CellType type, int num_nodes);
/// @brief Compute the transpose of a re-ordering map.
///
/// @param[in] map A re-ordering map.
/// @return Transpose of the `map`. E.g., is `map = {1, 2, 3, 0}`, the
/// transpose will be `{3 , 0, 1, 2 }`.
std::vector<std::uint16_t> transpose(std::span<const std::uint16_t> map);
/// @brief Permute cell topology by applying a permutation array for
/// each cell.
///
/// @param[in] cells Array of cell topologies, with each row
/// representing a cell (row-major storage).
/// @param[in] shape Shape of the `cells` array.
/// @param[in] p Permutation array that maps `a_p[i] = a[p[i]]`, where
/// `a_p` is the permuted array.
/// @return Permuted cell topology, where for a cell `v_new[i] =
/// v_old[map[i]]`. The storage is row-major and the shape is the same
/// as `cells`.
std::vector<std::int64_t> apply_permutation(std::span<const std::int64_t> cells,
std::array<std::size_t, 2> shape,
std::span<const std::uint16_t> p);
/// @brief Get VTK cell identifier.
///
/// @param[in] cell Cell type.
/// @param[in] dim Topological dimension of the cell.
/// @return VTK cell identifier.
std::int8_t get_vtk_cell_type(mesh::CellType cell, int dim);
} // namespace dolfinx::io::cells
|