21 #ifndef fiber_geometrical_data_hpp
22 #define fiber_geometrical_data_hpp
24 #include "../common/common.hpp"
26 #include "../common/armadillo_fwd.hpp"
27 #include "_3d_array.hpp"
35 enum GeometricalDataType
38 INTEGRATION_ELEMENTS = 0x0002,
40 JACOBIANS_TRANSPOSED = 0x0008,
41 JACOBIAN_INVERSES_TRANSPOSED = 0x0010
45 template <
typename CoordinateType>
class ConstGeometricalDataSlice;
53 template <
typename CoordinateType>
56 arma::Mat<CoordinateType> globals;
57 arma::Row<CoordinateType> integrationElements;
60 arma::Mat<CoordinateType> normals;
64 int pointCount()
const {
65 int result = std::max(std::max(globals.n_cols, normals.n_cols),
66 integrationElements.n_cols);
71 int dimWorld()
const {
72 int result = std::max(globals.n_rows, normals.n_rows);
87 template <
typename CoordinateType>
93 m_geomData(geomData), m_point(point) {}
95 CoordinateType global(
int dim)
const {
96 return m_geomData.globals(dim, m_point);
98 CoordinateType integrationElement()
const {
99 return m_geomData.integrationElements(m_point);
101 CoordinateType jacobianTransposed(
int row,
int col)
const {
102 return m_geomData.jacobiansTransposed(row, col, m_point);
104 CoordinateType jacobianInverseTransposed(
int row,
int col)
const {
105 return m_geomData.jacobianInversesTransposed(row, col, m_point);
107 CoordinateType normal(
int dim)
const {
108 return m_geomData.normals(dim, m_point);
111 int dimWorld()
const {
112 return m_geomData.dimWorld();
118 if (!m_geomData.globals.is_empty())
119 result.globals = m_geomData.globals.col(m_point);
120 if (!m_geomData.integrationElements.is_empty())
121 result.integrationElements =
122 m_geomData.integrationElements(m_point);
123 if (!m_geomData.jacobiansTransposed.is_empty()) {
124 result.jacobiansTransposed.set_size(
125 1, 1, m_geomData.jacobiansTransposed.extent(2));
126 for (
size_t i = 0; i < result.jacobiansTransposed.extent(2); ++i)
127 result.jacobiansTransposed(0, 0, i) =
128 m_geomData.jacobiansTransposed(m_point, m_point, i);
130 if (!m_geomData.jacobianInversesTransposed.is_empty()) {
131 result.jacobianInversesTransposed.set_size(
132 1, 1, m_geomData.jacobianInversesTransposed.extent(2));
133 for (
size_t i = 0; i < result.jacobianInversesTransposed.extent(2); ++i)
134 result.jacobianInversesTransposed(0, 0, i) =
135 m_geomData.jacobianInversesTransposed(m_point, m_point, i);
137 if (!m_geomData.normals.is_empty())
138 result.normals = m_geomData.normals.col(m_point);
Storage of geometrical data.
Definition: geometrical_data.hpp:54
Access to slices of geometrical data.
Definition: geometrical_data.hpp:88