diff --git a/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.cpp b/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.cpp index 1938678bdc7b218eab88b7e672ab2ce0f7d906b6..e025ba6b85a10af8e806af8577828948da7e6bd5 100644 --- a/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.cpp +++ b/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.cpp @@ -129,6 +129,7 @@ computeMappingMatrices( shapemat.detJ = shapemat.J.determinant(); #ifndef NDEBUG + // TODO make fatal? if (shapemat.detJ<=.0) ERR("det|J|=%e is not positive.\n", shapemat.detJ); #endif @@ -180,7 +181,7 @@ computeMappingMatrices( auto const nnodes(shapemat.dNdr.cols()); auto const ele_dim(shapemat.dNdr.rows()); assert(shapemat.dNdr.rows()==ele.getDimension()); - const unsigned global_dim(ele_local_coord.getGlobalCoordinateSystem().getDimension()); + const unsigned global_dim = ele_local_coord.getGlobalDimension(); if (global_dim==ele_dim) { shapemat.dNdx.topLeftCorner(ele_dim, nnodes).noalias() = shapemat.invJ * shapemat.dNdr; } else { @@ -226,10 +227,10 @@ template <class T_MESH_ELEMENT, ShapeMatrixType T_SHAPE_MATRIX_TYPE> void naturalCoordinatesMappingComputeShapeMatrices(const T_MESH_ELEMENT& ele, const double* natural_pt, - T_SHAPE_MATRICES& shapemat) + T_SHAPE_MATRICES& shapemat, + const unsigned global_dim) { - const MeshLib::CoordinateSystem coords(ele); - const MeshLib::ElementCoordinatesMappingLocal ele_local_coord(ele, coords); + const MeshLib::ElementCoordinatesMappingLocal ele_local_coord(ele, global_dim); detail::computeMappingMatrices< T_MESH_ELEMENT, @@ -251,7 +252,8 @@ void naturalCoordinatesMappingComputeShapeMatrices(const T_MESH_ELEMENT& ele, ShapeMatrixType::WHICHPART>( \ MeshLib::TemplateElement<MeshLib::RULE> const&, \ double const*, \ - SHAPEMATRIXPOLICY<NumLib::SHAPE, DIM>::ShapeMatrices&) + SHAPEMATRIXPOLICY<NumLib::SHAPE, DIM>::ShapeMatrices&, \ + const unsigned global_dim) #define OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_DYN(RULE, SHAPE) \ OGS_INSTANTIATE_NATURAL_COORDINATES_MAPPING_PART( \ diff --git a/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.h b/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.h index b066c597d9c22761b1b3f95bf60e9041e14c14b6..22fbac0459fa1c4f617f6dc3c2fa7539e2c2d59d 100644 --- a/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.h +++ b/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.h @@ -28,7 +28,8 @@ template <class T_MESH_ELEMENT, ShapeMatrixType T_SHAPE_MATRIX_TYPE> void naturalCoordinatesMappingComputeShapeMatrices(const T_MESH_ELEMENT& ele, const double* natural_pt, - T_SHAPE_MATRICES& shapemat); + T_SHAPE_MATRICES& shapemat, + const unsigned global_dim); } // namespace detail /** @@ -54,9 +55,10 @@ struct NaturalCoordinatesMapping */ static void computeShapeMatrices(const T_MESH_ELEMENT& ele, const double* natural_pt, - T_SHAPE_MATRICES& shapemat) + T_SHAPE_MATRICES& shapemat, + const unsigned global_dim) { - computeShapeMatrices<ShapeMatrixType::ALL>(ele, natural_pt, shapemat); + computeShapeMatrices<ShapeMatrixType::ALL>(ele, natural_pt, shapemat, global_dim); } /** @@ -72,13 +74,14 @@ struct NaturalCoordinatesMapping template <ShapeMatrixType T_SHAPE_MATRIX_TYPE> static void computeShapeMatrices(const T_MESH_ELEMENT& ele, const double* natural_pt, - T_SHAPE_MATRICES& shapemat) + T_SHAPE_MATRICES& shapemat, + const unsigned global_dim) { detail::naturalCoordinatesMappingComputeShapeMatrices< T_MESH_ELEMENT, T_SHAPE_FUNC, T_SHAPE_MATRICES, - T_SHAPE_MATRIX_TYPE>(ele, natural_pt, shapemat); + T_SHAPE_MATRIX_TYPE>(ele, natural_pt, shapemat, global_dim); } }; diff --git a/NumLib/Fem/FiniteElement/TemplateIsoparametric.h b/NumLib/Fem/FiniteElement/TemplateIsoparametric.h index 54931172ea380465f9c92e4ab855c77440a770dc..0ec829ad1230dcc02acb028f7ea28c15580411a9 100644 --- a/NumLib/Fem/FiniteElement/TemplateIsoparametric.h +++ b/NumLib/Fem/FiniteElement/TemplateIsoparametric.h @@ -77,16 +77,17 @@ public: { this->_ele = &e; } - /** * compute shape functions * * @param natural_pt position in natural coordinates * @param shape evaluated shape function matrices */ - void computeShapeFunctions(const double *natural_pt, ShapeMatrices &shape) const + void computeShapeFunctions(const double* natural_pt, ShapeMatrices& shape, + const unsigned global_dim) const { - NaturalCoordsMappingType::computeShapeMatrices(*_ele, natural_pt, shape); + NaturalCoordsMappingType::computeShapeMatrices(*_ele, natural_pt, shape, + global_dim); } /** @@ -97,12 +98,13 @@ public: * @param shape evaluated shape function matrices */ template <ShapeMatrixType T_SHAPE_MATRIX_TYPE> - void computeShapeFunctions(const double *natural_pt, ShapeMatrices &shape) const + void computeShapeFunctions(const double* natural_pt, ShapeMatrices& shape, + const unsigned global_dim) const { - NaturalCoordsMappingType::template computeShapeMatrices<T_SHAPE_MATRIX_TYPE>(*_ele, natural_pt, shape); + NaturalCoordsMappingType::template computeShapeMatrices< + T_SHAPE_MATRIX_TYPE>(*_ele, natural_pt, shape, global_dim); } - private: const MeshElementType* _ele; };