54template <ShapeMatrixType FIELD_TYPE>
59template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
62 const double* natural_pt,
64 T_SHAPE_MATRICES& shapemat,
67 T_SHAPE_FUNC::computeShapeFunction(natural_pt, shapemat.N);
70template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
73 [[maybe_unused]]
const double* natural_pt,
75 [[maybe_unused]] T_SHAPE_MATRICES& shapemat,
78 if constexpr (T_SHAPE_FUNC::DIM != 0)
80 double*
const dNdr = shapemat.dNdr.data();
81 T_SHAPE_FUNC::computeGradShapeFunction(natural_pt, dNdr);
95 ERR(
"det J = {:g} is negative for element {:d}.",
99 std::cerr << element <<
"\n";
102 "Please check whether the node numbering of the element is correct,"
103 "or additional elements (like boundary elements) are still present "
109 ERR(
"det J is zero for element {:d}.", element.
getID());
111 std::cerr << element <<
"\n";
114 "Please check whether:\n"
115 "\t the element nodes may have the same coordinates,\n"
116 "\t or the coordinates of all nodes are not given on the x-axis "
117 "for a 1D problem or in the xy-plane in the 2D case.\n"
118 "The first case can occur, if not all boundary elements"
119 "were removed from the bulk mesh.");
123template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
126 [[maybe_unused]]
const double* natural_pt,
128 T_SHAPE_MATRICES& shapemat,
131 if constexpr (T_SHAPE_FUNC::DIM != 0)
140 auto constexpr nnodes = T_SHAPE_FUNC::NPOINTS;
143 for (
auto k =
decltype(nnodes){0}; k < nnodes; k++)
148 shapemat.dNdr.col(k) *
152 shapemat.detJ = shapemat.J.determinant();
161template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
164 const double* natural_pt,
166 T_SHAPE_MATRICES& shapemat,
183template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
186 const double* natural_pt,
188 T_SHAPE_MATRICES& shapemat,
197 if constexpr (T_SHAPE_FUNC::DIM != 0)
202 shapemat.invJ.noalias() = shapemat.J.inverse();
206 if (global_dim == T_SHAPE_FUNC::DIM)
209 .template topLeftCorner<T_SHAPE_FUNC::DIM,
210 T_SHAPE_FUNC::NPOINTS>()
211 .noalias() = shapemat.invJ * shapemat.dNdr;
217 global_dim, T_SHAPE_FUNC::DIM))
220 auto const invJ_dNdr = shapemat.invJ * shapemat.dNdr;
221 auto const dshape_global = matR * invJ_dNdr;
223 dshape_global.topLeftCorner(global_dim, T_SHAPE_FUNC::NPOINTS);
228template <
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
231 const double* natural_pt,
233 T_SHAPE_MATRICES& shapemat,
250template <
class T_SHAPE_FUNC,
251 class T_SHAPE_MATRICES,
254 const double* natural_pt,
255 T_SHAPE_MATRICES& shapemat,
256 const unsigned global_dim)
269#define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
270 SHAPE, DIM, WHICHPART, SHAPEMATRIXPOLICY) \
271 template void naturalCoordinatesMappingComputeShapeMatrices< \
273 SHAPEMATRIXPOLICY<NumLib::SHAPE, DIM>::ShapeMatrices, \
274 ShapeMatrixType::WHICHPART>( \
275 MeshLib::Element const&, \
277 SHAPEMATRIXPOLICY<NumLib::SHAPE, DIM>::ShapeMatrices&, \
278 const unsigned global_dim)
280#define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_DYN(SHAPE) \
281 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
282 SHAPE, 0, ALL, EigenDynamicShapeMatrixPolicy); \
284 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
285 SHAPE, 0, N, EigenDynamicShapeMatrixPolicy); \
286 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
287 SHAPE, 0, DNDR, EigenDynamicShapeMatrixPolicy); \
288 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
289 SHAPE, 0, N_J, EigenDynamicShapeMatrixPolicy); \
290 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
291 SHAPE, 0, DNDR_J, EigenDynamicShapeMatrixPolicy); \
292 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
293 SHAPE, 0, DNDX, EigenDynamicShapeMatrixPolicy)
295#define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_FIX(SHAPE, DIM) \
296 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
297 SHAPE, DIM, ALL, EigenFixedShapeMatrixPolicy); \
299 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
300 SHAPE, DIM, N, EigenFixedShapeMatrixPolicy); \
301 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
302 SHAPE, DIM, DNDR, EigenFixedShapeMatrixPolicy); \
303 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
304 SHAPE, DIM, N_J, EigenFixedShapeMatrixPolicy); \
305 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
306 SHAPE, DIM, DNDR_J, EigenFixedShapeMatrixPolicy); \
307 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
308 SHAPE, DIM, DNDX, EigenFixedShapeMatrixPolicy)
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
#define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_FIX(SHAPE, DIM)
#define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_DYN(SHAPE)
Eigen::Vector3d const & asEigenVector3d() const
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.
std::size_t getID() const
Returns the ID of the element.
Shape function for a point element in natural coordinates.
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 >)
static void checkJacobianDeterminant(const double detJ, MeshLib::Element const &element)
ShapeMatrixType
Shape matrix type to be calculated.