From 68d30c7a66ba4872d7ce9cd052c75d48555a70a7 Mon Sep 17 00:00:00 2001 From: "Dmitry Yu. Naumov" <github@naumov.de> Date: Wed, 10 Jun 2015 14:57:00 +0000 Subject: [PATCH] [MeL] Use Point3d. Remove private fcts from iface. Use Point3d instead of a Node in ElementCoordinatesMappingLocal. Move local functions to cpp in detail namespace. --- MeshLib/ElementCoordinatesMappingLocal.cpp | 83 +++++++++++-------- MeshLib/ElementCoordinatesMappingLocal.h | 16 +--- .../NaturalCoordinatesMapping-impl.h | 2 +- Tests/MeshLib/TestCoordinatesMappingLocal.cpp | 2 +- 4 files changed, 52 insertions(+), 51 deletions(-) diff --git a/MeshLib/ElementCoordinatesMappingLocal.cpp b/MeshLib/ElementCoordinatesMappingLocal.cpp index 48ff05b35ad..fc33e3d30fa 100644 --- a/MeshLib/ElementCoordinatesMappingLocal.cpp +++ b/MeshLib/ElementCoordinatesMappingLocal.cpp @@ -16,48 +16,28 @@ #include "MeshLib/Elements/Element.h" #include "MeshLib/Node.h" #include "MathLib/MathTools.h" +#include "MathLib/Point3d.h" #include "MathLib/Vector3.h" -namespace MeshLib +namespace detail { -ElementCoordinatesMappingLocal::ElementCoordinatesMappingLocal( - const Element& e, - const CoordinateSystem &global_coords) -: _coords(global_coords), _matR2global(3,3) +/// rotate points to local coordinates +void rotateToLocal( + const MeshLib::RotationMatrix &matR2local, + std::vector<MathLib::Point3d*> &vec_nodes) { - assert(e.getDimension() <= global_coords.getDimension()); - for(unsigned i = 0; i < e.getNNodes(); i++) - _vec_nodes.push_back(new MeshLib::Node(*(e.getNode(i)))); - - getRotationMatrixToGlobal(e, global_coords, _vec_nodes, _matR2global); -#ifdef OGS_USE_EIGEN - rotateToLocal(_matR2global.transpose(), _vec_nodes); -#else - RotationMatrix* m(_matR2global.transpose()); - rotateToLocal(*m, _vec_nodes); - delete m; -#endif -} - -ElementCoordinatesMappingLocal::~ElementCoordinatesMappingLocal() -{ - for (auto p : _vec_nodes) delete p; + for (auto node : vec_nodes) + node->setCoords((matR2local*(*node)).getCoords()); } -void ElementCoordinatesMappingLocal::rotateToLocal( - const RotationMatrix &matR2local, - std::vector<MeshLib::Node*> &vec_nodes) const -{ - for (MeshLib::Node* node : vec_nodes) - node->setCoords((matR2local*static_cast<MathLib::Point3d>(*node)).getCoords()); -} - -void ElementCoordinatesMappingLocal::getRotationMatrixToGlobal( - const Element &e, - const CoordinateSystem &global_coords, - const std::vector<MeshLib::Node*> &vec_nodes, - RotationMatrix &matR) const +/// get a rotation matrix to the global coordinates +/// it computes R in x=R*x' where x is original coordinates and x' is local coordinates +void getRotationMatrixToGlobal( + const MeshLib::Element &e, + const MeshLib::CoordinateSystem &global_coords, + const std::vector<MathLib::Point3d*> &vec_nodes, + MeshLib::RotationMatrix &matR) { const std::size_t global_dim = global_coords.getDimension(); @@ -76,7 +56,9 @@ void ElementCoordinatesMappingLocal::getRotationMatrixToGlobal( // get plane normal MathLib::Vector3 plane_normal; double d; - GeoLib::getNewellPlane (vec_nodes, plane_normal, d); + //std::tie(plane_normal, d) = GeoLib::getNewellPlane(vec_nodes); + GeoLib::getNewellPlane(vec_nodes, plane_normal, d); + // compute a rotation matrix to XY GeoLib::computeRotationMatrixToXY(plane_normal, matR); // set a transposed matrix @@ -84,5 +66,34 @@ void ElementCoordinatesMappingLocal::getRotationMatrixToGlobal( } } +} // namespace detail + +namespace MeshLib +{ + +ElementCoordinatesMappingLocal::~ElementCoordinatesMappingLocal() +{ + for (auto p : _vec_nodes) delete p; +} + +ElementCoordinatesMappingLocal::ElementCoordinatesMappingLocal( + const Element& e, + const CoordinateSystem &global_coords) +: _coords(global_coords), _matR2global(3,3) +{ + assert(e.getDimension() <= global_coords.getDimension()); + _vec_nodes.reserve(e.getNNodes()); + for(unsigned i = 0; i < e.getNNodes(); i++) + _vec_nodes.push_back(new MathLib::Point3d(*static_cast<MathLib::Point3d const*>(e.getNode(i)))); + + detail::getRotationMatrixToGlobal(e, global_coords, _vec_nodes, _matR2global); +#ifdef OGS_USE_EIGEN + detail::rotateToLocal(_matR2global.transpose(), _vec_nodes); +#else + RotationMatrix* m(_matR2global.transpose()); + detail::rotateToLocal(*m, _vec_nodes); + delete m; +#endif +} } // MeshLib diff --git a/MeshLib/ElementCoordinatesMappingLocal.h b/MeshLib/ElementCoordinatesMappingLocal.h index 9d393ea4c23..d89b0514ca4 100644 --- a/MeshLib/ElementCoordinatesMappingLocal.h +++ b/MeshLib/ElementCoordinatesMappingLocal.h @@ -54,27 +54,17 @@ public: const CoordinateSystem getGlobalCoordinateSystem() const { return _coords; } /// return mapped coordinates of the node - const MeshLib::Node* getMappedCoordinates(size_t node_id) const + MathLib::Point3d const& getMappedCoordinates(std::size_t node_id) const { - return _vec_nodes[node_id]; + return *_vec_nodes[node_id]; } /// return a rotation matrix converting to global coordinates const RotationMatrix& getRotationMatrixToGlobal() const {return _matR2global;} -private: - /// rotate points to local coordinates - void rotateToLocal(const RotationMatrix &matR2local, std::vector<MeshLib::Node*> &vec_pt) const; - - /// get a rotation matrix to the global coordinates - /// it computes R in x=R*x' where x is original coordinates and x' is local coordinates - void getRotationMatrixToGlobal( - const Element &e, const CoordinateSystem &coordinate_system, - const std::vector<MeshLib::Node*> &vec_pt, RotationMatrix &matR2original) const; - private: const CoordinateSystem _coords; - std::vector<MeshLib::Node*> _vec_nodes; + std::vector<MathLib::Point3d*> _vec_nodes; RotationMatrix _matR2global; }; diff --git a/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping-impl.h b/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping-impl.h index 7887386e12b..1e3fcf58311 100644 --- a/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping-impl.h +++ b/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping-impl.h @@ -67,7 +67,7 @@ inline void computeMappingMatrices( //jacobian: J=[dx/dr dy/dr // dx/ds dy/ds] for (std::size_t k=0; k<nnodes; k++) { - const MeshLib::Node& mapped_pt = *ele_local_coord.getMappedCoordinates(k); + const MathLib::Point3d& mapped_pt = ele_local_coord.getMappedCoordinates(k); // outer product of dNdr and mapped_pt for a particular node for (std::size_t i_r=0; i_r<dim; i_r++) { for (std::size_t j_x=0; j_x<dim; j_x++) { diff --git a/Tests/MeshLib/TestCoordinatesMappingLocal.cpp b/Tests/MeshLib/TestCoordinatesMappingLocal.cpp index e2679222691..cc01c645903 100644 --- a/Tests/MeshLib/TestCoordinatesMappingLocal.cpp +++ b/Tests/MeshLib/TestCoordinatesMappingLocal.cpp @@ -141,7 +141,7 @@ void debugOutput(MeshLib::Element *ele, MeshLib::ElementCoordinatesMappingLocal // check if using the rotation matrix results in the original coordinates #define CHECK_COORDS(ele, mapping)\ for (unsigned ii=0; ii<ele->getNNodes(); ii++) {\ - MathLib::Point3d global(matR*static_cast<MathLib::Point3d>(*mapping.getMappedCoordinates(ii)));\ + MathLib::Point3d global(matR*mapping.getMappedCoordinates(ii));\ const double eps(std::numeric_limits<double>::epsilon());\ ASSERT_ARRAY_NEAR(&(*ele->getNode(ii))[0], global.getCoords(), 3u, eps);\ } -- GitLab