60 template <ShapeMatrixType FIELD_TYPE>
65 template <
class T_MESH_ELEMENT,
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
67 const T_MESH_ELEMENT& ,
68 const double* natural_pt,
70 T_SHAPE_MATRICES& shapemat,
73 T_SHAPE_FUNC::computeShapeFunction(natural_pt, shapemat.N);
76 template <
class T_MESH_ELEMENT,
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
78 const T_MESH_ELEMENT& ,
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.");
129 template <
class T_MESH_ELEMENT,
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
131 const T_MESH_ELEMENT& ele,
132 [[maybe_unused]]
const double* natural_pt,
134 T_SHAPE_MATRICES& shapemat,
137 if constexpr (T_SHAPE_FUNC::DIM != 0)
139 computeMappingMatrices<T_MESH_ELEMENT, T_SHAPE_FUNC, T_SHAPE_MATRICES>(
146 auto const dim = T_MESH_ELEMENT::dimension;
147 auto const nnodes = T_MESH_ELEMENT::n_all_nodes;
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();
174 template <
class T_MESH_ELEMENT,
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
176 const T_MESH_ELEMENT& ele,
177 const double* natural_pt,
179 T_SHAPE_MATRICES& shapemat,
182 computeMappingMatrices<T_MESH_ELEMENT, T_SHAPE_FUNC, T_SHAPE_MATRICES>(
188 computeMappingMatrices<T_MESH_ELEMENT, T_SHAPE_FUNC, T_SHAPE_MATRICES>(
196 template <
class T_MESH_ELEMENT,
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
198 const T_MESH_ELEMENT& ele,
199 const double* natural_pt,
201 T_SHAPE_MATRICES& shapemat,
204 computeMappingMatrices<T_MESH_ELEMENT, T_SHAPE_FUNC, T_SHAPE_MATRICES>(
210 if constexpr (T_SHAPE_FUNC::DIM != 0)
215 shapemat.invJ.noalias() = shapemat.J.inverse();
217 assert(shapemat.dNdr.rows() == ele.getDimension());
219 .template topLeftCorner<T_SHAPE_FUNC::DIM, T_SHAPE_FUNC::NPOINTS>()
220 .noalias() = shapemat.invJ * shapemat.dNdr;
224 template <
class T_MESH_ELEMENT,
class T_SHAPE_FUNC,
class T_SHAPE_MATRICES>
226 const T_MESH_ELEMENT& ele,
227 const double* natural_pt,
229 T_SHAPE_MATRICES& shapemat,
232 computeMappingMatrices<T_MESH_ELEMENT, T_SHAPE_FUNC, T_SHAPE_MATRICES>(
238 computeMappingMatrices<T_MESH_ELEMENT, T_SHAPE_FUNC, T_SHAPE_MATRICES>(
246 template <
class T_MESH_ELEMENT,
248 class T_SHAPE_MATRICES,
251 const double* natural_pt,
252 T_SHAPE_MATRICES& shapemat,
253 const unsigned global_dim)
259 computeMappingMatrices<T_MESH_ELEMENT, T_SHAPE_FUNC, T_SHAPE_MATRICES>(
267 #define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
268 RULE, SHAPE, DIM, WHICHPART, SHAPEMATRIXPOLICY) \
269 template void naturalCoordinatesMappingComputeShapeMatrices< \
270 MeshLib::TemplateElement<MeshLib::RULE>, \
272 SHAPEMATRIXPOLICY<NumLib::SHAPE, DIM>::ShapeMatrices, \
273 ShapeMatrixType::WHICHPART>( \
274 MeshLib::TemplateElement<MeshLib::RULE> const&, \
276 SHAPEMATRIXPOLICY<NumLib::SHAPE, DIM>::ShapeMatrices&, \
277 const unsigned global_dim)
279 #define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_DYN(RULE, SHAPE) \
280 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
281 RULE, SHAPE, 0, ALL, EigenDynamicShapeMatrixPolicy); \
283 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
284 RULE, SHAPE, 0, N, EigenDynamicShapeMatrixPolicy); \
285 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
286 RULE, SHAPE, 0, DNDR, EigenDynamicShapeMatrixPolicy); \
287 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
288 RULE, SHAPE, 0, N_J, EigenDynamicShapeMatrixPolicy); \
289 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
290 RULE, SHAPE, 0, DNDR_J, EigenDynamicShapeMatrixPolicy); \
291 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
292 RULE, SHAPE, 0, DNDX, EigenDynamicShapeMatrixPolicy)
294 #define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_FIX(RULE, SHAPE, DIM) \
295 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
296 RULE, SHAPE, DIM, ALL, EigenFixedShapeMatrixPolicy); \
298 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
299 RULE, SHAPE, DIM, N, EigenFixedShapeMatrixPolicy); \
300 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
301 RULE, SHAPE, DIM, DNDR, EigenFixedShapeMatrixPolicy); \
302 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
303 RULE, SHAPE, DIM, N_J, EigenFixedShapeMatrixPolicy); \
304 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
305 RULE, SHAPE, DIM, DNDR_J, EigenFixedShapeMatrixPolicy); \
306 OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \
307 RULE, SHAPE, DIM, DNDX, EigenFixedShapeMatrixPolicy)
void ERR(char const *fmt, Args const &... args)
MathLib::Point3d const & getMappedCoordinates(std::size_t node_id) const
return mapped coordinates of the node
virtual std::size_t getID() const final
Returns the ID of the element.
Shape function for a point element in natural coordinates.
void naturalCoordinatesMappingComputeShapeMatrices(const T_MESH_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 T_MESH_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)
OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_FIX(HexRule20, ShapeHex20, 1)
OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_DYN(HexRule20, ShapeHex20)
ShapeMatrixType
Shape matrix type to be calculated.