60template <ShapeMatrixType FIELD_TYPE>
65template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
68 const double* natural_pt,
70 T_SHAPE_MATRICES& shapemat,
73 T_SHAPE_FUNC::computeShapeFunction(natural_pt, shapemat.N);
76template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
79 [[maybe_unused]]
const double* natural_pt,
81 [[maybe_unused]] T_SHAPE_MATRICES& shapemat,
84 if constexpr (T_SHAPE_FUNC::DIM != 0)
86 double*
const dNdr = shapemat.dNdr.data();
87 T_SHAPE_FUNC::computeGradShapeFunction(natural_pt, dNdr);
101 ERR(
"det J = {:g} is negative for element {:d}.",
105 std::cerr << element <<
"\n";
108 "Please check whether the node numbering of the element is correct,"
109 "or additional elements (like boundary elements) are still present "
115 ERR(
"det J is zero for element {:d}.", element.
getID());
117 std::cerr << element <<
"\n";
120 "Please check whether:\n"
121 "\t the element nodes may have the same coordinates,\n"
122 "\t or the coordinates of all nodes are not given on the x-axis "
123 "for a 1D problem or in the xy-plane in the 2D case.\n"
124 "The first case can occur, if not all boundary elements"
125 "were removed from the bulk mesh.");
129template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
132 [[maybe_unused]]
const double* natural_pt,
134 T_SHAPE_MATRICES& shapemat,
137 if constexpr (T_SHAPE_FUNC::DIM != 0)
139 computeMappingMatrices<T_SHAPE_FUNC, T_SHAPE_MATRICES>(
146 auto const dim = T_SHAPE_FUNC::DIM;
147 auto const nnodes = T_SHAPE_FUNC::NPOINTS;
150 for (
auto k =
decltype(nnodes){0}; k < nnodes; k++)
155 for (
auto i_r =
decltype(dim){0}; i_r < dim; i_r++)
157 for (
auto j_x =
decltype(dim){0}; j_x < dim; j_x++)
159 shapemat.J(i_r, j_x) +=
160 shapemat.dNdr(i_r, k) * mapped_pt[j_x];
165 shapemat.detJ = shapemat.J.determinant();
174template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
177 const double* natural_pt,
179 T_SHAPE_MATRICES& shapemat,
182 computeMappingMatrices<T_SHAPE_FUNC, T_SHAPE_MATRICES>(
188 computeMappingMatrices<T_SHAPE_FUNC, T_SHAPE_MATRICES>(
196template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
199 const double* natural_pt,
201 T_SHAPE_MATRICES& shapemat,
204 computeMappingMatrices<T_SHAPE_FUNC, T_SHAPE_MATRICES>(
210 if constexpr (T_SHAPE_FUNC::DIM != 0)
215 shapemat.invJ.noalias() = shapemat.J.inverse();
219 if (global_dim == T_SHAPE_FUNC::DIM)
222 .template topLeftCorner<T_SHAPE_FUNC::DIM,
223 T_SHAPE_FUNC::NPOINTS>()
224 .noalias() = shapemat.invJ * shapemat.dNdr;
230 global_dim, T_SHAPE_FUNC::DIM))
233 auto const invJ_dNdr = shapemat.invJ * shapemat.dNdr;
234 auto const dshape_global = matR * invJ_dNdr;
236 dshape_global.topLeftCorner(global_dim, T_SHAPE_FUNC::NPOINTS);
241template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
244 const double* natural_pt,
246 T_SHAPE_MATRICES& shapemat,
249 computeMappingMatrices<T_SHAPE_FUNC, T_SHAPE_MATRICES>(
255 computeMappingMatrices<T_SHAPE_FUNC, T_SHAPE_MATRICES>(
263template <
class T_SHAPE_FUNC,
264 class T_SHAPE_MATRICES,
267 const double* natural_pt,
268 T_SHAPE_MATRICES& shapemat,
269 const unsigned global_dim)
274 detail::computeMappingMatrices<T_SHAPE_FUNC, T_SHAPE_MATRICES>(
282#define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
283 SHAPE, DIM, WHICHPART, SHAPEMATRIXPOLICY) \
284 template void naturalCoordinatesMappingComputeShapeMatrices< \
286 SHAPEMATRIXPOLICY<NumLib::SHAPE, DIM>::ShapeMatrices, \
287 ShapeMatrixType::WHICHPART>( \
288 MeshLib::Element const&, \
290 SHAPEMATRIXPOLICY<NumLib::SHAPE, DIM>::ShapeMatrices&, \
291 const unsigned global_dim)
293#define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_DYN(SHAPE) \
294 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
295 SHAPE, 0, ALL, EigenDynamicShapeMatrixPolicy); \
297 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
298 SHAPE, 0, N, EigenDynamicShapeMatrixPolicy); \
299 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
300 SHAPE, 0, DNDR, EigenDynamicShapeMatrixPolicy); \
301 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
302 SHAPE, 0, N_J, EigenDynamicShapeMatrixPolicy); \
303 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
304 SHAPE, 0, DNDR_J, EigenDynamicShapeMatrixPolicy); \
305 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
306 SHAPE, 0, DNDX, EigenDynamicShapeMatrixPolicy)
308#define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_FIX(SHAPE, DIM) \
309 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
310 SHAPE, DIM, ALL, EigenFixedShapeMatrixPolicy); \
312 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
313 SHAPE, DIM, N, EigenFixedShapeMatrixPolicy); \
314 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
315 SHAPE, DIM, DNDR, EigenFixedShapeMatrixPolicy); \
316 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
317 SHAPE, DIM, N_J, EigenFixedShapeMatrixPolicy); \
318 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
319 SHAPE, DIM, DNDR_J, EigenFixedShapeMatrixPolicy); \
320 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
321 SHAPE, DIM, DNDX, EigenFixedShapeMatrixPolicy)
void ERR(char const *fmt, Args const &... args)
const RotationMatrix & getRotationMatrixToGlobal() const
return a rotation matrix converting to global coordinates
MathLib::Point3d const & getMappedCoordinates(std::size_t node_id) const
return mapped coordinates of the node
unsigned getGlobalDimension() const
return the global dimension
virtual constexpr unsigned getDimension() const =0
Get dimension of the mesh element.
virtual std::size_t getID() const final
Returns the ID of the element.
Shape function for a point element in natural coordinates.
OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_FIX(ShapeHex20, 1)
void naturalCoordinatesMappingComputeShapeMatrices(const MeshLib::Element &ele, const double *natural_pt, T_SHAPE_MATRICES &shapemat, const unsigned global_dim)
Used to explicitly instantiate the NaturalCoordinatesMapping class template.
void computeMappingMatrices(const MeshLib::Element &, const double *natural_pt, const MeshLib::ElementCoordinatesMappingLocal &, T_SHAPE_MATRICES &shapemat, FieldType< ShapeMatrixType::N >)
OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_DYN(ShapeHex20)
static void checkJacobianDeterminant(const double detJ, MeshLib::Element const &element)
ShapeMatrixType
Shape matrix type to be calculated.