Loading Unstructured_mesh/MeshElement.h +2 −2 Original line number Diff line number Diff line Loading @@ -102,7 +102,7 @@ public: return this->begin() + getNumberOfSubElements(); } typename std::array<Subelement<IndexType>, Reserve>::const_iterator cend(){ typename std::array<Subelement<IndexType>, Reserve>::const_iterator cend() const { return this->cbegin() + getNumberOfSubElements(); } }; Loading Unstructured_mesh/MeshFunctions.h +40 −1 Original line number Diff line number Diff line Loading @@ -652,6 +652,45 @@ static MeshDataContainer<unsigned int, FromDim> colour( } }; template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::template ElementType<2>& face, typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::Edge& edge ) { Vertex<MeshDimension, Real> AminC = mesh.getVertices().at(edge.getVertexAIndex()) - face.getCenter(); Vertex<MeshDimension, Real> BminC = mesh.getVertices().at(edge.getVertexBIndex()) - face.getCenter(); for (IndexType i = 0; i < MeshDimension; i++){ IndexType ipo = (i+1)%(MeshDimension); IndexType ipt = (i+2)%(MeshDimension); Real res = AminC[ipo]*BminC[ipt]-BminC[ipo]*AminC[ipt]; if ((MeshDimension + i + 1)% 2 == 0) res *= -1; if (abs(res) > 1e-4) { return res > 0; } } throw std::runtime_error("can not determine orientation of edge " + std::to_string(edge.getIndex()) + " wrt face: " + std::to_string(face.getIndex())); } template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType faceIndex, IndexType edgeIndex) { typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::Edge& edge = mesh.getEdges().at(edgeIndex); typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::template ElementType<2>& face = mesh.template getElements<2>().at(faceIndex); return edgeIsLeft(mesh, face, edge); } } Loading Unstructured_mesh/MeshReader.h +8 −0 Original line number Diff line number Diff line Loading @@ -14,5 +14,13 @@ public: using type = MeshNativeType<2>; }; template <typename IndexType, typename Real> class MeshReader<3, IndexType, Real> { public: using type = MeshNativeType<3>; }; #endif // MESHREADER_H Unstructured_mesh/Unstructured_mesh.pro.user +1 −1 Original line number Diff line number Diff line <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> <!-- Written by QtCreator 4.10.0, 2019-10-03T23:49:08. --> <!-- Written by QtCreator 4.10.0, 2019-10-04T18:23:48. --> <qtcreator> <data> <variable>EnvironmentId</variable> Loading Unstructured_mesh/VTKMeshReader.h +7 −4 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ public: mesh.getEdges().at(edgeIndex).setIndex(edgeIndex); mesh.getEdges().at(edgeIndex).setCellLeftIndex(cellIndex); edges[edgeKey] = edgeIndex; } else { edgeIndex = edgeIt->second; mesh.getEdges().at(edgeIt->second).setCellRightIndex(cellIndex); Loading Loading @@ -228,7 +229,7 @@ class VTKMeshReader<3, IndexType, Real, Reserve...> : public MeshReader<3, Index {0,2,1}, {0,4,8,3}, {1,4,7,5}, {3,5,6,3}, {3,5,6,2}, {6,7,8} } } Loading Loading @@ -273,7 +274,6 @@ public: void loadPoints(std::istream& ist, MeshElements<3, IndexType, Real, Reserve...>& mesh){ IndexType numPoints; ist >> numPoints; Real dummy = 0; mesh.getVertices().resize(numPoints); ist.ignore(20, '\n'); for (IndexType vertIndex = 0; vertIndex < numPoints; vertIndex++) { Loading Loading @@ -321,6 +321,7 @@ public: mesh.getEdges().at(edgeIndex).setVertexBIndex(iB); mesh.getEdges().at(edgeIndex).setIndex(edgeIndex); edgeIndexes.push_back({edgeIndex, true}); edges[edgeKey] = edgeIndex; } else { edgeIndexes.push_back({edgeIt->second, iA == mesh.getEdges().at(edgeIt->second).getVertexAIndex()}); } Loading @@ -347,9 +348,10 @@ public: faceIndex = mesh.getFaces().size(); mesh.getFaces().push_back({}); for (int& index : f) { mesh.getFaces().at(faceIndex).addSublement(edgeIndexes.at(index)); mesh.getFaces().at(faceIndex).getSubelements().addSubelement(edgeIndexes.at(index).first,edgeIndexes.at(index).second); } mesh.getFaces().at(faceIndex).setCellLeftIndex(cellIndex); mesh.getFaces().at(faceIndex).setIndex(faceIndex); } else { faceIndex = faceIt->second; mesh.getFaces().at(faceIndex).setCellRightIndex(cellIndex); Loading @@ -362,8 +364,9 @@ public: mesh.getCells().at(cellIndex).setBoundaryElementIndex(faceIndex); } if (fi == faceOrder.size() - 1) { mesh.getEdges().at(faceIndex).setNextBElem(mesh.getCells().at(cellIndex).getBoundaryElementIndex(), cellIndex); mesh.getFaces().at(faceIndex).setNextBElem(mesh.getCells().at(cellIndex).getBoundaryElementIndex(), cellIndex); } faces[faceKey] = faceIndex; prevFaceIndex = faceIndex; } } Loading Loading
Unstructured_mesh/MeshElement.h +2 −2 Original line number Diff line number Diff line Loading @@ -102,7 +102,7 @@ public: return this->begin() + getNumberOfSubElements(); } typename std::array<Subelement<IndexType>, Reserve>::const_iterator cend(){ typename std::array<Subelement<IndexType>, Reserve>::const_iterator cend() const { return this->cbegin() + getNumberOfSubElements(); } }; Loading
Unstructured_mesh/MeshFunctions.h +40 −1 Original line number Diff line number Diff line Loading @@ -652,6 +652,45 @@ static MeshDataContainer<unsigned int, FromDim> colour( } }; template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::template ElementType<2>& face, typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::Edge& edge ) { Vertex<MeshDimension, Real> AminC = mesh.getVertices().at(edge.getVertexAIndex()) - face.getCenter(); Vertex<MeshDimension, Real> BminC = mesh.getVertices().at(edge.getVertexBIndex()) - face.getCenter(); for (IndexType i = 0; i < MeshDimension; i++){ IndexType ipo = (i+1)%(MeshDimension); IndexType ipt = (i+2)%(MeshDimension); Real res = AminC[ipo]*BminC[ipt]-BminC[ipo]*AminC[ipt]; if ((MeshDimension + i + 1)% 2 == 0) res *= -1; if (abs(res) > 1e-4) { return res > 0; } } throw std::runtime_error("can not determine orientation of edge " + std::to_string(edge.getIndex()) + " wrt face: " + std::to_string(face.getIndex())); } template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType faceIndex, IndexType edgeIndex) { typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::Edge& edge = mesh.getEdges().at(edgeIndex); typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::template ElementType<2>& face = mesh.template getElements<2>().at(faceIndex); return edgeIsLeft(mesh, face, edge); } } Loading
Unstructured_mesh/MeshReader.h +8 −0 Original line number Diff line number Diff line Loading @@ -14,5 +14,13 @@ public: using type = MeshNativeType<2>; }; template <typename IndexType, typename Real> class MeshReader<3, IndexType, Real> { public: using type = MeshNativeType<3>; }; #endif // MESHREADER_H
Unstructured_mesh/Unstructured_mesh.pro.user +1 −1 Original line number Diff line number Diff line <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> <!-- Written by QtCreator 4.10.0, 2019-10-03T23:49:08. --> <!-- Written by QtCreator 4.10.0, 2019-10-04T18:23:48. --> <qtcreator> <data> <variable>EnvironmentId</variable> Loading
Unstructured_mesh/VTKMeshReader.h +7 −4 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ public: mesh.getEdges().at(edgeIndex).setIndex(edgeIndex); mesh.getEdges().at(edgeIndex).setCellLeftIndex(cellIndex); edges[edgeKey] = edgeIndex; } else { edgeIndex = edgeIt->second; mesh.getEdges().at(edgeIt->second).setCellRightIndex(cellIndex); Loading Loading @@ -228,7 +229,7 @@ class VTKMeshReader<3, IndexType, Real, Reserve...> : public MeshReader<3, Index {0,2,1}, {0,4,8,3}, {1,4,7,5}, {3,5,6,3}, {3,5,6,2}, {6,7,8} } } Loading Loading @@ -273,7 +274,6 @@ public: void loadPoints(std::istream& ist, MeshElements<3, IndexType, Real, Reserve...>& mesh){ IndexType numPoints; ist >> numPoints; Real dummy = 0; mesh.getVertices().resize(numPoints); ist.ignore(20, '\n'); for (IndexType vertIndex = 0; vertIndex < numPoints; vertIndex++) { Loading Loading @@ -321,6 +321,7 @@ public: mesh.getEdges().at(edgeIndex).setVertexBIndex(iB); mesh.getEdges().at(edgeIndex).setIndex(edgeIndex); edgeIndexes.push_back({edgeIndex, true}); edges[edgeKey] = edgeIndex; } else { edgeIndexes.push_back({edgeIt->second, iA == mesh.getEdges().at(edgeIt->second).getVertexAIndex()}); } Loading @@ -347,9 +348,10 @@ public: faceIndex = mesh.getFaces().size(); mesh.getFaces().push_back({}); for (int& index : f) { mesh.getFaces().at(faceIndex).addSublement(edgeIndexes.at(index)); mesh.getFaces().at(faceIndex).getSubelements().addSubelement(edgeIndexes.at(index).first,edgeIndexes.at(index).second); } mesh.getFaces().at(faceIndex).setCellLeftIndex(cellIndex); mesh.getFaces().at(faceIndex).setIndex(faceIndex); } else { faceIndex = faceIt->second; mesh.getFaces().at(faceIndex).setCellRightIndex(cellIndex); Loading @@ -362,8 +364,9 @@ public: mesh.getCells().at(cellIndex).setBoundaryElementIndex(faceIndex); } if (fi == faceOrder.size() - 1) { mesh.getEdges().at(faceIndex).setNextBElem(mesh.getCells().at(cellIndex).getBoundaryElementIndex(), cellIndex); mesh.getFaces().at(faceIndex).setNextBElem(mesh.getCells().at(cellIndex).getBoundaryElementIndex(), cellIndex); } faces[faceKey] = faceIndex; prevFaceIndex = faceIndex; } } Loading