Loading src/UnstructuredMesh/MeshDataContainer/MeshDataContainer.h +27 −23 Original line number Original line Diff line number Diff line Loading @@ -2,7 +2,6 @@ #define MESHDATACONTAINER_H #define MESHDATACONTAINER_H #include "../MeshElements/MeshElement.h" #include "../MeshElements/MeshElement.h" #include "../debug/Debug.h" Loading Loading @@ -80,7 +79,8 @@ private: struct Alocator{ struct Alocator{ MeshDataContainer<DataType, Dimensions...>& parent; MeshDataContainer<DataType, Dimensions...>& parent; template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent ,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { parent.template getDataByPos<pos>().resize( parent.template getDataByPos<pos>().resize( mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); Alocator<pos - 1>::alocateMemory(parent, mesh); Alocator<pos - 1>::alocateMemory(parent, mesh); Loading @@ -88,7 +88,7 @@ private: template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue) { const DataType& initialValue) { parent.template getDataByPos<pos>().resize( parent.template getDataByPos<pos>().resize( mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size(), mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size(), Loading @@ -100,7 +100,8 @@ private: template<typename dummy> template<typename dummy> struct Alocator<0, dummy>{ struct Alocator<0, dummy>{ template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent ,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { parent.template getDataByPos<0>().resize( parent.template getDataByPos<0>().resize( mesh.template getElements<std::get<0>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); mesh.template getElements<std::get<0>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); Loading @@ -108,7 +109,7 @@ private: } } template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue) { const DataType& initialValue) { parent.template getDataByPos<0>().resize( parent.template getDataByPos<0>().resize( Loading Loading @@ -143,36 +144,37 @@ public: } } template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> DataType& at(MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { DataType& at(const MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { return getDataByDim<ElementDim>().at(element.getIndex()); return getDataByDim<ElementDim>().at(element.getIndex()); } } template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> DataType& operator[](MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { DataType& operator[](const MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { return getDataByDim<ElementDim>()[element.getIndex()]; return getDataByDim<ElementDim>()[element.getIndex()]; } } MeshDataContainer(){} MeshDataContainer(){} template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ alocateData(mesh); alocateData(mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, std::integer_sequence<unsigned int,Dimensions...>, DataType){ MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, std::integer_sequence<unsigned int,Dimensions...>, DataType){ alocateData(mesh); alocateData(mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue){ const DataType& initialValue){ alocateData(mesh, initialValue); alocateData(mesh, initialValue); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue, const DataType& initialValue, std::integer_sequence<unsigned int,Dimensions...>, std::integer_sequence<unsigned int,Dimensions...>, DataType){ DataType){ Loading @@ -182,12 +184,12 @@ public: template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> void alocateData(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ void alocateData(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ Alocator<sizeof... (Dimensions) - 1>::alocateMemory(*this, mesh); Alocator<sizeof... (Dimensions) - 1>::alocateMemory(*this, mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> void alocateData(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue){ void alocateData(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue){ Alocator<sizeof... (Dimensions) - 1>::alocateMemory(*this, mesh,initialValue); Alocator<sizeof... (Dimensions) - 1>::alocateMemory(*this, mesh,initialValue); } } Loading Loading @@ -261,7 +263,8 @@ public: template<unsigned int pos, typename _DataType, typename... _DataTypes> template<unsigned int pos, typename _DataType, typename... _DataTypes> struct Alocator{ struct Alocator{ template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent ,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent , const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { parent.template getDataByPos<pos>().resize( parent.template getDataByPos<pos>().resize( mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); Alocator<pos + 1, _DataTypes...>::alocateMemory(parent, mesh); Alocator<pos + 1, _DataTypes...>::alocateMemory(parent, mesh); Loading @@ -269,7 +272,7 @@ public: template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent, static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent, MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const _DataType& initialValue, const _DataType& initialValue, const _DataTypes&... values) { const _DataTypes&... values) { parent.template getDataByPos<pos>().resize( parent.template getDataByPos<pos>().resize( Loading @@ -282,7 +285,8 @@ public: template<typename _DataType, typename... _DataTypes> template<typename _DataType, typename... _DataTypes> struct Alocator<sizeof... (Dimensions) - 1, _DataType, _DataTypes...>{ struct Alocator<sizeof... (Dimensions) - 1, _DataType, _DataTypes...>{ template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent ,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent , const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { parent.template getDataByPos<sizeof... (Dimensions) - 1>().resize( parent.template getDataByPos<sizeof... (Dimensions) - 1>().resize( mesh.template getElements<std::get<sizeof... (Dimensions) - 1>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); mesh.template getElements<std::get<sizeof... (Dimensions) - 1>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); Loading @@ -290,7 +294,7 @@ public: } } template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent, static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent, MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const _DataType& initialValue, const _DataType& initialValue, const _DataTypes&...) { const _DataTypes&...) { Loading Loading @@ -335,12 +339,12 @@ public: } } template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> std::tuple_element_t<dimensionIndex<ElementDim>(), std::tuple<DataTypes...>>& at(MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { std::tuple_element_t<dimensionIndex<ElementDim>(), std::tuple<DataTypes...>>& at(const MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { return getDataByDim<ElementDim>().at(element.getIndex()); return getDataByDim<ElementDim>().at(element.getIndex()); } } template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> std::tuple_element_t<dimensionIndex<ElementDim>(), std::tuple<DataTypes...>>& operator[](MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { std::tuple_element_t<dimensionIndex<ElementDim>(), std::tuple<DataTypes...>>& operator[](const MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { return getDataByDim<ElementDim>()[element.getIndex()]; return getDataByDim<ElementDim>()[element.getIndex()]; } } Loading @@ -349,25 +353,25 @@ public: MeshDataContainer(){} MeshDataContainer(){} template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ alocateData(mesh); alocateData(mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataTypes&... initialValues){ const DataTypes&... initialValues){ alocateData(mesh, initialValues...); alocateData(mesh, initialValues...); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> void alocateData(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ void alocateData(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ Alocator<0, DataTypes...>::alocateMemory(*this, mesh); Alocator<0, DataTypes...>::alocateMemory(*this, mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> void alocateData(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, void alocateData(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataTypes&... initialValues){ const DataTypes&... initialValues){ Alocator<0, DataTypes...>::alocateMemory(*this, mesh, initialValues...); Alocator<0, DataTypes...>::alocateMemory(*this, mesh, initialValues...); } } Loading src/UnstructuredMesh/MeshElements/MeshElement.h +30 −7 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ public: elementIndex = index; elementIndex = index; } } IndexType getIndex(){ IndexType getIndex() const { return elementIndex; return elementIndex; } } Loading Loading @@ -65,15 +65,15 @@ class SubelementContainer : public std::array<Subelement<IndexType>, Reserve>{ unsigned int numberOfElements = 0; unsigned int numberOfElements = 0; public: public: unsigned int getNumberOfSubElements(){ unsigned int getNumberOfSubElements() const { return numberOfElements; return numberOfElements; } } unsigned int size() { unsigned int size() const { return numberOfElements; return numberOfElements; } } unsigned int reserve() { unsigned int reserve() const { return Reserve; return Reserve; } } Loading Loading @@ -206,11 +206,11 @@ public: IndexType getVertexAIndex(){ IndexType getVertexAIndex() const { return vertexAIndex; return vertexAIndex; } } IndexType getVertexBIndex(){ IndexType getVertexBIndex() const { return vertexBIndex; return vertexBIndex; } } Loading Loading @@ -250,7 +250,7 @@ public: } } IndexType getBoundaryElementIndex(){ IndexType getBoundaryElementIndex() const { return boundaryElementIndex; return boundaryElementIndex; } } Loading Loading @@ -348,6 +348,29 @@ public: std::vector<Cell>& getBoundaryCells() { std::vector<Cell>& getBoundaryCells() { return BoundaryCells; return BoundaryCells; } } /* * Constant version of getters * */ const std::vector<Vertex>& getVertices() const { return getElements<0>(); } const std::vector<Edge>& getEdges() const { return getElements<1>(); } const std::vector<Face>& getFaces() const { return getElements<Dimension - 1>(); } const std::vector<Cell>& getCells() const { return getElements<Dimension>(); } const std::vector<Cell>& getBoundaryCells() const { return BoundaryCells; } private: private: template<unsigned int Dim, typename Dummy = void> template<unsigned int Dim, typename Dummy = void> Loading src/UnstructuredMesh/MeshFunctions/CellsDistance.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,7 @@ template <unsigned int Dimension,typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension,typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer<Real, Dimension-1> ComputeCellsDistance(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer<Real, Dimension-1> ComputeCellsDistance(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer<Real, Dimension-1> distances(mesh); MeshDataContainer<Real, Dimension-1> distances(mesh); Loading src/UnstructuredMesh/MeshFunctions/ComputeCenter.h +35 −30 Original line number Original line Diff line number Diff line Loading @@ -14,20 +14,24 @@ struct _ComputeCenters { template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> static void compute( static void compute( MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ auto& elemCenters = centers.template getDataByDim<dim>(); auto& elemCenters = centers.template getDataByDim<dim>(); auto& subElemCenters = centers.template getDataByDim<dim - 1>(); auto& subElemCenters = centers.template getDataByDim<dim - 1>(); for (IndexType i = 0; i < mesh.template getElements<dim>().size(); i++) { for (IndexType i = 0; i < mesh.template getElements<dim>().size(); i++) { auto& element = mesh.template getElements<dim>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; for(auto& sub : element.getSubelements()){ MeshApply<dim, dim - 1, Dimension>::apply( elemCenters.at(i) += subElemCenters.at(sub.index); i, mesh, [&elemCenters, &subElemCenters, &subElemCnt](IndexType elementIndex, IndexType subelementIndex){ elemCenters.at(elementIndex) += subElemCenters.at(subelementIndex); subElemCnt++; subElemCnt++; } } ); elemCenters.at(i) /= subElemCnt; elemCenters.at(i) /= subElemCnt; } } Loading @@ -44,22 +48,25 @@ struct _ComputeCenters { template <unsigned int Dimension, ComputationMethod Method> template <unsigned int Dimension, ComputationMethod Method> struct _ComputeCenters<Dimension, Dimension, Method>{ struct _ComputeCenters<Dimension, Dimension, Method>{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> static void compute(MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ static void compute(MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ auto& elemCenters = centers.template getDataByDim<Dimension>(); auto& elemCenters = centers.template getDataByDim<Dimension>(); auto& subElemCenters = centers.template getDataByDim<Dimension - 1>(); auto& subElemCenters = centers.template getDataByDim<Dimension - 1>(); for (IndexType i = 0; i < mesh.template getElements<Dimension>().size(); i++) { for (IndexType i = 0; i < mesh.template getElements<Dimension>().size(); i++) { auto& element = mesh.template getElements<Dimension>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; IndexType tmpFaceIndex = element.getBoundaryElementIndex(); MeshApply<Dimension, Dimension - 1, Dimension>::apply( do { i, elemCenters.at(i) += subElemCenters.at(tmpFaceIndex); mesh, [&elemCenters, &subElemCenters, &subElemCnt](IndexType elementIndex, IndexType subelementIndex){ elemCenters.at(elementIndex) += subElemCenters.at(subelementIndex); subElemCnt++; subElemCnt++; tmpFaceIndex = mesh.getFaces()[tmpFaceIndex].getNextBElem(i); } } while (tmpFaceIndex != element.getBoundaryElementIndex()); ); elemCenters.at(i) /= subElemCnt; elemCenters.at(i) /= subElemCnt; } } Loading @@ -72,7 +79,7 @@ struct _ComputeCenters<1, Dimension, Method>{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> static void compute( static void compute( MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ std::vector<Vertex<Dimension, Real>>& edgeCenters = centers.template getDataByDim<1>(); std::vector<Vertex<Dimension, Real>>& edgeCenters = centers.template getDataByDim<1>(); Loading @@ -98,40 +105,38 @@ struct _ComputeCenters<2, 3, ComputationMethod::TESSELLATED> { template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> static void compute( static void compute( MakeMeshDataContainer_t<Vertex<3, Real>, make_custom_integer_sequence_t<unsigned int, 1, 3>>& centers, MakeMeshDataContainer_t<Vertex<3, Real>, make_custom_integer_sequence_t<unsigned int, 1, 3>>& centers, MeshElements<3, IndexType, Real, Reserve...>& mesh){ const MeshElements<3, IndexType, Real, Reserve...>& mesh){ DBGMSG("centers computation tessellated"); auto& elemCenters = centers.template getDataByDim<2>(); auto& elemCenters = centers.template getDataByDim<2>(); auto& subElemCenters = centers.template getDataByDim<2 - 1>(); auto& subElemCenters = centers.template getDataByDim<2 - 1>(); for (IndexType i = 0; i < mesh.template getElements<2>().size(); i++) { for (IndexType i = 0; i < mesh.template getElements<2>().size(); i++) { auto& element = mesh.template getElements<2>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; for(auto& sub : element.getSubelements()){ MeshApply<2, 1, 3>::apply(i, mesh,[&](IndexType faceIndex, IndexType edgeIndex){ elemCenters.at(i) += subElemCenters.at(sub.index); elemCenters.at(faceIndex) += subElemCenters.at(edgeIndex); subElemCnt++; subElemCnt++; } }); elemCenters.at(i) /= subElemCnt; } // calculate volume elemCenters.at(i) /= subElemCnt; for (IndexType i = 0; i < mesh.template getElements<2>().size(); i++) { auto& element = mesh.template getElements<2>().at(i); Vertex<3, Real> tempVert = {}; Vertex<3, Real> tempVert = {}; Real surfTotal = 0.0; Real surfTotal = 0.0; for(auto& sub : element.getSubelements()){ MeshApply<2, 1, 3>::apply(i, mesh,[&](IndexType faceIndex, IndexType edgeIndex){ IndexType AI = mesh.getEdges().at(sub.index).getVertexAIndex(); IndexType BI = mesh.getEdges().at(sub.index).getVertexBIndex(); IndexType AI = mesh.getEdges().at(edgeIndex).getVertexAIndex(); std::array<Vertex<3, Real>, 2> v = {elemCenters.at(i) - mesh.getVertices().at(AI), elemCenters.at(i) - mesh.getVertices().at(BI)}; IndexType BI = mesh.getEdges().at(edgeIndex).getVertexBIndex(); std::array<Vertex<3, Real>, 2> v = {elemCenters.at(faceIndex) - mesh.getVertices().at(AI), elemCenters.at(faceIndex) - mesh.getVertices().at(BI)}; std::array<Real, 2> norms; std::array<Real, 2> norms; grammSchmidt<2, 3, IndexType, Real>(v, norms); grammSchmidt<2, 3, IndexType, Real>(v, norms); Real surf = norms.at(0) * 0.5 * norms.at(1); Real surf = norms.at(0) * 0.5 * norms.at(1); tempVert += subElemCenters.at(sub.index) * (surf * (2.0 / 3.0)); tempVert += subElemCenters.at(edgeIndex) * (surf * (2.0 / 3.0)); surfTotal += surf; surfTotal += surf; } }); elemCenters.at(i) = (elemCenters.at(i) / 3.0) + (tempVert / surfTotal); elemCenters.at(i) = (elemCenters.at(i) / 3.0) + (tempVert / surfTotal); } } Loading @@ -144,7 +149,7 @@ struct _ComputeCenters<2, 3, ComputationMethod::TESSELLATED> { template <ComputationMethod Method, unsigned int Dimension,typename IndexType, typename Real, unsigned int ...Reserve> template <ComputationMethod Method, unsigned int Dimension,typename IndexType, typename Real, unsigned int ...Reserve> MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>> MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>> ComputeCenters(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ ComputeCenters(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>> centers(mesh); MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>> centers(mesh); Loading src/UnstructuredMesh/MeshFunctions/MeshApply.h +25 −12 Original line number Original line Diff line number Diff line Loading @@ -10,7 +10,7 @@ template <unsigned int CurrentDimension, unsigned int StartDimension, unsigned i struct MeshRun { struct MeshRun { template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType origElementIndex, IndexType origElementIndex, IndexType index, IndexType index, Func fun){ Func fun){ Loading @@ -32,7 +32,7 @@ template <unsigned int StartDimension, unsigned int TargetDimension, unsigned in struct MeshRun<MeshDimension, StartDimension, TargetDimension, MeshDimension, false, Descend> { struct MeshRun<MeshDimension, StartDimension, TargetDimension, MeshDimension, false, Descend> { template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType origElementIndex, IndexType origElementIndex, IndexType index, IndexType index, Func fun){ Func fun){ Loading @@ -55,7 +55,7 @@ template <unsigned int StartDimension, unsigned int TargetDimension, unsigned in struct MeshRun<1, StartDimension, TargetDimension, MeshDimension, false, Descend> { struct MeshRun<1, StartDimension, TargetDimension, MeshDimension, false, Descend> { template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType origElementIndex, IndexType origElementIndex, IndexType index, IndexType index, Func fun){ Func fun){ Loading @@ -70,33 +70,46 @@ struct MeshRun<1, StartDimension, TargetDimension, MeshDimension, false, Descend template <unsigned int CurrentDimension,unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension, bool Descend> template <unsigned int CurrentDimension,unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension> struct MeshRun<CurrentDimension, StartDimension, TargetDimension, MeshDimension, true, Descend> { struct MeshRun<CurrentDimension, StartDimension, TargetDimension, MeshDimension, true, true> { template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& , static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& , IndexType origElementIndex, IndexType origElementIndex, IndexType index, IndexType index, Functor fun){ Functor fun){ static_assert (std::is_assignable<std::function<void(IndexType, IndexType)>,Functor>::value, static_assert (std::is_assignable<std::function<void(IndexType, IndexType)>,Functor>::value, "The Functor fun must be a function with void return type and two arguments of IndexType,\ "The Functor fun must be a function with void return type and two arguments of IndexType,\ the first is index of StartDimension element and the second is the index of the TargetDimension element"); the first is index of StartDimension element and the second is the index of the TargetDimension element"); if(Descend){ fun(origElementIndex, index); fun(origElementIndex, index); }else{ fun(index, origElementIndex); } } } }; }; template <unsigned int CurrentDimension,unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension> struct MeshRun<CurrentDimension, StartDimension, TargetDimension, MeshDimension, true, false> { template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& , IndexType origElementIndex, IndexType index, Functor fun){ static_assert (std::is_assignable<std::function<void(IndexType, IndexType)>,Functor>::value, "The Functor fun must be a function with void return type and two arguments of IndexType,\ the first is index of StartDimension element and the second is the index of the TargetDimension element"); fun(index, origElementIndex); } }; template <unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension> template <unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension> struct MeshApply { struct MeshApply { template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> static void apply(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, static void apply(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, Functor f) { Functor f) { for (auto& startElement : mesh.template getElements<(StartDimension > TargetDimension) ? StartDimension : TargetDimension>()){ for (auto& startElement : mesh.template getElements<(StartDimension > TargetDimension) ? StartDimension : TargetDimension>()){ MeshRun< MeshRun< Loading @@ -111,7 +124,7 @@ struct MeshApply { template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> static void apply(IndexType elementIndex, static void apply(IndexType elementIndex, MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, Functor f) { Functor f) { MeshRun< MeshRun< (StartDimension > TargetDimension) ? StartDimension : TargetDimension, (StartDimension > TargetDimension) ? StartDimension : TargetDimension, Loading src/UnstructuredMesh/MeshElements/CellConnection.h +5 −5 File changed.Contains only whitespace changes. Show changes Loading
src/UnstructuredMesh/MeshDataContainer/MeshDataContainer.h +27 −23 Original line number Original line Diff line number Diff line Loading @@ -2,7 +2,6 @@ #define MESHDATACONTAINER_H #define MESHDATACONTAINER_H #include "../MeshElements/MeshElement.h" #include "../MeshElements/MeshElement.h" #include "../debug/Debug.h" Loading Loading @@ -80,7 +79,8 @@ private: struct Alocator{ struct Alocator{ MeshDataContainer<DataType, Dimensions...>& parent; MeshDataContainer<DataType, Dimensions...>& parent; template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent ,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { parent.template getDataByPos<pos>().resize( parent.template getDataByPos<pos>().resize( mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); Alocator<pos - 1>::alocateMemory(parent, mesh); Alocator<pos - 1>::alocateMemory(parent, mesh); Loading @@ -88,7 +88,7 @@ private: template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue) { const DataType& initialValue) { parent.template getDataByPos<pos>().resize( parent.template getDataByPos<pos>().resize( mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size(), mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size(), Loading @@ -100,7 +100,8 @@ private: template<typename dummy> template<typename dummy> struct Alocator<0, dummy>{ struct Alocator<0, dummy>{ template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent ,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { parent.template getDataByPos<0>().resize( parent.template getDataByPos<0>().resize( mesh.template getElements<std::get<0>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); mesh.template getElements<std::get<0>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); Loading @@ -108,7 +109,7 @@ private: } } template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , static void alocateMemory(MeshDataContainer<DataType, Dimensions...>& parent , MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue) { const DataType& initialValue) { parent.template getDataByPos<0>().resize( parent.template getDataByPos<0>().resize( Loading Loading @@ -143,36 +144,37 @@ public: } } template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> DataType& at(MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { DataType& at(const MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { return getDataByDim<ElementDim>().at(element.getIndex()); return getDataByDim<ElementDim>().at(element.getIndex()); } } template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> DataType& operator[](MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { DataType& operator[](const MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { return getDataByDim<ElementDim>()[element.getIndex()]; return getDataByDim<ElementDim>()[element.getIndex()]; } } MeshDataContainer(){} MeshDataContainer(){} template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ alocateData(mesh); alocateData(mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, std::integer_sequence<unsigned int,Dimensions...>, DataType){ MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, std::integer_sequence<unsigned int,Dimensions...>, DataType){ alocateData(mesh); alocateData(mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue){ const DataType& initialValue){ alocateData(mesh, initialValue); alocateData(mesh, initialValue); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue, const DataType& initialValue, std::integer_sequence<unsigned int,Dimensions...>, std::integer_sequence<unsigned int,Dimensions...>, DataType){ DataType){ Loading @@ -182,12 +184,12 @@ public: template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> void alocateData(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ void alocateData(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ Alocator<sizeof... (Dimensions) - 1>::alocateMemory(*this, mesh); Alocator<sizeof... (Dimensions) - 1>::alocateMemory(*this, mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> void alocateData(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue){ void alocateData(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataType& initialValue){ Alocator<sizeof... (Dimensions) - 1>::alocateMemory(*this, mesh,initialValue); Alocator<sizeof... (Dimensions) - 1>::alocateMemory(*this, mesh,initialValue); } } Loading Loading @@ -261,7 +263,8 @@ public: template<unsigned int pos, typename _DataType, typename... _DataTypes> template<unsigned int pos, typename _DataType, typename... _DataTypes> struct Alocator{ struct Alocator{ template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent ,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent , const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { parent.template getDataByPos<pos>().resize( parent.template getDataByPos<pos>().resize( mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); mesh.template getElements<std::get<pos>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); Alocator<pos + 1, _DataTypes...>::alocateMemory(parent, mesh); Alocator<pos + 1, _DataTypes...>::alocateMemory(parent, mesh); Loading @@ -269,7 +272,7 @@ public: template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent, static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent, MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const _DataType& initialValue, const _DataType& initialValue, const _DataTypes&... values) { const _DataTypes&... values) { parent.template getDataByPos<pos>().resize( parent.template getDataByPos<pos>().resize( Loading @@ -282,7 +285,8 @@ public: template<typename _DataType, typename... _DataTypes> template<typename _DataType, typename... _DataTypes> struct Alocator<sizeof... (Dimensions) - 1, _DataType, _DataTypes...>{ struct Alocator<sizeof... (Dimensions) - 1, _DataType, _DataTypes...>{ template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent ,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent , const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh) { parent.template getDataByPos<sizeof... (Dimensions) - 1>().resize( parent.template getDataByPos<sizeof... (Dimensions) - 1>().resize( mesh.template getElements<std::get<sizeof... (Dimensions) - 1>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); mesh.template getElements<std::get<sizeof... (Dimensions) - 1>(std::array<unsigned int, sizeof... (Dimensions)>{Dimensions...})>().size()); Loading @@ -290,7 +294,7 @@ public: } } template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent, static void alocateMemory(MeshDataContainer<std::tuple<DataTypes...>, Dimensions...>& parent, MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const _DataType& initialValue, const _DataType& initialValue, const _DataTypes&...) { const _DataTypes&...) { Loading Loading @@ -335,12 +339,12 @@ public: } } template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> std::tuple_element_t<dimensionIndex<ElementDim>(), std::tuple<DataTypes...>>& at(MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { std::tuple_element_t<dimensionIndex<ElementDim>(), std::tuple<DataTypes...>>& at(const MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { return getDataByDim<ElementDim>().at(element.getIndex()); return getDataByDim<ElementDim>().at(element.getIndex()); } } template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> template <unsigned int ElementDim, unsigned int Dimension, typename IndexType, typename Real, unsigned int Reserve> std::tuple_element_t<dimensionIndex<ElementDim>(), std::tuple<DataTypes...>>& operator[](MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { std::tuple_element_t<dimensionIndex<ElementDim>(), std::tuple<DataTypes...>>& operator[](const MeshElement<Dimension, ElementDim, IndexType, Real, Reserve>& element) { return getDataByDim<ElementDim>()[element.getIndex()]; return getDataByDim<ElementDim>()[element.getIndex()]; } } Loading @@ -349,25 +353,25 @@ public: MeshDataContainer(){} MeshDataContainer(){} template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ alocateData(mesh); alocateData(mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, MeshDataContainer(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataTypes&... initialValues){ const DataTypes&... initialValues){ alocateData(mesh, initialValues...); alocateData(mesh, initialValues...); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> void alocateData(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ void alocateData(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ Alocator<0, DataTypes...>::alocateMemory(*this, mesh); Alocator<0, DataTypes...>::alocateMemory(*this, mesh); } } template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> void alocateData(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, void alocateData(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh, const DataTypes&... initialValues){ const DataTypes&... initialValues){ Alocator<0, DataTypes...>::alocateMemory(*this, mesh, initialValues...); Alocator<0, DataTypes...>::alocateMemory(*this, mesh, initialValues...); } } Loading
src/UnstructuredMesh/MeshElements/MeshElement.h +30 −7 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ public: elementIndex = index; elementIndex = index; } } IndexType getIndex(){ IndexType getIndex() const { return elementIndex; return elementIndex; } } Loading Loading @@ -65,15 +65,15 @@ class SubelementContainer : public std::array<Subelement<IndexType>, Reserve>{ unsigned int numberOfElements = 0; unsigned int numberOfElements = 0; public: public: unsigned int getNumberOfSubElements(){ unsigned int getNumberOfSubElements() const { return numberOfElements; return numberOfElements; } } unsigned int size() { unsigned int size() const { return numberOfElements; return numberOfElements; } } unsigned int reserve() { unsigned int reserve() const { return Reserve; return Reserve; } } Loading Loading @@ -206,11 +206,11 @@ public: IndexType getVertexAIndex(){ IndexType getVertexAIndex() const { return vertexAIndex; return vertexAIndex; } } IndexType getVertexBIndex(){ IndexType getVertexBIndex() const { return vertexBIndex; return vertexBIndex; } } Loading Loading @@ -250,7 +250,7 @@ public: } } IndexType getBoundaryElementIndex(){ IndexType getBoundaryElementIndex() const { return boundaryElementIndex; return boundaryElementIndex; } } Loading Loading @@ -348,6 +348,29 @@ public: std::vector<Cell>& getBoundaryCells() { std::vector<Cell>& getBoundaryCells() { return BoundaryCells; return BoundaryCells; } } /* * Constant version of getters * */ const std::vector<Vertex>& getVertices() const { return getElements<0>(); } const std::vector<Edge>& getEdges() const { return getElements<1>(); } const std::vector<Face>& getFaces() const { return getElements<Dimension - 1>(); } const std::vector<Cell>& getCells() const { return getElements<Dimension>(); } const std::vector<Cell>& getBoundaryCells() const { return BoundaryCells; } private: private: template<unsigned int Dim, typename Dummy = void> template<unsigned int Dim, typename Dummy = void> Loading
src/UnstructuredMesh/MeshFunctions/CellsDistance.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,7 @@ template <unsigned int Dimension,typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension,typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer<Real, Dimension-1> ComputeCellsDistance(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer<Real, Dimension-1> ComputeCellsDistance(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer<Real, Dimension-1> distances(mesh); MeshDataContainer<Real, Dimension-1> distances(mesh); Loading
src/UnstructuredMesh/MeshFunctions/ComputeCenter.h +35 −30 Original line number Original line Diff line number Diff line Loading @@ -14,20 +14,24 @@ struct _ComputeCenters { template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> static void compute( static void compute( MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ auto& elemCenters = centers.template getDataByDim<dim>(); auto& elemCenters = centers.template getDataByDim<dim>(); auto& subElemCenters = centers.template getDataByDim<dim - 1>(); auto& subElemCenters = centers.template getDataByDim<dim - 1>(); for (IndexType i = 0; i < mesh.template getElements<dim>().size(); i++) { for (IndexType i = 0; i < mesh.template getElements<dim>().size(); i++) { auto& element = mesh.template getElements<dim>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; for(auto& sub : element.getSubelements()){ MeshApply<dim, dim - 1, Dimension>::apply( elemCenters.at(i) += subElemCenters.at(sub.index); i, mesh, [&elemCenters, &subElemCenters, &subElemCnt](IndexType elementIndex, IndexType subelementIndex){ elemCenters.at(elementIndex) += subElemCenters.at(subelementIndex); subElemCnt++; subElemCnt++; } } ); elemCenters.at(i) /= subElemCnt; elemCenters.at(i) /= subElemCnt; } } Loading @@ -44,22 +48,25 @@ struct _ComputeCenters { template <unsigned int Dimension, ComputationMethod Method> template <unsigned int Dimension, ComputationMethod Method> struct _ComputeCenters<Dimension, Dimension, Method>{ struct _ComputeCenters<Dimension, Dimension, Method>{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> static void compute(MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ static void compute(MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ auto& elemCenters = centers.template getDataByDim<Dimension>(); auto& elemCenters = centers.template getDataByDim<Dimension>(); auto& subElemCenters = centers.template getDataByDim<Dimension - 1>(); auto& subElemCenters = centers.template getDataByDim<Dimension - 1>(); for (IndexType i = 0; i < mesh.template getElements<Dimension>().size(); i++) { for (IndexType i = 0; i < mesh.template getElements<Dimension>().size(); i++) { auto& element = mesh.template getElements<Dimension>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; IndexType tmpFaceIndex = element.getBoundaryElementIndex(); MeshApply<Dimension, Dimension - 1, Dimension>::apply( do { i, elemCenters.at(i) += subElemCenters.at(tmpFaceIndex); mesh, [&elemCenters, &subElemCenters, &subElemCnt](IndexType elementIndex, IndexType subelementIndex){ elemCenters.at(elementIndex) += subElemCenters.at(subelementIndex); subElemCnt++; subElemCnt++; tmpFaceIndex = mesh.getFaces()[tmpFaceIndex].getNextBElem(i); } } while (tmpFaceIndex != element.getBoundaryElementIndex()); ); elemCenters.at(i) /= subElemCnt; elemCenters.at(i) /= subElemCnt; } } Loading @@ -72,7 +79,7 @@ struct _ComputeCenters<1, Dimension, Method>{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> static void compute( static void compute( MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>>& centers, MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ std::vector<Vertex<Dimension, Real>>& edgeCenters = centers.template getDataByDim<1>(); std::vector<Vertex<Dimension, Real>>& edgeCenters = centers.template getDataByDim<1>(); Loading @@ -98,40 +105,38 @@ struct _ComputeCenters<2, 3, ComputationMethod::TESSELLATED> { template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> static void compute( static void compute( MakeMeshDataContainer_t<Vertex<3, Real>, make_custom_integer_sequence_t<unsigned int, 1, 3>>& centers, MakeMeshDataContainer_t<Vertex<3, Real>, make_custom_integer_sequence_t<unsigned int, 1, 3>>& centers, MeshElements<3, IndexType, Real, Reserve...>& mesh){ const MeshElements<3, IndexType, Real, Reserve...>& mesh){ DBGMSG("centers computation tessellated"); auto& elemCenters = centers.template getDataByDim<2>(); auto& elemCenters = centers.template getDataByDim<2>(); auto& subElemCenters = centers.template getDataByDim<2 - 1>(); auto& subElemCenters = centers.template getDataByDim<2 - 1>(); for (IndexType i = 0; i < mesh.template getElements<2>().size(); i++) { for (IndexType i = 0; i < mesh.template getElements<2>().size(); i++) { auto& element = mesh.template getElements<2>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; for(auto& sub : element.getSubelements()){ MeshApply<2, 1, 3>::apply(i, mesh,[&](IndexType faceIndex, IndexType edgeIndex){ elemCenters.at(i) += subElemCenters.at(sub.index); elemCenters.at(faceIndex) += subElemCenters.at(edgeIndex); subElemCnt++; subElemCnt++; } }); elemCenters.at(i) /= subElemCnt; } // calculate volume elemCenters.at(i) /= subElemCnt; for (IndexType i = 0; i < mesh.template getElements<2>().size(); i++) { auto& element = mesh.template getElements<2>().at(i); Vertex<3, Real> tempVert = {}; Vertex<3, Real> tempVert = {}; Real surfTotal = 0.0; Real surfTotal = 0.0; for(auto& sub : element.getSubelements()){ MeshApply<2, 1, 3>::apply(i, mesh,[&](IndexType faceIndex, IndexType edgeIndex){ IndexType AI = mesh.getEdges().at(sub.index).getVertexAIndex(); IndexType BI = mesh.getEdges().at(sub.index).getVertexBIndex(); IndexType AI = mesh.getEdges().at(edgeIndex).getVertexAIndex(); std::array<Vertex<3, Real>, 2> v = {elemCenters.at(i) - mesh.getVertices().at(AI), elemCenters.at(i) - mesh.getVertices().at(BI)}; IndexType BI = mesh.getEdges().at(edgeIndex).getVertexBIndex(); std::array<Vertex<3, Real>, 2> v = {elemCenters.at(faceIndex) - mesh.getVertices().at(AI), elemCenters.at(faceIndex) - mesh.getVertices().at(BI)}; std::array<Real, 2> norms; std::array<Real, 2> norms; grammSchmidt<2, 3, IndexType, Real>(v, norms); grammSchmidt<2, 3, IndexType, Real>(v, norms); Real surf = norms.at(0) * 0.5 * norms.at(1); Real surf = norms.at(0) * 0.5 * norms.at(1); tempVert += subElemCenters.at(sub.index) * (surf * (2.0 / 3.0)); tempVert += subElemCenters.at(edgeIndex) * (surf * (2.0 / 3.0)); surfTotal += surf; surfTotal += surf; } }); elemCenters.at(i) = (elemCenters.at(i) / 3.0) + (tempVert / surfTotal); elemCenters.at(i) = (elemCenters.at(i) / 3.0) + (tempVert / surfTotal); } } Loading @@ -144,7 +149,7 @@ struct _ComputeCenters<2, 3, ComputationMethod::TESSELLATED> { template <ComputationMethod Method, unsigned int Dimension,typename IndexType, typename Real, unsigned int ...Reserve> template <ComputationMethod Method, unsigned int Dimension,typename IndexType, typename Real, unsigned int ...Reserve> MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>> MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>> ComputeCenters(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ ComputeCenters(const MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>> centers(mesh); MakeMeshDataContainer_t<Vertex<Dimension, Real>, make_custom_integer_sequence_t<unsigned int, 1, Dimension>> centers(mesh); Loading
src/UnstructuredMesh/MeshFunctions/MeshApply.h +25 −12 Original line number Original line Diff line number Diff line Loading @@ -10,7 +10,7 @@ template <unsigned int CurrentDimension, unsigned int StartDimension, unsigned i struct MeshRun { struct MeshRun { template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType origElementIndex, IndexType origElementIndex, IndexType index, IndexType index, Func fun){ Func fun){ Loading @@ -32,7 +32,7 @@ template <unsigned int StartDimension, unsigned int TargetDimension, unsigned in struct MeshRun<MeshDimension, StartDimension, TargetDimension, MeshDimension, false, Descend> { struct MeshRun<MeshDimension, StartDimension, TargetDimension, MeshDimension, false, Descend> { template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType origElementIndex, IndexType origElementIndex, IndexType index, IndexType index, Func fun){ Func fun){ Loading @@ -55,7 +55,7 @@ template <unsigned int StartDimension, unsigned int TargetDimension, unsigned in struct MeshRun<1, StartDimension, TargetDimension, MeshDimension, false, Descend> { struct MeshRun<1, StartDimension, TargetDimension, MeshDimension, false, Descend> { template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Func, typename IndexType, typename Real, unsigned int ...Reserve> static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType origElementIndex, IndexType origElementIndex, IndexType index, IndexType index, Func fun){ Func fun){ Loading @@ -70,33 +70,46 @@ struct MeshRun<1, StartDimension, TargetDimension, MeshDimension, false, Descend template <unsigned int CurrentDimension,unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension, bool Descend> template <unsigned int CurrentDimension,unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension> struct MeshRun<CurrentDimension, StartDimension, TargetDimension, MeshDimension, true, Descend> { struct MeshRun<CurrentDimension, StartDimension, TargetDimension, MeshDimension, true, true> { template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& , static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& , IndexType origElementIndex, IndexType origElementIndex, IndexType index, IndexType index, Functor fun){ Functor fun){ static_assert (std::is_assignable<std::function<void(IndexType, IndexType)>,Functor>::value, static_assert (std::is_assignable<std::function<void(IndexType, IndexType)>,Functor>::value, "The Functor fun must be a function with void return type and two arguments of IndexType,\ "The Functor fun must be a function with void return type and two arguments of IndexType,\ the first is index of StartDimension element and the second is the index of the TargetDimension element"); the first is index of StartDimension element and the second is the index of the TargetDimension element"); if(Descend){ fun(origElementIndex, index); fun(origElementIndex, index); }else{ fun(index, origElementIndex); } } } }; }; template <unsigned int CurrentDimension,unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension> struct MeshRun<CurrentDimension, StartDimension, TargetDimension, MeshDimension, true, false> { template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> static void run(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& , IndexType origElementIndex, IndexType index, Functor fun){ static_assert (std::is_assignable<std::function<void(IndexType, IndexType)>,Functor>::value, "The Functor fun must be a function with void return type and two arguments of IndexType,\ the first is index of StartDimension element and the second is the index of the TargetDimension element"); fun(index, origElementIndex); } }; template <unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension> template <unsigned int StartDimension, unsigned int TargetDimension, unsigned int MeshDimension> struct MeshApply { struct MeshApply { template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> static void apply(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, static void apply(const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, Functor f) { Functor f) { for (auto& startElement : mesh.template getElements<(StartDimension > TargetDimension) ? StartDimension : TargetDimension>()){ for (auto& startElement : mesh.template getElements<(StartDimension > TargetDimension) ? StartDimension : TargetDimension>()){ MeshRun< MeshRun< Loading @@ -111,7 +124,7 @@ struct MeshApply { template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> template<typename Functor, typename IndexType, typename Real, unsigned int ...Reserve> static void apply(IndexType elementIndex, static void apply(IndexType elementIndex, MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, const MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, Functor f) { Functor f) { MeshRun< MeshRun< (StartDimension > TargetDimension) ? StartDimension : TargetDimension, (StartDimension > TargetDimension) ? StartDimension : TargetDimension, Loading
src/UnstructuredMesh/MeshElements/CellConnection.h +5 −5 File changed.Contains only whitespace changes. Show changes